From 0498194240f55d7f4b12633ad01339fb690621bf Mon Sep 17 00:00:00 2001 From: Alisha Nanda Date: Thu, 12 Dec 2024 16:48:47 -0800 Subject: [PATCH 01/26] Fix lifetime issue with EventEngine endpoint wrapper. Before, we would delete the wrapper in `grpc_take_wrapped_event_engine_endpoint`, which could destroy the wrapper before the refs became zero and lead to use-after-free / illegal instruction / segfault errors if callbacks return after the wrapper is destroyed. Now, we unref the wrapper instead of explicitly deleting it. PiperOrigin-RevId: 705673089 --- src/core/lib/iomgr/event_engine_shims/endpoint.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/lib/iomgr/event_engine_shims/endpoint.cc b/src/core/lib/iomgr/event_engine_shims/endpoint.cc index 5fec956179ec5..c368db6fa0f3e 100644 --- a/src/core/lib/iomgr/event_engine_shims/endpoint.cc +++ b/src/core/lib/iomgr/event_engine_shims/endpoint.cc @@ -443,7 +443,7 @@ std::unique_ptr grpc_take_wrapped_event_engine_endpoint( reinterpret_cast( ep); auto endpoint = eeep->wrapper->ReleaseEndpoint(); - delete eeep->wrapper; + eeep->wrapper->Unref(); return endpoint; } From 782814e28006f132880c0aebbc3d0833d515fa61 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 13 Dec 2024 16:53:17 -0800 Subject: [PATCH 02/26] [chaotic-good] Hide log line behind tracer (#38285) Closes #38285 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38285 from ctiller:bleh 372d415c6be1d1da2ddd67f20693d1c57c4362c7 PiperOrigin-RevId: 706044232 --- src/core/ext/transport/chaotic_good/frame.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/core/ext/transport/chaotic_good/frame.cc b/src/core/ext/transport/chaotic_good/frame.cc index 8504cd7f2afcb..72ca1322e4c8e 100644 --- a/src/core/ext/transport/chaotic_good/frame.cc +++ b/src/core/ext/transport/chaotic_good/frame.cc @@ -120,8 +120,9 @@ struct ClientMetadataEncoder { } void EncodeWithWarning(const Slice& key, const Slice& value) { - LOG_EVERY_N_SEC(INFO, 10) << "encoding known key " << key.as_string_view() - << " with unknown encoding"; + GRPC_TRACE_LOG(chaotic_good, INFO) + << "encoding known key " << key.as_string_view() + << " with unknown encoding"; Encode(key, value); } From b82b79b6301bfe19120f69c593274bbefe937273 Mon Sep 17 00:00:00 2001 From: Xuan Wang Date: Mon, 16 Dec 2024 09:35:22 -0800 Subject: [PATCH 03/26] [Python CSM] Change example to use Helloworld service (#38283) --- examples/python/observability/csm/BUILD.bazel | 28 +++++++++++--- .../observability/csm/csm_greeter_client.py | 15 ++++---- .../observability/csm/csm_greeter_server.py | 32 ++++------------ .../python/observability/csm/helloworld.proto | 38 +++++++++++++++++++ 4 files changed, 75 insertions(+), 38 deletions(-) create mode 100644 examples/python/observability/csm/helloworld.proto diff --git a/examples/python/observability/csm/BUILD.bazel b/examples/python/observability/csm/BUILD.bazel index fa139f2fe09bd..9b6c0ce2ee0b0 100644 --- a/examples/python/observability/csm/BUILD.bazel +++ b/examples/python/observability/csm/BUILD.bazel @@ -14,18 +14,35 @@ load("@grpc_python_dependencies//:requirements.bzl", "requirement") load("@rules_python//python:defs.bzl", "py_binary") +load("@rules_proto//proto:defs.bzl", "proto_library") +load("//bazel:python_rules.bzl", "py_grpc_library", "py_proto_library") # TODO(xuanwn): Instead of using Bazel build, we should pip install all dependencies # once we have a released version of grpcio-csm-observability. +proto_library( + name = "helloworld_proto", + srcs = ["helloworld.proto"], +) + +py_proto_library( + name = "helloworld_py_pb2", + deps = [":helloworld_proto"], +) + +py_grpc_library( + name = "helloworld_py_pb2_grpc", + srcs = [":helloworld_proto"], + deps = [":helloworld_py_pb2"], +) + py_binary( name = "csm_greeter_client", srcs = ["csm_greeter_client.py"], python_version = "PY3", deps = [ - "//src/proto/grpc/testing:py_messages_proto", - "//src/proto/grpc/testing:py_test_proto", - "//src/proto/grpc/testing:test_py_pb2_grpc", + ":helloworld_py_pb2", + ":helloworld_py_pb2_grpc", "//src/python/grpcio/grpc:grpcio", "//src/python/grpcio_csm_observability/grpc_csm_observability:csm_observability", requirement("opentelemetry-exporter-prometheus"), @@ -37,9 +54,8 @@ py_binary( srcs = ["csm_greeter_server.py"], python_version = "PY3", deps = [ - "//src/proto/grpc/testing:py_messages_proto", - "//src/proto/grpc/testing:py_test_proto", - "//src/proto/grpc/testing:test_py_pb2_grpc", + ":helloworld_py_pb2", + ":helloworld_py_pb2_grpc", "//src/python/grpcio/grpc:grpcio", "//src/python/grpcio_csm_observability/grpc_csm_observability:csm_observability", requirement("opentelemetry-exporter-prometheus"), diff --git a/examples/python/observability/csm/csm_greeter_client.py b/examples/python/observability/csm/csm_greeter_client.py index 5fd015a2b9501..f2e200323935b 100644 --- a/examples/python/observability/csm/csm_greeter_client.py +++ b/examples/python/observability/csm/csm_greeter_client.py @@ -25,8 +25,8 @@ from opentelemetry.sdk.metrics import view from prometheus_client import start_http_server -from src.proto.grpc.testing import messages_pb2 -from src.proto.grpc.testing import test_pb2_grpc +from examples.python.observability.csm import helloworld_pb2 +from examples.python.observability.csm import helloworld_pb2_grpc logger = logging.getLogger() console_handler = logging.StreamHandler() @@ -35,7 +35,7 @@ logger.addHandler(console_handler) -def _run(target: int, secure_mode: bool, prometheus_endpoint: int): +def _run(target: str, secure_mode: bool, prometheus_endpoint: int): csm_plugin = _prepare_csm_observability_plugin(prometheus_endpoint) csm_plugin.register_global() if secure_mode: @@ -45,13 +45,14 @@ def _run(target: int, secure_mode: bool, prometheus_endpoint: int): else: channel = grpc.insecure_channel(target) with channel: - stub = test_pb2_grpc.TestServiceStub(channel) + stub = helloworld_pb2_grpc.GreeterStub(channel) # Continuously send RPCs every second. while True: - request = messages_pb2.SimpleRequest() + request = helloworld_pb2.HelloRequest(name="You") logger.info("Sending request to server") try: - stub.UnaryCall(request) + response = stub.SayHello(request) + print(f"Greeter client received: {response.message}") time.sleep(1) except Exception: # pylint: disable=broad-except logger.info( @@ -176,7 +177,7 @@ def bool_arg(arg: str) -> bool: ) parser.add_argument( "--target", - default="xds:///helloworld:50051", + default="localhost:50051", help="The address of the server.", ) parser.add_argument( diff --git a/examples/python/observability/csm/csm_greeter_server.py b/examples/python/observability/csm/csm_greeter_server.py index 3e663abb5a670..3e9458463ed4f 100644 --- a/examples/python/observability/csm/csm_greeter_server.py +++ b/examples/python/observability/csm/csm_greeter_server.py @@ -15,7 +15,6 @@ import argparse from concurrent import futures import logging -import socket from typing import Sequence import grpc @@ -26,8 +25,8 @@ from opentelemetry.sdk.metrics import view from prometheus_client import start_http_server -from src.proto.grpc.testing import messages_pb2 -from src.proto.grpc.testing import test_pb2_grpc +from examples.python.observability.csm import helloworld_pb2 +from examples.python.observability.csm import helloworld_pb2_grpc _LISTEN_HOST = "0.0.0.0" _THREAD_POOL_SIZE = 256 @@ -39,25 +38,10 @@ logger.addHandler(console_handler) -class TestService(test_pb2_grpc.TestServiceServicer): - def __init__(self, server_id, hostname): - self._server_id = server_id - self._hostname = hostname - - def UnaryCall( - self, request: messages_pb2.SimpleRequest, context: grpc.ServicerContext - ) -> messages_pb2.SimpleResponse: - context.send_initial_metadata((("hostname", self._hostname),)) - if request.response_size > 0: - response = messages_pb2.SimpleResponse( - payload=messages_pb2.Payload(body=b"0" * request.response_size) - ) - else: - response = messages_pb2.SimpleResponse() - response.server_id = self._server_id - response.hostname = self._hostname - logger.info("Sending response to client") - return response +class Greeter(helloworld_pb2_grpc.GreeterServicer): + def SayHello(self, request, context): + message = request.name + return helloworld_pb2.HelloReply(message=f"Hello {message}") def _run( @@ -180,9 +164,7 @@ def _create_views() -> Sequence[view.View]: def _configure_test_server( server: grpc.Server, port: int, secure_mode: bool, server_id: str ) -> None: - test_pb2_grpc.add_TestServiceServicer_to_server( - TestService(server_id, socket.gethostname()), server - ) + helloworld_pb2_grpc.add_GreeterServicer_to_server(Greeter(), server) listen_address = f"{_LISTEN_HOST}:{port}" if not secure_mode: server.add_insecure_port(listen_address) diff --git a/examples/python/observability/csm/helloworld.proto b/examples/python/observability/csm/helloworld.proto new file mode 100644 index 0000000000000..9e432c5beab19 --- /dev/null +++ b/examples/python/observability/csm/helloworld.proto @@ -0,0 +1,38 @@ +// 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. + +syntax = "proto3"; + +option java_multiple_files = true; +option java_package = "io.grpc.examples.helloworld"; +option java_outer_classname = "HelloWorldProto"; +option objc_class_prefix = "HLW"; + +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; +} From 62e9e44be849852a6ac7c5b1933b4435b77073dd Mon Sep 17 00:00:00 2001 From: Xuan Wang Date: Mon, 16 Dec 2024 09:35:46 -0800 Subject: [PATCH 04/26] [Python Observability] update observability example (#38272) --- .../python/observability/helloworld_pb2.py | 39 ++++-- .../python/observability/helloworld_pb2.pyi | 14 +- .../observability/helloworld_pb2_grpc.py | 125 +++++++++++++++++- .../python/observability/requirements.txt | 5 +- 4 files changed, 156 insertions(+), 27 deletions(-) diff --git a/examples/python/observability/helloworld_pb2.py b/examples/python/observability/helloworld_pb2.py index f5b4f2d27dce7..5825f5bc86abf 100644 --- a/examples/python/observability/helloworld_pb2.py +++ b/examples/python/observability/helloworld_pb2.py @@ -1,11 +1,22 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE # source: helloworld.proto +# Protobuf Python Version: 5.28.1 """Generated protocol buffer code.""" -from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 28, + 1, + '', + 'helloworld.proto' +) # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() @@ -13,18 +24,18 @@ -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(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') - -_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) -_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'helloworld_pb2', globals()) -if _descriptor._USE_C_DESCRIPTORS == False: +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(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(\t2\xe4\x01\n\x07Greeter\x12>\n\x08SayHello\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x12K\n\x13SayHelloStreamReply\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00\x30\x01\x12L\n\x12SayHelloBidiStream\x12\x18.helloworld.HelloRequest\x1a\x16.helloworld.HelloReply\"\x00(\x01\x30\x01\x42\x36\n\x1bio.grpc.examples.helloworldB\x0fHelloWorldProtoP\x01\xa2\x02\x03HLWb\x06proto3') - DESCRIPTOR._options = None - DESCRIPTOR._serialized_options = b'\n\033io.grpc.examples.helloworldB\017HelloWorldProtoP\001\242\002\003HLW' - _HELLOREQUEST._serialized_start=32 - _HELLOREQUEST._serialized_end=60 - _HELLOREPLY._serialized_start=62 - _HELLOREPLY._serialized_end=91 - _GREETER._serialized_start=93 - _GREETER._serialized_end=166 +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'helloworld_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + _globals['DESCRIPTOR']._loaded_options = None + _globals['DESCRIPTOR']._serialized_options = b'\n\033io.grpc.examples.helloworldB\017HelloWorldProtoP\001\242\002\003HLW' + _globals['_HELLOREQUEST']._serialized_start=32 + _globals['_HELLOREQUEST']._serialized_end=60 + _globals['_HELLOREPLY']._serialized_start=62 + _globals['_HELLOREPLY']._serialized_end=91 + _globals['_GREETER']._serialized_start=94 + _globals['_GREETER']._serialized_end=322 # @@protoc_insertion_point(module_scope) diff --git a/examples/python/observability/helloworld_pb2.pyi b/examples/python/observability/helloworld_pb2.pyi index 8c4b5b22805d9..bf0bd395ad563 100644 --- a/examples/python/observability/helloworld_pb2.pyi +++ b/examples/python/observability/helloworld_pb2.pyi @@ -4,14 +4,14 @@ from typing import ClassVar as _ClassVar, Optional as _Optional DESCRIPTOR: _descriptor.FileDescriptor -class HelloReply(_message.Message): - __slots__ = ["message"] - MESSAGE_FIELD_NUMBER: _ClassVar[int] - message: str - def __init__(self, message: _Optional[str] = ...) -> None: ... - class HelloRequest(_message.Message): - __slots__ = ["name"] + __slots__ = ("name",) NAME_FIELD_NUMBER: _ClassVar[int] name: str def __init__(self, name: _Optional[str] = ...) -> None: ... + +class HelloReply(_message.Message): + __slots__ = ("message",) + MESSAGE_FIELD_NUMBER: _ClassVar[int] + message: str + def __init__(self, message: _Optional[str] = ...) -> None: ... diff --git a/examples/python/observability/helloworld_pb2_grpc.py b/examples/python/observability/helloworld_pb2_grpc.py index 47c186976e1c6..f8497645728a8 100644 --- a/examples/python/observability/helloworld_pb2_grpc.py +++ b/examples/python/observability/helloworld_pb2_grpc.py @@ -1,9 +1,29 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" import grpc +import warnings import helloworld_pb2 as helloworld__pb2 +GRPC_GENERATED_VERSION = '1.68.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in helloworld_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + class GreeterStub(object): """The greeting service definition. @@ -19,7 +39,17 @@ def __init__(self, channel): '/helloworld.Greeter/SayHello', request_serializer=helloworld__pb2.HelloRequest.SerializeToString, response_deserializer=helloworld__pb2.HelloReply.FromString, - ) + _registered_method=True) + self.SayHelloStreamReply = channel.unary_stream( + '/helloworld.Greeter/SayHelloStreamReply', + request_serializer=helloworld__pb2.HelloRequest.SerializeToString, + response_deserializer=helloworld__pb2.HelloReply.FromString, + _registered_method=True) + self.SayHelloBidiStream = channel.stream_stream( + '/helloworld.Greeter/SayHelloBidiStream', + request_serializer=helloworld__pb2.HelloRequest.SerializeToString, + response_deserializer=helloworld__pb2.HelloReply.FromString, + _registered_method=True) class GreeterServicer(object): @@ -33,6 +63,18 @@ def SayHello(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def SayHelloStreamReply(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SayHelloBidiStream(self, request_iterator, context): + """Missing associated documentation comment in .proto file.""" + 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 = { @@ -41,10 +83,21 @@ def add_GreeterServicer_to_server(servicer, server): request_deserializer=helloworld__pb2.HelloRequest.FromString, response_serializer=helloworld__pb2.HelloReply.SerializeToString, ), + 'SayHelloStreamReply': grpc.unary_stream_rpc_method_handler( + servicer.SayHelloStreamReply, + request_deserializer=helloworld__pb2.HelloRequest.FromString, + response_serializer=helloworld__pb2.HelloReply.SerializeToString, + ), + 'SayHelloBidiStream': grpc.stream_stream_rpc_method_handler( + servicer.SayHelloBidiStream, + 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,)) + server.add_registered_method_handlers('helloworld.Greeter', rpc_method_handlers) # This class is part of an EXPERIMENTAL API. @@ -63,8 +116,72 @@ def SayHello(request, wait_for_ready=None, timeout=None, metadata=None): - return grpc.experimental.unary_unary(request, target, '/helloworld.Greeter/SayHello', + return grpc.experimental.unary_unary( + request, + target, + '/helloworld.Greeter/SayHello', + helloworld__pb2.HelloRequest.SerializeToString, + helloworld__pb2.HelloReply.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SayHelloStreamReply(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_stream( + request, + target, + '/helloworld.Greeter/SayHelloStreamReply', + helloworld__pb2.HelloRequest.SerializeToString, + helloworld__pb2.HelloReply.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def SayHelloBidiStream(request_iterator, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.stream_stream( + request_iterator, + target, + '/helloworld.Greeter/SayHelloBidiStream', helloworld__pb2.HelloRequest.SerializeToString, helloworld__pb2.HelloReply.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/examples/python/observability/requirements.txt b/examples/python/observability/requirements.txt index cb2d4d4b90471..d09441d98a10d 100644 --- a/examples/python/observability/requirements.txt +++ b/examples/python/observability/requirements.txt @@ -1,3 +1,4 @@ -grpcio>=1.62.0 -grpcio-observability>=1.62.0 +grpcio>=1.68.0 +grpcio-observability>=1.68.0 +grpcio-tools>=1.68.0 opentelemetry-sdk>=1.21.0 From f502e756334b765c62c63dcd18b9313ae4cc8425 Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Mon, 16 Dec 2024 16:22:57 -0800 Subject: [PATCH 05/26] [BoringSSL] Update third_party/boringssl-with-bazel (#38274) Change was created by the release automation script. See go/grpc-release. Closes #38274 PiperOrigin-RevId: 706869858 --- BoringSSL-Package.swift | 479 ++++---- Makefile | 479 ++++---- bazel/grpc_deps.bzl | 8 +- config.m4 | 485 ++++---- config.w32 | 485 ++++---- gRPC-Core.podspec | 2 +- grpc.gemspec | 646 +++++----- package.xml | 646 +++++----- src/boringssl/boringssl_prefix_symbols.h | 432 ++++++- src/objective-c/BoringSSL-GRPC.podspec | 1092 +++++++++-------- src/python/grpcio/grpc_core_dependencies.py | 494 ++++---- templates/gRPC-Core.podspec.template | 2 +- .../BoringSSL-GRPC.podspec.template | 4 +- third_party/boringssl-with-bazel | 2 +- tools/run_tests/sanity/check_submodules.sh | 2 +- 15 files changed, 2814 insertions(+), 2444 deletions(-) diff --git a/BoringSSL-Package.swift b/BoringSSL-Package.swift index f2e70808d8e07..ea135aad6b1ec 100644 --- a/BoringSSL-Package.swift +++ b/BoringSSL-Package.swift @@ -26,245 +26,248 @@ let package = Package( ], sources: [ - "src/crypto/asn1/a_bitstr.c", - "src/crypto/asn1/a_bool.c", - "src/crypto/asn1/a_d2i_fp.c", - "src/crypto/asn1/a_dup.c", - "src/crypto/asn1/a_gentm.c", - "src/crypto/asn1/a_i2d_fp.c", - "src/crypto/asn1/a_int.c", - "src/crypto/asn1/a_mbstr.c", - "src/crypto/asn1/a_object.c", - "src/crypto/asn1/a_octet.c", - "src/crypto/asn1/a_strex.c", - "src/crypto/asn1/a_strnid.c", - "src/crypto/asn1/a_time.c", - "src/crypto/asn1/a_type.c", - "src/crypto/asn1/a_utctm.c", - "src/crypto/asn1/asn1_lib.c", - "src/crypto/asn1/asn1_par.c", - "src/crypto/asn1/asn_pack.c", - "src/crypto/asn1/f_int.c", - "src/crypto/asn1/f_string.c", - "src/crypto/asn1/posix_time.c", - "src/crypto/asn1/tasn_dec.c", - "src/crypto/asn1/tasn_enc.c", - "src/crypto/asn1/tasn_fre.c", - "src/crypto/asn1/tasn_new.c", - "src/crypto/asn1/tasn_typ.c", - "src/crypto/asn1/tasn_utl.c", - "src/crypto/base64/base64.c", - "src/crypto/bio/bio.c", - "src/crypto/bio/bio_mem.c", - "src/crypto/bio/connect.c", - "src/crypto/bio/errno.c", - "src/crypto/bio/fd.c", - "src/crypto/bio/file.c", - "src/crypto/bio/hexdump.c", - "src/crypto/bio/pair.c", - "src/crypto/bio/printf.c", - "src/crypto/bio/socket.c", - "src/crypto/bio/socket_helper.c", - "src/crypto/blake2/blake2.c", - "src/crypto/bn_extra/bn_asn1.c", - "src/crypto/bn_extra/convert.c", - "src/crypto/buf/buf.c", - "src/crypto/bytestring/asn1_compat.c", - "src/crypto/bytestring/ber.c", - "src/crypto/bytestring/cbb.c", - "src/crypto/bytestring/cbs.c", - "src/crypto/bytestring/unicode.c", - "src/crypto/chacha/chacha.c", - "src/crypto/cipher_extra/cipher_extra.c", - "src/crypto/cipher_extra/derive_key.c", - "src/crypto/cipher_extra/e_aesctrhmac.c", - "src/crypto/cipher_extra/e_aesgcmsiv.c", - "src/crypto/cipher_extra/e_chacha20poly1305.c", - "src/crypto/cipher_extra/e_des.c", - "src/crypto/cipher_extra/e_null.c", - "src/crypto/cipher_extra/e_rc2.c", - "src/crypto/cipher_extra/e_rc4.c", - "src/crypto/cipher_extra/e_tls.c", - "src/crypto/cipher_extra/tls_cbc.c", - "src/crypto/conf/conf.c", - "src/crypto/cpu_aarch64_apple.c", - "src/crypto/cpu_aarch64_fuchsia.c", - "src/crypto/cpu_aarch64_linux.c", - "src/crypto/cpu_aarch64_openbsd.c", - "src/crypto/cpu_aarch64_sysreg.c", - "src/crypto/cpu_aarch64_win.c", - "src/crypto/cpu_arm_freebsd.c", - "src/crypto/cpu_arm_linux.c", - "src/crypto/cpu_intel.c", - "src/crypto/crypto.c", - "src/crypto/curve25519/curve25519.c", - "src/crypto/curve25519/curve25519_64_adx.c", - "src/crypto/curve25519/spake25519.c", - "src/crypto/des/des.c", - "src/crypto/dh_extra/dh_asn1.c", - "src/crypto/dh_extra/params.c", - "src/crypto/digest_extra/digest_extra.c", - "src/crypto/dilithium/dilithium.c", - "src/crypto/dsa/dsa.c", - "src/crypto/dsa/dsa_asn1.c", - "src/crypto/ec_extra/ec_asn1.c", - "src/crypto/ec_extra/ec_derive.c", - "src/crypto/ec_extra/hash_to_curve.c", - "src/crypto/ecdh_extra/ecdh_extra.c", - "src/crypto/ecdsa_extra/ecdsa_asn1.c", - "src/crypto/engine/engine.c", - "src/crypto/err/err.c", - "src/crypto/evp/evp.c", - "src/crypto/evp/evp_asn1.c", - "src/crypto/evp/evp_ctx.c", - "src/crypto/evp/p_dh.c", - "src/crypto/evp/p_dh_asn1.c", - "src/crypto/evp/p_dsa_asn1.c", - "src/crypto/evp/p_ec.c", - "src/crypto/evp/p_ec_asn1.c", - "src/crypto/evp/p_ed25519.c", - "src/crypto/evp/p_ed25519_asn1.c", - "src/crypto/evp/p_hkdf.c", - "src/crypto/evp/p_rsa.c", - "src/crypto/evp/p_rsa_asn1.c", - "src/crypto/evp/p_x25519.c", - "src/crypto/evp/p_x25519_asn1.c", - "src/crypto/evp/pbkdf.c", - "src/crypto/evp/print.c", - "src/crypto/evp/scrypt.c", - "src/crypto/evp/sign.c", - "src/crypto/ex_data.c", - "src/crypto/fipsmodule/bcm.c", - "src/crypto/fipsmodule/fips_shared_support.c", - "src/crypto/hpke/hpke.c", - "src/crypto/hrss/hrss.c", - "src/crypto/keccak/keccak.c", - "src/crypto/kyber/kyber.c", - "src/crypto/lhash/lhash.c", - "src/crypto/mem.c", - "src/crypto/mldsa/mldsa.c", + "src/crypto/asn1/a_bitstr.cc", + "src/crypto/asn1/a_bool.cc", + "src/crypto/asn1/a_d2i_fp.cc", + "src/crypto/asn1/a_dup.cc", + "src/crypto/asn1/a_gentm.cc", + "src/crypto/asn1/a_i2d_fp.cc", + "src/crypto/asn1/a_int.cc", + "src/crypto/asn1/a_mbstr.cc", + "src/crypto/asn1/a_object.cc", + "src/crypto/asn1/a_octet.cc", + "src/crypto/asn1/a_strex.cc", + "src/crypto/asn1/a_strnid.cc", + "src/crypto/asn1/a_time.cc", + "src/crypto/asn1/a_type.cc", + "src/crypto/asn1/a_utctm.cc", + "src/crypto/asn1/asn1_lib.cc", + "src/crypto/asn1/asn1_par.cc", + "src/crypto/asn1/asn_pack.cc", + "src/crypto/asn1/f_int.cc", + "src/crypto/asn1/f_string.cc", + "src/crypto/asn1/posix_time.cc", + "src/crypto/asn1/tasn_dec.cc", + "src/crypto/asn1/tasn_enc.cc", + "src/crypto/asn1/tasn_fre.cc", + "src/crypto/asn1/tasn_new.cc", + "src/crypto/asn1/tasn_typ.cc", + "src/crypto/asn1/tasn_utl.cc", + "src/crypto/base64/base64.cc", + "src/crypto/bio/bio.cc", + "src/crypto/bio/bio_mem.cc", + "src/crypto/bio/connect.cc", + "src/crypto/bio/errno.cc", + "src/crypto/bio/fd.cc", + "src/crypto/bio/file.cc", + "src/crypto/bio/hexdump.cc", + "src/crypto/bio/pair.cc", + "src/crypto/bio/printf.cc", + "src/crypto/bio/socket.cc", + "src/crypto/bio/socket_helper.cc", + "src/crypto/blake2/blake2.cc", + "src/crypto/bn_extra/bn_asn1.cc", + "src/crypto/bn_extra/convert.cc", + "src/crypto/buf/buf.cc", + "src/crypto/bytestring/asn1_compat.cc", + "src/crypto/bytestring/ber.cc", + "src/crypto/bytestring/cbb.cc", + "src/crypto/bytestring/cbs.cc", + "src/crypto/bytestring/unicode.cc", + "src/crypto/chacha/chacha.cc", + "src/crypto/cipher_extra/cipher_extra.cc", + "src/crypto/cipher_extra/derive_key.cc", + "src/crypto/cipher_extra/e_aesctrhmac.cc", + "src/crypto/cipher_extra/e_aesgcmsiv.cc", + "src/crypto/cipher_extra/e_chacha20poly1305.cc", + "src/crypto/cipher_extra/e_des.cc", + "src/crypto/cipher_extra/e_null.cc", + "src/crypto/cipher_extra/e_rc2.cc", + "src/crypto/cipher_extra/e_rc4.cc", + "src/crypto/cipher_extra/e_tls.cc", + "src/crypto/cipher_extra/tls_cbc.cc", + "src/crypto/conf/conf.cc", + "src/crypto/cpu_aarch64_apple.cc", + "src/crypto/cpu_aarch64_fuchsia.cc", + "src/crypto/cpu_aarch64_linux.cc", + "src/crypto/cpu_aarch64_openbsd.cc", + "src/crypto/cpu_aarch64_sysreg.cc", + "src/crypto/cpu_aarch64_win.cc", + "src/crypto/cpu_arm_freebsd.cc", + "src/crypto/cpu_arm_linux.cc", + "src/crypto/cpu_intel.cc", + "src/crypto/crypto.cc", + "src/crypto/curve25519/curve25519.cc", + "src/crypto/curve25519/curve25519_64_adx.cc", + "src/crypto/curve25519/spake25519.cc", + "src/crypto/des/des.cc", + "src/crypto/dh_extra/dh_asn1.cc", + "src/crypto/dh_extra/params.cc", + "src/crypto/digest_extra/digest_extra.cc", + "src/crypto/dsa/dsa.cc", + "src/crypto/dsa/dsa_asn1.cc", + "src/crypto/ec_extra/ec_asn1.cc", + "src/crypto/ec_extra/ec_derive.cc", + "src/crypto/ec_extra/hash_to_curve.cc", + "src/crypto/ecdh_extra/ecdh_extra.cc", + "src/crypto/ecdsa_extra/ecdsa_asn1.cc", + "src/crypto/engine/engine.cc", + "src/crypto/err/err.cc", + "src/crypto/evp/evp.cc", + "src/crypto/evp/evp_asn1.cc", + "src/crypto/evp/evp_ctx.cc", + "src/crypto/evp/p_dh.cc", + "src/crypto/evp/p_dh_asn1.cc", + "src/crypto/evp/p_dsa_asn1.cc", + "src/crypto/evp/p_ec.cc", + "src/crypto/evp/p_ec_asn1.cc", + "src/crypto/evp/p_ed25519.cc", + "src/crypto/evp/p_ed25519_asn1.cc", + "src/crypto/evp/p_hkdf.cc", + "src/crypto/evp/p_rsa.cc", + "src/crypto/evp/p_rsa_asn1.cc", + "src/crypto/evp/p_x25519.cc", + "src/crypto/evp/p_x25519_asn1.cc", + "src/crypto/evp/pbkdf.cc", + "src/crypto/evp/print.cc", + "src/crypto/evp/scrypt.cc", + "src/crypto/evp/sign.cc", + "src/crypto/ex_data.cc", + "src/crypto/fipsmodule/bcm.cc", + "src/crypto/fipsmodule/fips_shared_support.cc", + "src/crypto/hpke/hpke.cc", + "src/crypto/hrss/hrss.cc", + "src/crypto/keccak/keccak.cc", + "src/crypto/kyber/kyber.cc", + "src/crypto/lhash/lhash.cc", + "src/crypto/md4/md4.cc", + "src/crypto/md5/md5.cc", + "src/crypto/mem.cc", + "src/crypto/mldsa/mldsa.cc", "src/crypto/mlkem/mlkem.cc", - "src/crypto/obj/obj.c", - "src/crypto/obj/obj_xref.c", - "src/crypto/pem/pem_all.c", - "src/crypto/pem/pem_info.c", - "src/crypto/pem/pem_lib.c", - "src/crypto/pem/pem_oth.c", - "src/crypto/pem/pem_pk8.c", - "src/crypto/pem/pem_pkey.c", - "src/crypto/pem/pem_x509.c", - "src/crypto/pem/pem_xaux.c", - "src/crypto/pkcs7/pkcs7.c", - "src/crypto/pkcs7/pkcs7_x509.c", - "src/crypto/pkcs8/p5_pbev2.c", - "src/crypto/pkcs8/pkcs8.c", - "src/crypto/pkcs8/pkcs8_x509.c", - "src/crypto/poly1305/poly1305.c", - "src/crypto/poly1305/poly1305_arm.c", - "src/crypto/poly1305/poly1305_vec.c", - "src/crypto/pool/pool.c", - "src/crypto/rand_extra/deterministic.c", - "src/crypto/rand_extra/fork_detect.c", - "src/crypto/rand_extra/forkunsafe.c", - "src/crypto/rand_extra/getentropy.c", - "src/crypto/rand_extra/ios.c", - "src/crypto/rand_extra/passive.c", - "src/crypto/rand_extra/rand_extra.c", - "src/crypto/rand_extra/trusty.c", - "src/crypto/rand_extra/urandom.c", - "src/crypto/rand_extra/windows.c", - "src/crypto/rc4/rc4.c", - "src/crypto/refcount.c", - "src/crypto/rsa_extra/rsa_asn1.c", - "src/crypto/rsa_extra/rsa_crypt.c", - "src/crypto/rsa_extra/rsa_print.c", - "src/crypto/siphash/siphash.c", - "src/crypto/spx/address.c", - "src/crypto/spx/fors.c", - "src/crypto/spx/merkle.c", - "src/crypto/spx/spx.c", - "src/crypto/spx/spx_util.c", - "src/crypto/spx/thash.c", - "src/crypto/spx/wots.c", - "src/crypto/stack/stack.c", - "src/crypto/thread.c", - "src/crypto/thread_none.c", - "src/crypto/thread_pthread.c", - "src/crypto/thread_win.c", - "src/crypto/trust_token/pmbtoken.c", - "src/crypto/trust_token/trust_token.c", - "src/crypto/trust_token/voprf.c", - "src/crypto/x509/a_digest.c", - "src/crypto/x509/a_sign.c", - "src/crypto/x509/a_verify.c", - "src/crypto/x509/algorithm.c", - "src/crypto/x509/asn1_gen.c", - "src/crypto/x509/by_dir.c", - "src/crypto/x509/by_file.c", - "src/crypto/x509/i2d_pr.c", - "src/crypto/x509/name_print.c", - "src/crypto/x509/policy.c", - "src/crypto/x509/rsa_pss.c", - "src/crypto/x509/t_crl.c", - "src/crypto/x509/t_req.c", - "src/crypto/x509/t_x509.c", - "src/crypto/x509/t_x509a.c", - "src/crypto/x509/v3_akey.c", - "src/crypto/x509/v3_akeya.c", - "src/crypto/x509/v3_alt.c", - "src/crypto/x509/v3_bcons.c", - "src/crypto/x509/v3_bitst.c", - "src/crypto/x509/v3_conf.c", - "src/crypto/x509/v3_cpols.c", - "src/crypto/x509/v3_crld.c", - "src/crypto/x509/v3_enum.c", - "src/crypto/x509/v3_extku.c", - "src/crypto/x509/v3_genn.c", - "src/crypto/x509/v3_ia5.c", - "src/crypto/x509/v3_info.c", - "src/crypto/x509/v3_int.c", - "src/crypto/x509/v3_lib.c", - "src/crypto/x509/v3_ncons.c", - "src/crypto/x509/v3_ocsp.c", - "src/crypto/x509/v3_pcons.c", - "src/crypto/x509/v3_pmaps.c", - "src/crypto/x509/v3_prn.c", - "src/crypto/x509/v3_purp.c", - "src/crypto/x509/v3_skey.c", - "src/crypto/x509/v3_utl.c", - "src/crypto/x509/x509.c", - "src/crypto/x509/x509_att.c", - "src/crypto/x509/x509_cmp.c", - "src/crypto/x509/x509_d2.c", - "src/crypto/x509/x509_def.c", - "src/crypto/x509/x509_ext.c", - "src/crypto/x509/x509_lu.c", - "src/crypto/x509/x509_obj.c", - "src/crypto/x509/x509_req.c", - "src/crypto/x509/x509_set.c", - "src/crypto/x509/x509_trs.c", - "src/crypto/x509/x509_txt.c", - "src/crypto/x509/x509_v3.c", - "src/crypto/x509/x509_vfy.c", - "src/crypto/x509/x509_vpm.c", - "src/crypto/x509/x509cset.c", - "src/crypto/x509/x509name.c", - "src/crypto/x509/x509rset.c", - "src/crypto/x509/x509spki.c", - "src/crypto/x509/x_algor.c", - "src/crypto/x509/x_all.c", - "src/crypto/x509/x_attrib.c", - "src/crypto/x509/x_crl.c", - "src/crypto/x509/x_exten.c", - "src/crypto/x509/x_name.c", - "src/crypto/x509/x_pubkey.c", - "src/crypto/x509/x_req.c", - "src/crypto/x509/x_sig.c", - "src/crypto/x509/x_spki.c", - "src/crypto/x509/x_val.c", - "src/crypto/x509/x_x509.c", - "src/crypto/x509/x_x509a.c", - "src/gen/crypto/err_data.c", + "src/crypto/obj/obj.cc", + "src/crypto/obj/obj_xref.cc", + "src/crypto/pem/pem_all.cc", + "src/crypto/pem/pem_info.cc", + "src/crypto/pem/pem_lib.cc", + "src/crypto/pem/pem_oth.cc", + "src/crypto/pem/pem_pk8.cc", + "src/crypto/pem/pem_pkey.cc", + "src/crypto/pem/pem_x509.cc", + "src/crypto/pem/pem_xaux.cc", + "src/crypto/pkcs7/pkcs7.cc", + "src/crypto/pkcs7/pkcs7_x509.cc", + "src/crypto/pkcs8/p5_pbev2.cc", + "src/crypto/pkcs8/pkcs8.cc", + "src/crypto/pkcs8/pkcs8_x509.cc", + "src/crypto/poly1305/poly1305.cc", + "src/crypto/poly1305/poly1305_arm.cc", + "src/crypto/poly1305/poly1305_vec.cc", + "src/crypto/pool/pool.cc", + "src/crypto/rand_extra/deterministic.cc", + "src/crypto/rand_extra/fork_detect.cc", + "src/crypto/rand_extra/forkunsafe.cc", + "src/crypto/rand_extra/getentropy.cc", + "src/crypto/rand_extra/ios.cc", + "src/crypto/rand_extra/passive.cc", + "src/crypto/rand_extra/rand_extra.cc", + "src/crypto/rand_extra/trusty.cc", + "src/crypto/rand_extra/urandom.cc", + "src/crypto/rand_extra/windows.cc", + "src/crypto/rc4/rc4.cc", + "src/crypto/refcount.cc", + "src/crypto/rsa_extra/rsa_asn1.cc", + "src/crypto/rsa_extra/rsa_crypt.cc", + "src/crypto/rsa_extra/rsa_extra.cc", + "src/crypto/rsa_extra/rsa_print.cc", + "src/crypto/sha/sha1.cc", + "src/crypto/sha/sha256.cc", + "src/crypto/sha/sha512.cc", + "src/crypto/siphash/siphash.cc", + "src/crypto/slhdsa/fors.cc", + "src/crypto/slhdsa/merkle.cc", + "src/crypto/slhdsa/slhdsa.cc", + "src/crypto/slhdsa/thash.cc", + "src/crypto/slhdsa/wots.cc", + "src/crypto/stack/stack.cc", + "src/crypto/thread.cc", + "src/crypto/thread_none.cc", + "src/crypto/thread_pthread.cc", + "src/crypto/thread_win.cc", + "src/crypto/trust_token/pmbtoken.cc", + "src/crypto/trust_token/trust_token.cc", + "src/crypto/trust_token/voprf.cc", + "src/crypto/x509/a_digest.cc", + "src/crypto/x509/a_sign.cc", + "src/crypto/x509/a_verify.cc", + "src/crypto/x509/algorithm.cc", + "src/crypto/x509/asn1_gen.cc", + "src/crypto/x509/by_dir.cc", + "src/crypto/x509/by_file.cc", + "src/crypto/x509/i2d_pr.cc", + "src/crypto/x509/name_print.cc", + "src/crypto/x509/policy.cc", + "src/crypto/x509/rsa_pss.cc", + "src/crypto/x509/t_crl.cc", + "src/crypto/x509/t_req.cc", + "src/crypto/x509/t_x509.cc", + "src/crypto/x509/t_x509a.cc", + "src/crypto/x509/v3_akey.cc", + "src/crypto/x509/v3_akeya.cc", + "src/crypto/x509/v3_alt.cc", + "src/crypto/x509/v3_bcons.cc", + "src/crypto/x509/v3_bitst.cc", + "src/crypto/x509/v3_conf.cc", + "src/crypto/x509/v3_cpols.cc", + "src/crypto/x509/v3_crld.cc", + "src/crypto/x509/v3_enum.cc", + "src/crypto/x509/v3_extku.cc", + "src/crypto/x509/v3_genn.cc", + "src/crypto/x509/v3_ia5.cc", + "src/crypto/x509/v3_info.cc", + "src/crypto/x509/v3_int.cc", + "src/crypto/x509/v3_lib.cc", + "src/crypto/x509/v3_ncons.cc", + "src/crypto/x509/v3_ocsp.cc", + "src/crypto/x509/v3_pcons.cc", + "src/crypto/x509/v3_pmaps.cc", + "src/crypto/x509/v3_prn.cc", + "src/crypto/x509/v3_purp.cc", + "src/crypto/x509/v3_skey.cc", + "src/crypto/x509/v3_utl.cc", + "src/crypto/x509/x509.cc", + "src/crypto/x509/x509_att.cc", + "src/crypto/x509/x509_cmp.cc", + "src/crypto/x509/x509_d2.cc", + "src/crypto/x509/x509_def.cc", + "src/crypto/x509/x509_ext.cc", + "src/crypto/x509/x509_lu.cc", + "src/crypto/x509/x509_obj.cc", + "src/crypto/x509/x509_req.cc", + "src/crypto/x509/x509_set.cc", + "src/crypto/x509/x509_trs.cc", + "src/crypto/x509/x509_txt.cc", + "src/crypto/x509/x509_v3.cc", + "src/crypto/x509/x509_vfy.cc", + "src/crypto/x509/x509_vpm.cc", + "src/crypto/x509/x509cset.cc", + "src/crypto/x509/x509name.cc", + "src/crypto/x509/x509rset.cc", + "src/crypto/x509/x509spki.cc", + "src/crypto/x509/x_algor.cc", + "src/crypto/x509/x_all.cc", + "src/crypto/x509/x_attrib.cc", + "src/crypto/x509/x_crl.cc", + "src/crypto/x509/x_exten.cc", + "src/crypto/x509/x_name.cc", + "src/crypto/x509/x_pubkey.cc", + "src/crypto/x509/x_req.cc", + "src/crypto/x509/x_sig.cc", + "src/crypto/x509/x_spki.cc", + "src/crypto/x509/x_val.cc", + "src/crypto/x509/x_x509.cc", + "src/crypto/x509/x_x509a.cc", + "src/gen/crypto/err_data.cc", "src/ssl/bio_ssl.cc", "src/ssl/d1_both.cc", "src/ssl/d1_lib.cc", diff --git a/Makefile b/Makefile index 3d95beed8f506..b36e2d8328248 100644 --- a/Makefile +++ b/Makefile @@ -1881,245 +1881,248 @@ endif # deps: [] # transitive_deps: [] LIBBORINGSSL_SRC = \ - 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_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_strex.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/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_int.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/posix_time.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/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/errno.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/blake2/blake2.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_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_des.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/conf/conf.c \ - third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.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_aarch64_openbsd.c \ - third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_sysreg.c \ - third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_win.c \ - third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.c \ - third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.c \ - third_party/boringssl-with-bazel/src/crypto/cpu_intel.c \ - third_party/boringssl-with-bazel/src/crypto/crypto.c \ - third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c \ - third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_64_adx.c \ - third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c \ - third_party/boringssl-with-bazel/src/crypto/des/des.c \ - third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c \ - third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c \ - third_party/boringssl-with-bazel/src/crypto/dilithium/dilithium.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/ec_extra/hash_to_curve.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/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_dh.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_dh_asn1.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_hkdf.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/hpke/hpke.c \ - third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c \ - third_party/boringssl-with-bazel/src/crypto/keccak/keccak.c \ - third_party/boringssl-with-bazel/src/crypto/kyber/kyber.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/mldsa/mldsa.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_int.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_object.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_strex.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_time.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_type.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_int.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_string.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/posix_time.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.cc \ + third_party/boringssl-with-bazel/src/crypto/base64/base64.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/bio.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/connect.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/errno.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/fd.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/file.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/hexdump.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/pair.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/printf.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/socket.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.cc \ + third_party/boringssl-with-bazel/src/crypto/blake2/blake2.cc \ + third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.cc \ + third_party/boringssl-with-bazel/src/crypto/buf/buf.cc \ + third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.cc \ + third_party/boringssl-with-bazel/src/crypto/bytestring/ber.cc \ + third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.cc \ + third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.cc \ + third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.cc \ + third_party/boringssl-with-bazel/src/crypto/chacha/chacha.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_des.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.cc \ + third_party/boringssl-with-bazel/src/crypto/conf/conf.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_fuchsia.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_linux.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_openbsd.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_sysreg.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_win.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_intel.cc \ + third_party/boringssl-with-bazel/src/crypto/crypto.cc \ + third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.cc \ + third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_64_adx.cc \ + third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.cc \ + third_party/boringssl-with-bazel/src/crypto/des/des.cc \ + third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/dh_extra/params.cc \ + third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.cc \ + third_party/boringssl-with-bazel/src/crypto/dsa/dsa.cc \ + third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.cc \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.cc \ + third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.cc \ + third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/engine/engine.cc \ + third_party/boringssl-with-bazel/src/crypto/err/err.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/evp.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_dh.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_dh_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ec.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_hkdf.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/print.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/scrypt.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/sign.cc \ + third_party/boringssl-with-bazel/src/crypto/ex_data.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.cc \ + third_party/boringssl-with-bazel/src/crypto/hpke/hpke.cc \ + third_party/boringssl-with-bazel/src/crypto/hrss/hrss.cc \ + third_party/boringssl-with-bazel/src/crypto/keccak/keccak.cc \ + third_party/boringssl-with-bazel/src/crypto/kyber/kyber.cc \ + third_party/boringssl-with-bazel/src/crypto/lhash/lhash.cc \ + third_party/boringssl-with-bazel/src/crypto/md4/md4.cc \ + third_party/boringssl-with-bazel/src/crypto/md5/md5.cc \ + third_party/boringssl-with-bazel/src/crypto/mem.cc \ + third_party/boringssl-with-bazel/src/crypto/mldsa/mldsa.cc \ third_party/boringssl-with-bazel/src/crypto/mlkem/mlkem.cc \ - 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/fork_detect.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/getentropy.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/ios.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/trusty.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/urandom.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.c \ - third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.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/spx/address.c \ - third_party/boringssl-with-bazel/src/crypto/spx/fors.c \ - third_party/boringssl-with-bazel/src/crypto/spx/merkle.c \ - third_party/boringssl-with-bazel/src/crypto/spx/spx.c \ - third_party/boringssl-with-bazel/src/crypto/spx/spx_util.c \ - third_party/boringssl-with-bazel/src/crypto/spx/thash.c \ - third_party/boringssl-with-bazel/src/crypto/spx/wots.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/trust_token/pmbtoken.c \ - third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c \ - third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.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_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/name_print.c \ - third_party/boringssl-with-bazel/src/crypto/x509/policy.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/v3_akey.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_akeya.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_alt.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_bcons.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_bitst.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_conf.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_cpols.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_crld.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_enum.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_extku.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_genn.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_ia5.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_info.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_int.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_lib.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_ncons.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_ocsp.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_pcons.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_pmaps.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_prn.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_purp.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_skey.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.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_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_name.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/gen/crypto/err_data.c \ + third_party/boringssl-with-bazel/src/crypto/obj/obj.cc \ + third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_all.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_info.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.cc \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.cc \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.cc \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.cc \ + third_party/boringssl-with-bazel/src/crypto/pool/pool.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/fork_detect.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/getentropy.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/ios.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/trusty.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/urandom.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.cc \ + third_party/boringssl-with-bazel/src/crypto/rc4/rc4.cc \ + third_party/boringssl-with-bazel/src/crypto/refcount.cc \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.cc \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_extra.cc \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.cc \ + third_party/boringssl-with-bazel/src/crypto/sha/sha1.cc \ + third_party/boringssl-with-bazel/src/crypto/sha/sha256.cc \ + third_party/boringssl-with-bazel/src/crypto/sha/sha512.cc \ + third_party/boringssl-with-bazel/src/crypto/siphash/siphash.cc \ + third_party/boringssl-with-bazel/src/crypto/slhdsa/fors.cc \ + third_party/boringssl-with-bazel/src/crypto/slhdsa/merkle.cc \ + third_party/boringssl-with-bazel/src/crypto/slhdsa/slhdsa.cc \ + third_party/boringssl-with-bazel/src/crypto/slhdsa/thash.cc \ + third_party/boringssl-with-bazel/src/crypto/slhdsa/wots.cc \ + third_party/boringssl-with-bazel/src/crypto/stack/stack.cc \ + third_party/boringssl-with-bazel/src/crypto/thread.cc \ + third_party/boringssl-with-bazel/src/crypto/thread_none.cc \ + third_party/boringssl-with-bazel/src/crypto/thread_pthread.cc \ + third_party/boringssl-with-bazel/src/crypto/thread_win.cc \ + third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.cc \ + third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.cc \ + third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/a_digest.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/a_sign.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/a_verify.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/algorithm.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/by_dir.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/by_file.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/name_print.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/policy.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/t_crl.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/t_req.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/t_x509.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_akey.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_akeya.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_alt.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_bcons.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_bitst.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_conf.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_cpols.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_crld.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_enum.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_extku.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_genn.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_ia5.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_info.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_int.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_lib.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_ncons.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_ocsp.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_pcons.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_pmaps.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_prn.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_purp.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_skey.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_att.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_def.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_req.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_set.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509cset.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509name.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509rset.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509spki.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_algor.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_all.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_crl.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_exten.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_name.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_req.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_sig.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_spki.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_val.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_x509.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.cc \ + third_party/boringssl-with-bazel/src/gen/crypto/err_data.cc \ 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 \ diff --git a/bazel/grpc_deps.bzl b/bazel/grpc_deps.bzl index 014c8430dee84..71fba238ec523 100644 --- a/bazel/grpc_deps.bzl +++ b/bazel/grpc_deps.bzl @@ -35,11 +35,11 @@ def grpc_deps(): name = "boringssl", # Use github mirror instead of https://boringssl.googlesource.com/boringssl # to obtain a boringssl archive with consistent sha256 - sha256 = "c70d519e4ee709b7a74410a5e3a937428b8198d793a3d771be3dd2086ae167c8", - strip_prefix = "boringssl-b8b3e6e11166719a8ebfa43c0cde9ad7d57a84f6", + sha256 = "2f12c33d2cf25a658a1b981fb96923dac87e9175fb20e45db6950ee36c526356", + strip_prefix = "boringssl-dec0d8f681348af8bb675e07bd89989665fca8bc", urls = [ - "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/boringssl/archive/b8b3e6e11166719a8ebfa43c0cde9ad7d57a84f6.tar.gz", - "https://github.com/google/boringssl/archive/b8b3e6e11166719a8ebfa43c0cde9ad7d57a84f6.tar.gz", + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/google/boringssl/archive/dec0d8f681348af8bb675e07bd89989665fca8bc.tar.gz", + "https://github.com/google/boringssl/archive/dec0d8f681348af8bb675e07bd89989665fca8bc.tar.gz", ], ) diff --git a/config.m4 b/config.m4 index bbd39a43c0843..ef92b98dcf589 100644 --- a/config.m4 +++ b/config.m4 @@ -1055,245 +1055,248 @@ if test "$PHP_GRPC" != "no"; then 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/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_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_strex.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/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_int.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c \ - third_party/boringssl-with-bazel/src/crypto/asn1/posix_time.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/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/errno.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/blake2/blake2.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_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_des.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/conf/conf.c \ - third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.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_aarch64_openbsd.c \ - third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_sysreg.c \ - third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_win.c \ - third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.c \ - third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.c \ - third_party/boringssl-with-bazel/src/crypto/cpu_intel.c \ - third_party/boringssl-with-bazel/src/crypto/crypto.c \ - third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c \ - third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_64_adx.c \ - third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c \ - third_party/boringssl-with-bazel/src/crypto/des/des.c \ - third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c \ - third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c \ - third_party/boringssl-with-bazel/src/crypto/dilithium/dilithium.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/ec_extra/hash_to_curve.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/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_dh.c \ - third_party/boringssl-with-bazel/src/crypto/evp/p_dh_asn1.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_hkdf.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/hpke/hpke.c \ - third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c \ - third_party/boringssl-with-bazel/src/crypto/keccak/keccak.c \ - third_party/boringssl-with-bazel/src/crypto/kyber/kyber.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/mldsa/mldsa.c \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_int.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_object.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_strex.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_time.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_type.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_int.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/f_string.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/posix_time.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.cc \ + third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.cc \ + third_party/boringssl-with-bazel/src/crypto/base64/base64.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/bio.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/connect.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/errno.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/fd.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/file.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/hexdump.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/pair.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/printf.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/socket.cc \ + third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.cc \ + third_party/boringssl-with-bazel/src/crypto/blake2/blake2.cc \ + third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.cc \ + third_party/boringssl-with-bazel/src/crypto/buf/buf.cc \ + third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.cc \ + third_party/boringssl-with-bazel/src/crypto/bytestring/ber.cc \ + third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.cc \ + third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.cc \ + third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.cc \ + third_party/boringssl-with-bazel/src/crypto/chacha/chacha.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_des.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.cc \ + third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.cc \ + third_party/boringssl-with-bazel/src/crypto/conf/conf.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_fuchsia.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_linux.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_openbsd.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_sysreg.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_win.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.cc \ + third_party/boringssl-with-bazel/src/crypto/cpu_intel.cc \ + third_party/boringssl-with-bazel/src/crypto/crypto.cc \ + third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.cc \ + third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_64_adx.cc \ + third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.cc \ + third_party/boringssl-with-bazel/src/crypto/des/des.cc \ + third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/dh_extra/params.cc \ + third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.cc \ + third_party/boringssl-with-bazel/src/crypto/dsa/dsa.cc \ + third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.cc \ + third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.cc \ + third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.cc \ + third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/engine/engine.cc \ + third_party/boringssl-with-bazel/src/crypto/err/err.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/evp.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_dh.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_dh_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ec.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_hkdf.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/print.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/scrypt.cc \ + third_party/boringssl-with-bazel/src/crypto/evp/sign.cc \ + third_party/boringssl-with-bazel/src/crypto/ex_data.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.cc \ + third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.cc \ + third_party/boringssl-with-bazel/src/crypto/hpke/hpke.cc \ + third_party/boringssl-with-bazel/src/crypto/hrss/hrss.cc \ + third_party/boringssl-with-bazel/src/crypto/keccak/keccak.cc \ + third_party/boringssl-with-bazel/src/crypto/kyber/kyber.cc \ + third_party/boringssl-with-bazel/src/crypto/lhash/lhash.cc \ + third_party/boringssl-with-bazel/src/crypto/md4/md4.cc \ + third_party/boringssl-with-bazel/src/crypto/md5/md5.cc \ + third_party/boringssl-with-bazel/src/crypto/mem.cc \ + third_party/boringssl-with-bazel/src/crypto/mldsa/mldsa.cc \ third_party/boringssl-with-bazel/src/crypto/mlkem/mlkem.cc \ - 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/fork_detect.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/getentropy.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/ios.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/trusty.c \ - third_party/boringssl-with-bazel/src/crypto/rand_extra/urandom.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.c \ - third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c \ - third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.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/spx/address.c \ - third_party/boringssl-with-bazel/src/crypto/spx/fors.c \ - third_party/boringssl-with-bazel/src/crypto/spx/merkle.c \ - third_party/boringssl-with-bazel/src/crypto/spx/spx.c \ - third_party/boringssl-with-bazel/src/crypto/spx/spx_util.c \ - third_party/boringssl-with-bazel/src/crypto/spx/thash.c \ - third_party/boringssl-with-bazel/src/crypto/spx/wots.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/trust_token/pmbtoken.c \ - third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c \ - third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.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_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/name_print.c \ - third_party/boringssl-with-bazel/src/crypto/x509/policy.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/v3_akey.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_akeya.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_alt.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_bcons.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_bitst.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_conf.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_cpols.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_crld.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_enum.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_extku.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_genn.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_ia5.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_info.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_int.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_lib.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_ncons.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_ocsp.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_pcons.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_pmaps.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_prn.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_purp.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_skey.c \ - third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.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_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_name.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/gen/crypto/err_data.c \ + third_party/boringssl-with-bazel/src/crypto/obj/obj.cc \ + third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_all.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_info.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.cc \ + third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.cc \ + third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.cc \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.cc \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.cc \ + third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.cc \ + third_party/boringssl-with-bazel/src/crypto/pool/pool.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/fork_detect.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/getentropy.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/ios.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/trusty.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/urandom.cc \ + third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.cc \ + third_party/boringssl-with-bazel/src/crypto/rc4/rc4.cc \ + third_party/boringssl-with-bazel/src/crypto/refcount.cc \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.cc \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.cc \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_extra.cc \ + third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.cc \ + third_party/boringssl-with-bazel/src/crypto/sha/sha1.cc \ + third_party/boringssl-with-bazel/src/crypto/sha/sha256.cc \ + third_party/boringssl-with-bazel/src/crypto/sha/sha512.cc \ + third_party/boringssl-with-bazel/src/crypto/siphash/siphash.cc \ + third_party/boringssl-with-bazel/src/crypto/slhdsa/fors.cc \ + third_party/boringssl-with-bazel/src/crypto/slhdsa/merkle.cc \ + third_party/boringssl-with-bazel/src/crypto/slhdsa/slhdsa.cc \ + third_party/boringssl-with-bazel/src/crypto/slhdsa/thash.cc \ + third_party/boringssl-with-bazel/src/crypto/slhdsa/wots.cc \ + third_party/boringssl-with-bazel/src/crypto/stack/stack.cc \ + third_party/boringssl-with-bazel/src/crypto/thread.cc \ + third_party/boringssl-with-bazel/src/crypto/thread_none.cc \ + third_party/boringssl-with-bazel/src/crypto/thread_pthread.cc \ + third_party/boringssl-with-bazel/src/crypto/thread_win.cc \ + third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.cc \ + third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.cc \ + third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/a_digest.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/a_sign.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/a_verify.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/algorithm.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/by_dir.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/by_file.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/name_print.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/policy.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/t_crl.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/t_req.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/t_x509.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_akey.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_akeya.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_alt.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_bcons.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_bitst.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_conf.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_cpols.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_crld.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_enum.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_extku.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_genn.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_ia5.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_info.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_int.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_lib.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_ncons.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_ocsp.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_pcons.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_pmaps.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_prn.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_purp.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_skey.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_att.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_def.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_req.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_set.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509cset.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509name.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509rset.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x509spki.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_algor.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_all.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_crl.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_exten.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_name.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_req.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_sig.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_spki.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_val.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_x509.cc \ + third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.cc \ + third_party/boringssl-with-bazel/src/gen/crypto/err_data.cc \ 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 \ @@ -1680,7 +1683,6 @@ if test "$PHP_GRPC" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/des) PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/dh_extra) 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/dilithium) 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) @@ -1694,6 +1696,8 @@ if test "$PHP_GRPC" != "no"; then PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/keccak) PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/kyber) 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/md4) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/md5) PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/mldsa) PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/mlkem) PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/obj) @@ -1705,8 +1709,9 @@ if test "$PHP_GRPC" != "no"; then 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/sha) 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/spx) + PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/slhdsa) 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/trust_token) PHP_ADD_BUILD_DIR($ext_builddir/third_party/boringssl-with-bazel/src/crypto/x509) diff --git a/config.w32 b/config.w32 index 7b024a45e6355..4cae9cb97e62e 100644 --- a/config.w32 +++ b/config.w32 @@ -1020,245 +1020,248 @@ if (PHP_GRPC != "no") { "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\\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_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_strex.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\\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_int.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\f_string.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\posix_time.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\\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\\errno.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\\blake2\\blake2.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_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_des.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\\conf\\conf.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_aarch64_apple.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_aarch64_openbsd.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_aarch64_sysreg.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_aarch64_win.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_arm_freebsd.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_arm_linux.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_intel.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\crypto.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\curve25519\\curve25519.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\curve25519\\curve25519_64_adx.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\curve25519\\spake25519.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\des\\des.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\dh_extra\\dh_asn1.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\dh_extra\\params.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\digest_extra\\digest_extra.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\dilithium\\dilithium.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\\ec_extra\\hash_to_curve.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\\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_dh.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_dh_asn1.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_hkdf.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\\hpke\\hpke.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\hrss\\hrss.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\keccak\\keccak.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\kyber\\kyber.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\\mldsa\\mldsa.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_bitstr.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_bool.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_d2i_fp.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_dup.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_gentm.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_i2d_fp.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_int.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_mbstr.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_object.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_octet.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_strex.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_strnid.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_time.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_type.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\a_utctm.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\asn1_lib.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\asn1_par.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\asn_pack.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\f_int.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\f_string.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\posix_time.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_dec.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_enc.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_fre.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_new.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_typ.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\asn1\\tasn_utl.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\base64\\base64.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\bio.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\bio_mem.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\connect.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\errno.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\fd.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\file.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\hexdump.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\pair.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\printf.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\socket.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bio\\socket_helper.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\blake2\\blake2.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bn_extra\\bn_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bn_extra\\convert.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\buf\\buf.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\asn1_compat.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\ber.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\cbb.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\cbs.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\bytestring\\unicode.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\chacha\\chacha.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\cipher_extra.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\derive_key.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_aesctrhmac.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_aesgcmsiv.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_chacha20poly1305.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_des.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_null.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_rc2.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_rc4.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\e_tls.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cipher_extra\\tls_cbc.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\conf\\conf.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_aarch64_apple.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_aarch64_fuchsia.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_aarch64_linux.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_aarch64_openbsd.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_aarch64_sysreg.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_aarch64_win.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_arm_freebsd.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_arm_linux.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\cpu_intel.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\crypto.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\curve25519\\curve25519.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\curve25519\\curve25519_64_adx.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\curve25519\\spake25519.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\des\\des.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dh_extra\\dh_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dh_extra\\params.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\digest_extra\\digest_extra.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dsa\\dsa.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\dsa\\dsa_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ec_extra\\ec_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ec_extra\\ec_derive.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ec_extra\\hash_to_curve.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ecdh_extra\\ecdh_extra.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ecdsa_extra\\ecdsa_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\engine\\engine.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\err\\err.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\evp_ctx.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_dh.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_dh_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_dsa_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ec.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ec_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ed25519.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_ed25519_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_hkdf.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_rsa.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_rsa_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_x25519.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\p_x25519_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\pbkdf.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\print.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\scrypt.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\evp\\sign.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\ex_data.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\fipsmodule\\bcm.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\fipsmodule\\fips_shared_support.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\hpke\\hpke.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\hrss\\hrss.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\keccak\\keccak.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\kyber\\kyber.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\lhash\\lhash.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\md4\\md4.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\md5\\md5.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\mem.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\mldsa\\mldsa.cc " + "third_party\\boringssl-with-bazel\\src\\crypto\\mlkem\\mlkem.cc " + - "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\\fork_detect.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\forkunsafe.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\getentropy.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\ios.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\passive.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\rand_extra.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\trusty.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\urandom.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.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra\\rsa_asn1.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra\\rsa_crypt.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\\spx\\address.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\spx\\fors.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\spx\\merkle.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\spx\\spx.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\spx\\spx_util.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\spx\\thash.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\spx\\wots.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\\trust_token\\pmbtoken.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\trust_token\\trust_token.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\trust_token\\voprf.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_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\\name_print.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\policy.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\\v3_akey.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_akeya.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_alt.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_bcons.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_bitst.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_conf.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_cpols.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_crld.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_enum.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_extku.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_genn.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_ia5.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_info.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_int.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_lib.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_ncons.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_ocsp.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_pcons.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_pmaps.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_prn.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_purp.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_skey.c " + - "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_utl.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_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_name.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\\gen\\crypto\\err_data.c " + + "third_party\\boringssl-with-bazel\\src\\crypto\\obj\\obj.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\obj\\obj_xref.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_all.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_info.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_lib.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_oth.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_pk8.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_pkey.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_x509.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pem\\pem_xaux.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs7\\pkcs7.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs7\\pkcs7_x509.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8\\p5_pbev2.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8\\pkcs8.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pkcs8\\pkcs8_x509.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\poly1305\\poly1305.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\poly1305\\poly1305_arm.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\poly1305\\poly1305_vec.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\pool\\pool.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\deterministic.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\fork_detect.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\forkunsafe.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\getentropy.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\ios.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\passive.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\rand_extra.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\trusty.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\urandom.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rand_extra\\windows.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rc4\\rc4.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\refcount.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra\\rsa_asn1.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra\\rsa_crypt.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra\\rsa_extra.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\rsa_extra\\rsa_print.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\sha\\sha1.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\sha\\sha256.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\sha\\sha512.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\siphash\\siphash.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\slhdsa\\fors.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\slhdsa\\merkle.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\slhdsa\\slhdsa.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\slhdsa\\thash.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\slhdsa\\wots.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\stack\\stack.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\thread.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\thread_none.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\thread_pthread.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\thread_win.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\trust_token\\pmbtoken.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\trust_token\\trust_token.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\trust_token\\voprf.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_digest.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_sign.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\a_verify.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\algorithm.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\asn1_gen.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\by_dir.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\by_file.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\i2d_pr.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\name_print.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\policy.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\rsa_pss.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_crl.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_req.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_x509.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\t_x509a.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_akey.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_akeya.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_alt.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_bcons.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_bitst.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_conf.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_cpols.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_crld.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_enum.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_extku.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_genn.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_ia5.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_info.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_int.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_lib.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_ncons.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_ocsp.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_pcons.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_pmaps.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_prn.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_purp.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_skey.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\v3_utl.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_att.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_cmp.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_d2.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_def.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_ext.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_lu.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_obj.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_req.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_set.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_trs.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_txt.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_v3.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_vfy.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509_vpm.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509cset.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509name.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509rset.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x509spki.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_algor.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_all.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_attrib.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_crl.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_exten.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_name.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_pubkey.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_req.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_sig.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_spki.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_val.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_x509.cc " + + "third_party\\boringssl-with-bazel\\src\\crypto\\x509\\x_x509a.cc " + + "third_party\\boringssl-with-bazel\\src\\gen\\crypto\\err_data.cc " + "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 " + @@ -1837,7 +1840,6 @@ if (PHP_GRPC != "no") { FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\des"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\dh_extra"); 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\\dilithium"); 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"); @@ -1851,6 +1853,8 @@ if (PHP_GRPC != "no") { FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\keccak"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\kyber"); 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\\md4"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\md5"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\mldsa"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\mlkem"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\obj"); @@ -1862,8 +1866,9 @@ if (PHP_GRPC != "no") { 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\\sha"); 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\\spx"); + FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\slhdsa"); 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\\trust_token"); FSO.CreateFolder(base_dir+"\\ext\\grpc\\third_party\\boringssl-with-bazel\\src\\crypto\\x509"); diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index 3a1bfd409e574..da8de47e479c1 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -200,7 +200,7 @@ Pod::Spec.new do |s| ss.libraries = 'z' ss.dependency "#{s.name}/Interface", version ss.dependency "#{s.name}/Privacy", version - ss.dependency 'BoringSSL-GRPC', '0.0.37' + ss.dependency 'BoringSSL-GRPC', '0.0.38' ss.dependency 'abseil/algorithm/container', abseil_version ss.dependency 'abseil/base/base', abseil_version ss.dependency 'abseil/base/config', abseil_version diff --git a/grpc.gemspec b/grpc.gemspec index 481d59c81cd72..8118b51708df7 100644 --- a/grpc.gemspec +++ b/grpc.gemspec @@ -2517,382 +2517,382 @@ Gem::Specification.new do |s| 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/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_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_strex.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/asn1_lib.c ) - 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_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/a_bitstr.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_int.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_object.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_strex.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_time.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_type.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/f_int.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/f_string.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/posix_time.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/base64/base64.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/posix_time.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/base64/base64.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/bcm_support.h ) - 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/errno.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/bio.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/connect.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/errno.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/fd.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/file.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/hexdump.cc ) 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/blake2/blake2.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/bio/pair.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/printf.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/socket.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/blake2/blake2.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/buf/buf.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/ber.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.cc ) 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/bytestring/unicode.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/chacha/chacha.cc ) 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_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_des.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/cipher_extra.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_des.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.cc ) 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/conf/conf.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/conf/conf.cc ) 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_apple.c ) - 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_aarch64_openbsd.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_sysreg.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_win.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.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_aarch64_apple.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_fuchsia.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_linux.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_openbsd.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_sysreg.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_win.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.cc ) 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_intel.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/crypto.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_64_adx.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/cpu_intel.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/crypto.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_64_adx.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/des/des.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/des/des.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/des/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh_extra/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/dilithium/dilithium.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/dilithium/internal.h ) - 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/dh_extra/dh_asn1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dh_extra/params.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dsa/dsa.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/dsa/internal.h ) - 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/ec_extra/hash_to_curve.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h ) - 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/ecdh_extra/ecdh_extra.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/engine/engine.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/err/err.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/err/internal.h ) - 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/evp.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.cc ) 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_dh.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_dh_asn1.c ) - 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_hkdf.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.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_dh.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_dh_asn1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ec.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_hkdf.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/print.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/scrypt.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/evp/sign.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/ex_data.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.cc.inc ) 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.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/key_wrap.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm_interface.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/add.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/asm/x86_64-gcc.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bytes.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/cmp.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/ctx.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div_extra.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/generic.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/add.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/asm/x86_64-gcc.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bn.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/bytes.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/cmp.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/ctx.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/div_extra.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/gcd_extra.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/generic.cc.inc ) 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.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/random.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/jacobi.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery_inv.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/random.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/rsaz_exp.cc.inc ) 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.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/aead.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aesccm.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/shift.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/aead.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aesccm.cc.inc ) 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/cmac/cmac.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/cmac/cmac.cc.inc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/delocate.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/check.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/check.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.cc.inc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.cc.inc ) 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/digestsign/digestsign.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/digestsign/digestsign.cc.inc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/builtin_curves.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.cc.inc ) 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.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.cc.inc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz-table.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.cc.inc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.cc.inc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/util.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.cc.inc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h ) - 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/hkdf/hkdf.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/hmac/hmac.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c.inc ) - 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.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/hkdf/hkdf.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/hmac/hmac.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.cc.inc ) 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.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/polyval.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/polyval.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/ctrdrbg.cc.inc ) 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.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.cc.inc ) 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.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.cc.inc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/service_indicator.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/service_indicator/service_indicator.cc.inc ) 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.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.cc.inc ) 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.inc ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.cc.inc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/hpke/hpke.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/hrss/hrss.cc ) 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/keccak/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/keccak/keccak.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/keccak/keccak.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/kyber/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/kyber/kyber.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/kyber/kyber.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/lhash/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/lhash/lhash.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/md4/md4.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/md5/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/md5/md5.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/mem.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/mldsa/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/mldsa/mldsa.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/mldsa/mldsa.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/mlkem/internal.h ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/mlkem/mlkem.cc ) - 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.cc ) 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/obj/obj_xref.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_all.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_info.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.cc ) 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/pkcs7/pkcs7.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.cc ) 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/pkcs8/p5_pbev2.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.cc ) 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/poly1305/poly1305.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.cc ) 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/fork_detect.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/getentropy.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/pool/pool.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/fork_detect.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/getentropy.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/getrandom_fillin.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/ios.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.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/ios.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/sysrand_internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/trusty.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/urandom.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.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/trusty.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/urandom.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rc4/rc4.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/refcount.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/rsa_extra/internal.h ) - 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_crypt.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/spx/address.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/address.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/fors.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/fors.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/merkle.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/merkle.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/params.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/spx.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/spx_util.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/spx_util.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/thash.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/thash.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/wots.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/spx/wots.h ) - 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/rsa_extra/rsa_asn1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_extra.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/sha/sha1.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/sha/sha256.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/sha/sha512.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/siphash/siphash.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/slhdsa/address.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/slhdsa/fors.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/slhdsa/fors.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/slhdsa/internal.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/slhdsa/merkle.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/slhdsa/merkle.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/slhdsa/params.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/slhdsa/slhdsa.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/slhdsa/thash.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/slhdsa/thash.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/slhdsa/wots.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/slhdsa/wots.h ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/stack/stack.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread_none.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread_pthread.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/thread_win.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.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_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/trust_token/pmbtoken.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_digest.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_sign.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/a_verify.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/algorithm.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/by_dir.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/by_file.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/ext_dat.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/i2d_pr.cc ) s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/internal.h ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/name_print.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/policy.c ) - 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/v3_akey.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_akeya.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_alt.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_bcons.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_bitst.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_conf.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_cpols.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_crld.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_enum.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_extku.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_genn.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_ia5.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_info.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_int.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_lib.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_ncons.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_ocsp.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_pcons.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_pmaps.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_prn.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_purp.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_skey.c ) - s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.c ) - 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_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_name.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/gen/crypto/err_data.c ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/name_print.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/policy.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_crl.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_req.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_x509.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_akey.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_akeya.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_alt.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_bcons.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_bitst.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_conf.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_cpols.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_crld.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_enum.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_extku.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_genn.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_ia5.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_info.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_int.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_lib.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_ncons.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_ocsp.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_pcons.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_pmaps.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_prn.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_purp.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_skey.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_att.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_def.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_req.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_set.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509cset.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509name.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509rset.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x509spki.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_algor.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_all.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_crl.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_exten.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_name.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_req.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_sig.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_spki.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_val.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_x509.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.cc ) + s.files += %w( third_party/boringssl-with-bazel/src/gen/crypto/err_data.cc ) 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 ) @@ -2902,6 +2902,7 @@ Gem::Specification.new do |s| 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/bcm_public.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/blake2.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/blowfish.h ) @@ -2933,9 +2934,7 @@ Gem::Specification.new do |s| s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/evp.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/evp_errors.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/experimental/dilithium.h ) s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/experimental/kyber.h ) - s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/experimental/spx.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/hpke.h ) @@ -2970,6 +2969,7 @@ Gem::Specification.new do |s| s.files += %w( third_party/boringssl-with-bazel/src/include/openssl/service_indicator.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/slhdsa.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 ) diff --git a/package.xml b/package.xml index ec23133e924a2..a004a8a027c0f 100644 --- a/package.xml +++ b/package.xml @@ -2521,382 +2521,382 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - + + + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - + + - - - - - - - - - - + + + + + + + + + + - - + + - - - - - - - - + + + + + + + + - - - - + + + + - - + + - - - - - - - + + + + + - - - + + + - - - - + + + + - - - + + + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - + + + + + + + - - - - - - + + + + + + - + - - + + - - + + - + - - - - + + + + - - + + - + - + - - - - - - - + + + + + + + - - - - - - - - - - - + + + + + + + + - - - + + + - - + + - - - - - + + + + + - + - - - + + + - - - + + + - + - + - - + + + + + - + - + - - - - - - - - - + + + + + + + + + - - + + - - - + + + - - - + + + - - - - - + + + + + - - - + + + - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -2906,6 +2906,7 @@ + @@ -2937,9 +2938,7 @@ - - @@ -2974,6 +2973,7 @@ + diff --git a/src/boringssl/boringssl_prefix_symbols.h b/src/boringssl/boringssl_prefix_symbols.h index 47e53df886ff0..5418aebd5f0cb 100644 --- a/src/boringssl/boringssl_prefix_symbols.h +++ b/src/boringssl/boringssl_prefix_symbols.h @@ -1,6 +1,6 @@ -// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: b8b3e6e11166719a8ebfa43c0cde9ad7d57a84f6 +// generated by generate_boringssl_prefix_header.sh on BoringSSL commit: dec0d8f681348af8bb675e07bd89989665fca8bc -// Copyright (c) 2018, Google Inc. +// Copyright 2018 The BoringSSL Authors // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above @@ -69,9 +69,11 @@ #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_CREDENTIAL_clear_must_match_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_clear_must_match_issuer) #define SSL_CREDENTIAL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_free) #define SSL_CREDENTIAL_get_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_get_ex_data) #define SSL_CREDENTIAL_get_ex_new_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_get_ex_new_index) +#define SSL_CREDENTIAL_must_match_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_must_match_issuer) #define SSL_CREDENTIAL_new_delegated BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_new_delegated) #define SSL_CREDENTIAL_new_x509 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_new_x509) #define SSL_CREDENTIAL_set1_cert_chain BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_set1_cert_chain) @@ -81,6 +83,7 @@ #define SSL_CREDENTIAL_set1_signed_cert_timestamp_list BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_set1_signed_cert_timestamp_list) #define SSL_CREDENTIAL_set1_signing_algorithm_prefs BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_set1_signing_algorithm_prefs) #define SSL_CREDENTIAL_set_ex_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_set_ex_data) +#define SSL_CREDENTIAL_set_must_match_issuer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_set_must_match_issuer) #define SSL_CREDENTIAL_set_private_key_method BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_set_private_key_method) #define SSL_CREDENTIAL_up_ref BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CREDENTIAL_up_ref) #define SSL_CTX_add0_chain_cert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_CTX_add0_chain_cert) @@ -438,6 +441,7 @@ #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_quic BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_is_quic) #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_key_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_key_update) @@ -468,6 +472,7 @@ #define SSL_serialize_capabilities BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_serialize_capabilities) #define SSL_serialize_handshake_hints BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_serialize_handshake_hints) #define SSL_session_reused BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_session_reused) +#define SSL_set0_CA_names BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSL_set0_CA_names) #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) @@ -637,7 +642,6 @@ #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) @@ -722,9 +726,7 @@ #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_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_cmp BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ASN1_STRING_cmp) @@ -829,9 +831,32 @@ #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 BCM_fips_186_2_prf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_fips_186_2_prf) #define BCM_rand_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_rand_bytes) #define BCM_rand_bytes_hwrng BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_rand_bytes_hwrng) #define BCM_rand_bytes_with_additional_data BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_rand_bytes_with_additional_data) +#define BCM_sha1_final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha1_final) +#define BCM_sha1_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha1_init) +#define BCM_sha1_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha1_transform) +#define BCM_sha1_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha1_update) +#define BCM_sha224_final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha224_final) +#define BCM_sha224_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha224_init) +#define BCM_sha224_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha224_update) +#define BCM_sha256_final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha256_final) +#define BCM_sha256_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha256_init) +#define BCM_sha256_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha256_transform) +#define BCM_sha256_transform_blocks BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha256_transform_blocks) +#define BCM_sha256_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha256_update) +#define BCM_sha384_final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha384_final) +#define BCM_sha384_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha384_init) +#define BCM_sha384_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha384_update) +#define BCM_sha512_256_final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha512_256_final) +#define BCM_sha512_256_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha512_256_init) +#define BCM_sha512_256_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha512_256_update) +#define BCM_sha512_final BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha512_final) +#define BCM_sha512_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha512_init) +#define BCM_sha512_transform BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha512_transform) +#define BCM_sha512_update BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, BCM_sha512_update) #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) @@ -1175,6 +1200,7 @@ #define CBS_get_until_first BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_get_until_first) #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 CBS_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_init) #define CBS_is_unsigned_asn1_integer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_unsigned_asn1_integer) #define CBS_is_valid_asn1_bitstring BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_valid_asn1_bitstring) #define CBS_is_valid_asn1_integer BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CBS_is_valid_asn1_integer) @@ -1228,6 +1254,9 @@ #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_atomic_compare_exchange_weak_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_atomic_compare_exchange_weak_u32) +#define CRYPTO_atomic_load_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_atomic_load_u32) +#define CRYPTO_atomic_store_u32 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_atomic_store_u32) #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) @@ -1235,6 +1264,8 @@ #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_cpu_avoid_zmm_registers BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cpu_avoid_zmm_registers) +#define CRYPTO_cpu_perf_is_like_silvermont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_cpu_perf_is_like_silvermont) #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_fips_186_2_prf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_fips_186_2_prf) @@ -1258,12 +1289,31 @@ #define CRYPTO_get_fork_generation BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_fork_generation) #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_stderr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_get_stderr) #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_init_sysrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_init_sysrand) +#define CRYPTO_is_ADX_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_ADX_capable) +#define CRYPTO_is_AESNI_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_AESNI_capable) +#define CRYPTO_is_AVX2_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_AVX2_capable) +#define CRYPTO_is_AVX512BW_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_AVX512BW_capable) +#define CRYPTO_is_AVX512VL_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_AVX512VL_capable) +#define CRYPTO_is_AVX_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_AVX_capable) +#define CRYPTO_is_BMI1_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_BMI1_capable) +#define CRYPTO_is_BMI2_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_BMI2_capable) +#define CRYPTO_is_FXSR_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_FXSR_capable) +#define CRYPTO_is_MOVBE_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_MOVBE_capable) +#define CRYPTO_is_PCLMUL_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_PCLMUL_capable) +#define CRYPTO_is_RDRAND_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_RDRAND_capable) +#define CRYPTO_is_SSE4_1_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_SSE4_1_capable) +#define CRYPTO_is_SSSE3_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_SSSE3_capable) +#define CRYPTO_is_VAES_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_VAES_capable) +#define CRYPTO_is_VPCLMULQDQ_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_VPCLMULQDQ_capable) #define CRYPTO_is_confidential_build BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_confidential_build) +#define CRYPTO_is_intel_cpu BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_intel_cpu) +#define CRYPTO_is_x86_SHA_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_is_x86_SHA_capable) #define CRYPTO_library_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_library_init) #define CRYPTO_malloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_malloc) #define CRYPTO_malloc_init BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_malloc_init) @@ -1297,6 +1347,7 @@ #define CRYPTO_sysrand_if_available BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_sysrand_if_available) #define CRYPTO_tls13_hkdf_expand_label BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_tls13_hkdf_expand_label) #define CRYPTO_tls1_prf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_tls1_prf) +#define CRYPTO_xor16 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CRYPTO_xor16) #define CTR_DRBG_clear BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_clear) #define CTR_DRBG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_free) #define CTR_DRBG_generate BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_generate) @@ -1304,9 +1355,12 @@ #define CTR_DRBG_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_new) #define CTR_DRBG_reseed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, CTR_DRBG_reseed) #define ChaCha20_ctr32_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ChaCha20_ctr32_avx2) +#define ChaCha20_ctr32_avx2_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ChaCha20_ctr32_avx2_capable) #define ChaCha20_ctr32_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ChaCha20_ctr32_nohw) #define ChaCha20_ctr32_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ChaCha20_ctr32_ssse3) #define ChaCha20_ctr32_ssse3_4x BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ChaCha20_ctr32_ssse3_4x) +#define ChaCha20_ctr32_ssse3_4x_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ChaCha20_ctr32_ssse3_4x_capable) +#define ChaCha20_ctr32_ssse3_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ChaCha20_ctr32_ssse3_capable) #define DES_decrypt3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_decrypt3) #define DES_ecb3_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ecb3_encrypt) #define DES_ecb3_encrypt_ex BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DES_ecb3_encrypt_ex) @@ -1349,16 +1403,6 @@ #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 DILITHIUM_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_generate_key) -#define DILITHIUM_generate_key_external_entropy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_generate_key_external_entropy) -#define DILITHIUM_marshal_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_marshal_private_key) -#define DILITHIUM_marshal_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_marshal_public_key) -#define DILITHIUM_parse_private_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_parse_private_key) -#define DILITHIUM_parse_public_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_parse_public_key) -#define DILITHIUM_public_from_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_public_from_private) -#define DILITHIUM_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_sign) -#define DILITHIUM_sign_deterministic BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_sign_deterministic) -#define DILITHIUM_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, DILITHIUM_verify) #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) @@ -1366,10 +1410,8 @@ #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) @@ -1526,7 +1568,6 @@ #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) @@ -1536,6 +1577,8 @@ #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_GET_LIB BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_GET_LIB) +#define ERR_GET_REASON BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, ERR_GET_REASON) #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) @@ -1706,6 +1749,7 @@ #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_get0_md BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_get0_md) #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_move BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, EVP_MD_CTX_move) @@ -1935,7 +1979,6 @@ #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) @@ -2142,7 +2185,6 @@ #define OPENSSL_vasprintf_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_vasprintf_internal) #define OPENSSL_zalloc BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, OPENSSL_zalloc) #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) @@ -2269,7 +2311,6 @@ #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) @@ -2286,7 +2327,6 @@ #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 RAND_OpenSSL BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_OpenSSL) #define RAND_SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RAND_SSLeay) @@ -2315,6 +2355,7 @@ #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_off BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, RSA_blinding_off) #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) @@ -2411,14 +2452,19 @@ #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 SLHDSA_SHA2_128S_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SLHDSA_SHA2_128S_generate_key) +#define SLHDSA_SHA2_128S_generate_key_from_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SLHDSA_SHA2_128S_generate_key_from_seed) +#define SLHDSA_SHA2_128S_prehash_warning_nonstandard_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SLHDSA_SHA2_128S_prehash_warning_nonstandard_sign) +#define SLHDSA_SHA2_128S_prehash_warning_nonstandard_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SLHDSA_SHA2_128S_prehash_warning_nonstandard_verify) +#define SLHDSA_SHA2_128S_public_from_private BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SLHDSA_SHA2_128S_public_from_private) +#define SLHDSA_SHA2_128S_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SLHDSA_SHA2_128S_sign) +#define SLHDSA_SHA2_128S_sign_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SLHDSA_SHA2_128S_sign_internal) +#define SLHDSA_SHA2_128S_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SLHDSA_SHA2_128S_verify) +#define SLHDSA_SHA2_128S_verify_internal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SLHDSA_SHA2_128S_verify_internal) #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 SPX_generate_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPX_generate_key) -#define SPX_generate_key_from_seed BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPX_generate_key_from_seed) -#define SPX_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPX_sign) -#define SPX_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SPX_verify) #define SSLeay BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLeay) #define SSLeay_version BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, SSLeay_version) #define TRUST_TOKEN_CLIENT_add_key BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, TRUST_TOKEN_CLIENT_add_key) @@ -2580,7 +2626,6 @@ #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_load_file BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_LOOKUP_load_file) -#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) @@ -2593,7 +2638,6 @@ #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) @@ -2698,7 +2742,6 @@ #define X509_SIG_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_free) #define X509_SIG_get0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_get0) #define X509_SIG_getm BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, X509_SIG_getm) -#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) @@ -2922,6 +2965,10 @@ #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_gcm_dec_update_vaes_avx10_256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_gcm_dec_update_vaes_avx10_256) +#define aes_gcm_dec_update_vaes_avx10_512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_gcm_dec_update_vaes_avx10_512) +#define aes_gcm_enc_update_vaes_avx10_256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_gcm_enc_update_vaes_avx10_256) +#define aes_gcm_enc_update_vaes_avx10_512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_gcm_enc_update_vaes_avx10_512) #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) @@ -2931,6 +2978,7 @@ #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_hw_set_encrypt_key_alt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_encrypt_key_alt) +#define aes_hw_set_encrypt_key_alt_preferred BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_encrypt_key_alt_preferred) #define aes_hw_set_encrypt_key_base BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, aes_hw_set_encrypt_key_base) #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) @@ -2975,6 +3023,7 @@ #define bn_assert_fits_in_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_assert_fits_in_bytes) #define bn_big_endian_to_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_big_endian_to_words) #define bn_copy_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_copy_words) +#define bn_declassify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_declassify) #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) @@ -3008,7 +3057,9 @@ #define bn_mont_ctx_set_RR_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mont_ctx_set_RR_consttime) #define bn_mont_n0 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mont_n0) #define bn_mul4x_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul4x_mont) +#define bn_mul4x_mont_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul4x_mont_capable) #define bn_mul4x_mont_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul4x_mont_gather5) +#define bn_mul4x_mont_gather5_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mul4x_mont_gather5_capable) #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) @@ -3019,11 +3070,16 @@ #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_mulx4x_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mulx4x_mont) +#define bn_mulx4x_mont_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mulx4x_mont_capable) #define bn_mulx4x_mont_gather5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mulx4x_mont_gather5) +#define bn_mulx4x_mont_gather5_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mulx4x_mont_gather5_capable) +#define bn_mulx_adx_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_mulx_adx_capable) #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_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_power5_capable) #define bn_power5_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_power5_nohw) #define bn_powerx5 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_powerx5) +#define bn_powerx5_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_powerx5_capable) #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) @@ -3033,12 +3089,14 @@ #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_secret BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_secret) #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_static_words BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_set_static_words) #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_sqr8x_mont BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr8x_mont) +#define bn_sqr8x_mont_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_sqr8x_mont_capable) #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) @@ -3051,14 +3109,24 @@ #define bn_usub_consttime BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_usub_consttime) #define bn_wexpand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_wexpand) #define bn_words_to_big_endian BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bn_words_to_big_endian) +#define boringssl_ensure_ecc_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, boringssl_ensure_ecc_self_test) +#define boringssl_ensure_ffdh_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, boringssl_ensure_ffdh_self_test) +#define boringssl_ensure_rsa_self_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, boringssl_ensure_rsa_self_test) +#define boringssl_fips_break_test BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, boringssl_fips_break_test) +#define boringssl_fips_inc_counter BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, boringssl_fips_inc_counter) #define boringssl_self_test_hmac_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, boringssl_self_test_hmac_sha256) #define boringssl_self_test_sha256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, boringssl_self_test_sha256) #define boringssl_self_test_sha512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, boringssl_self_test_sha512) +#define bsaes_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bsaes_capable) +#define bsaes_cbc_encrypt BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, bsaes_cbc_encrypt) #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 chacha20_poly1305_asm_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_asm_capable) +#define chacha20_poly1305_open BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_open) #define chacha20_poly1305_open_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_open_avx2) #define chacha20_poly1305_open_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_open_nohw) +#define chacha20_poly1305_seal BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_seal) #define chacha20_poly1305_seal_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_seal_avx2) #define chacha20_poly1305_seal_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, chacha20_poly1305_seal_nohw) #define crypto_gcm_clmul_enabled BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, crypto_gcm_clmul_enabled) @@ -3104,6 +3172,7 @@ #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_ECPKParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, d2i_ECPKParameters) #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) @@ -3296,15 +3365,22 @@ #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_ghash_vpclmulqdq_avx10_256 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_vpclmulqdq_avx10_256) +#define gcm_ghash_vpclmulqdq_avx10_512 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_ghash_vpclmulqdq_avx10_512) #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_gmult_vpclmulqdq_avx10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_gmult_vpclmulqdq_avx10) #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 gcm_init_vpclmulqdq_avx10 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, gcm_init_vpclmulqdq_avx10) +#define have_fast_rdrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, have_fast_rdrand) +#define have_rdrand BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, have_rdrand) #define hkdf_pkey_meth BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, hkdf_pkey_meth) +#define hwaes_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, hwaes_capable) #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) @@ -3352,6 +3428,7 @@ #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_ECPKParameters BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, i2d_ECPKParameters) #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) @@ -3439,7 +3516,30 @@ #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 md4_block_data_order BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, md4_block_data_order) +#define lh_CONF_SECTION_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_SECTION_call_cmp_func) +#define lh_CONF_SECTION_call_doall_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_SECTION_call_doall_arg) +#define lh_CONF_SECTION_call_hash_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_SECTION_call_hash_func) +#define lh_CONF_SECTION_doall_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_SECTION_doall_arg) +#define lh_CONF_SECTION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_SECTION_free) +#define lh_CONF_SECTION_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_SECTION_insert) +#define lh_CONF_SECTION_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_SECTION_new) +#define lh_CONF_SECTION_retrieve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_SECTION_retrieve) +#define lh_CONF_VALUE_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_VALUE_call_cmp_func) +#define lh_CONF_VALUE_call_doall_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_VALUE_call_doall_arg) +#define lh_CONF_VALUE_call_hash_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_VALUE_call_hash_func) +#define lh_CONF_VALUE_doall_arg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_VALUE_doall_arg) +#define lh_CONF_VALUE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_VALUE_free) +#define lh_CONF_VALUE_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_VALUE_insert) +#define lh_CONF_VALUE_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_VALUE_new) +#define lh_CONF_VALUE_retrieve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CONF_VALUE_retrieve) +#define lh_CRYPTO_BUFFER_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CRYPTO_BUFFER_call_cmp_func) +#define lh_CRYPTO_BUFFER_call_hash_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CRYPTO_BUFFER_call_hash_func) +#define lh_CRYPTO_BUFFER_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CRYPTO_BUFFER_delete) +#define lh_CRYPTO_BUFFER_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CRYPTO_BUFFER_free) +#define lh_CRYPTO_BUFFER_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CRYPTO_BUFFER_insert) +#define lh_CRYPTO_BUFFER_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CRYPTO_BUFFER_new) +#define lh_CRYPTO_BUFFER_num_items BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CRYPTO_BUFFER_num_items) +#define lh_CRYPTO_BUFFER_retrieve BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, lh_CRYPTO_BUFFER_retrieve) #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) @@ -3495,19 +3595,222 @@ #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 rsaz_avx2_preferred BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, rsaz_avx2_preferred) #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_avx2_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha1_avx2_capable) +#define sha1_avx_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha1_avx_capable) #define sha1_block_data_order_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha1_block_data_order_avx) #define sha1_block_data_order_avx2 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha1_block_data_order_avx2) #define sha1_block_data_order_hw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha1_block_data_order_hw) #define sha1_block_data_order_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha1_block_data_order_nohw) #define sha1_block_data_order_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha1_block_data_order_ssse3) +#define sha1_hw_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha1_hw_capable) +#define sha1_ssse3_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha1_ssse3_capable) +#define sha256_avx_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha256_avx_capable) #define sha256_block_data_order_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha256_block_data_order_avx) #define sha256_block_data_order_hw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha256_block_data_order_hw) #define sha256_block_data_order_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha256_block_data_order_nohw) #define sha256_block_data_order_ssse3 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha256_block_data_order_ssse3) +#define sha256_hw_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha256_hw_capable) +#define sha256_ssse3_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha256_ssse3_capable) +#define sha512_avx_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha512_avx_capable) #define sha512_block_data_order_avx BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha512_block_data_order_avx) #define sha512_block_data_order_nohw BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sha512_block_data_order_nohw) +#define sk_ACCESS_DESCRIPTION_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ACCESS_DESCRIPTION_call_free_func) +#define sk_ACCESS_DESCRIPTION_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ACCESS_DESCRIPTION_new_null) +#define sk_ACCESS_DESCRIPTION_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ACCESS_DESCRIPTION_num) +#define sk_ACCESS_DESCRIPTION_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ACCESS_DESCRIPTION_pop_free) +#define sk_ACCESS_DESCRIPTION_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ACCESS_DESCRIPTION_push) +#define sk_ACCESS_DESCRIPTION_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ACCESS_DESCRIPTION_value) +#define sk_ASN1_INTEGER_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_INTEGER_num) +#define sk_ASN1_INTEGER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_INTEGER_push) +#define sk_ASN1_INTEGER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_INTEGER_value) +#define sk_ASN1_OBJECT_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_call_cmp_func) +#define sk_ASN1_OBJECT_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_call_copy_func) +#define sk_ASN1_OBJECT_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_call_free_func) +#define sk_ASN1_OBJECT_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_deep_copy) +#define sk_ASN1_OBJECT_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_dup) +#define sk_ASN1_OBJECT_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_find) +#define sk_ASN1_OBJECT_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_free) +#define sk_ASN1_OBJECT_is_sorted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_is_sorted) +#define sk_ASN1_OBJECT_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_new_null) +#define sk_ASN1_OBJECT_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_num) +#define sk_ASN1_OBJECT_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_pop_free) +#define sk_ASN1_OBJECT_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_push) +#define sk_ASN1_OBJECT_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_set_cmp_func) +#define sk_ASN1_OBJECT_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_sort) +#define sk_ASN1_OBJECT_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_OBJECT_value) +#define sk_ASN1_TYPE_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_TYPE_num) +#define sk_ASN1_TYPE_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_TYPE_push) +#define sk_ASN1_TYPE_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_TYPE_value) +#define sk_ASN1_VALUE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_VALUE_free) +#define sk_ASN1_VALUE_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_VALUE_new_null) +#define sk_ASN1_VALUE_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_VALUE_num) +#define sk_ASN1_VALUE_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_VALUE_pop) +#define sk_ASN1_VALUE_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_VALUE_push) +#define sk_ASN1_VALUE_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_ASN1_VALUE_value) +#define sk_CONF_VALUE_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CONF_VALUE_call_free_func) +#define sk_CONF_VALUE_delete_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CONF_VALUE_delete_ptr) +#define sk_CONF_VALUE_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CONF_VALUE_free) +#define sk_CONF_VALUE_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CONF_VALUE_new_null) +#define sk_CONF_VALUE_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CONF_VALUE_num) +#define sk_CONF_VALUE_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CONF_VALUE_pop) +#define sk_CONF_VALUE_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CONF_VALUE_pop_free) +#define sk_CONF_VALUE_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CONF_VALUE_push) +#define sk_CONF_VALUE_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CONF_VALUE_value) +#define sk_CRYPTO_BUFFER_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_call_free_func) +#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_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_pop) +#define sk_CRYPTO_BUFFER_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_pop_free) +#define sk_CRYPTO_BUFFER_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_push) +#define sk_CRYPTO_BUFFER_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_CRYPTO_BUFFER_value) +#define sk_DIST_POINT_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_DIST_POINT_call_free_func) +#define sk_DIST_POINT_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_DIST_POINT_new_null) +#define sk_DIST_POINT_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_DIST_POINT_num) +#define sk_DIST_POINT_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_DIST_POINT_pop_free) +#define sk_DIST_POINT_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_DIST_POINT_push) +#define sk_DIST_POINT_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_DIST_POINT_value) +#define sk_GENERAL_NAME_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_GENERAL_NAME_call_free_func) +#define sk_GENERAL_NAME_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_GENERAL_NAME_new_null) +#define sk_GENERAL_NAME_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_GENERAL_NAME_num) +#define sk_GENERAL_NAME_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_GENERAL_NAME_pop_free) +#define sk_GENERAL_NAME_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_GENERAL_NAME_push) +#define sk_GENERAL_NAME_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_GENERAL_NAME_set) +#define sk_GENERAL_NAME_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_GENERAL_NAME_value) +#define sk_GENERAL_SUBTREE_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_GENERAL_SUBTREE_new_null) +#define sk_GENERAL_SUBTREE_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_GENERAL_SUBTREE_num) +#define sk_GENERAL_SUBTREE_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_GENERAL_SUBTREE_push) +#define sk_GENERAL_SUBTREE_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_GENERAL_SUBTREE_value) +#define sk_OPENSSL_STRING_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_OPENSSL_STRING_call_cmp_func) +#define sk_OPENSSL_STRING_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_OPENSSL_STRING_call_copy_func) +#define sk_OPENSSL_STRING_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_OPENSSL_STRING_call_free_func) +#define sk_OPENSSL_STRING_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_OPENSSL_STRING_deep_copy) +#define sk_OPENSSL_STRING_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_OPENSSL_STRING_find) +#define sk_OPENSSL_STRING_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_OPENSSL_STRING_free) +#define sk_OPENSSL_STRING_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_OPENSSL_STRING_new) +#define sk_OPENSSL_STRING_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_OPENSSL_STRING_new_null) +#define sk_OPENSSL_STRING_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_OPENSSL_STRING_num) +#define sk_OPENSSL_STRING_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_OPENSSL_STRING_pop_free) +#define sk_OPENSSL_STRING_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_OPENSSL_STRING_push) +#define sk_OPENSSL_STRING_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_OPENSSL_STRING_sort) +#define sk_OPENSSL_STRING_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_OPENSSL_STRING_value) +#define sk_POLICYINFO_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYINFO_call_cmp_func) +#define sk_POLICYINFO_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYINFO_call_free_func) +#define sk_POLICYINFO_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYINFO_find) +#define sk_POLICYINFO_is_sorted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYINFO_is_sorted) +#define sk_POLICYINFO_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYINFO_new_null) +#define sk_POLICYINFO_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYINFO_num) +#define sk_POLICYINFO_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYINFO_pop_free) +#define sk_POLICYINFO_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYINFO_push) +#define sk_POLICYINFO_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYINFO_set_cmp_func) +#define sk_POLICYINFO_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYINFO_sort) +#define sk_POLICYINFO_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYINFO_value) +#define sk_POLICYQUALINFO_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYQUALINFO_new_null) +#define sk_POLICYQUALINFO_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYQUALINFO_num) +#define sk_POLICYQUALINFO_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYQUALINFO_push) +#define sk_POLICYQUALINFO_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICYQUALINFO_value) +#define sk_POLICY_MAPPING_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICY_MAPPING_call_cmp_func) +#define sk_POLICY_MAPPING_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICY_MAPPING_call_free_func) +#define sk_POLICY_MAPPING_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICY_MAPPING_find) +#define sk_POLICY_MAPPING_is_sorted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICY_MAPPING_is_sorted) +#define sk_POLICY_MAPPING_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICY_MAPPING_new_null) +#define sk_POLICY_MAPPING_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICY_MAPPING_num) +#define sk_POLICY_MAPPING_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICY_MAPPING_pop_free) +#define sk_POLICY_MAPPING_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICY_MAPPING_push) +#define sk_POLICY_MAPPING_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICY_MAPPING_set_cmp_func) +#define sk_POLICY_MAPPING_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICY_MAPPING_sort) +#define sk_POLICY_MAPPING_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_POLICY_MAPPING_value) +#define sk_TRUST_TOKEN_PRETOKEN_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_TRUST_TOKEN_PRETOKEN_call_free_func) +#define sk_TRUST_TOKEN_PRETOKEN_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_TRUST_TOKEN_PRETOKEN_new_null) +#define sk_TRUST_TOKEN_PRETOKEN_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_TRUST_TOKEN_PRETOKEN_num) +#define sk_TRUST_TOKEN_PRETOKEN_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_TRUST_TOKEN_PRETOKEN_pop_free) +#define sk_TRUST_TOKEN_PRETOKEN_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_TRUST_TOKEN_PRETOKEN_push) +#define sk_TRUST_TOKEN_PRETOKEN_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_TRUST_TOKEN_PRETOKEN_value) +#define sk_TRUST_TOKEN_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_TRUST_TOKEN_call_free_func) +#define sk_TRUST_TOKEN_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_TRUST_TOKEN_new_null) +#define sk_TRUST_TOKEN_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_TRUST_TOKEN_pop_free) +#define sk_TRUST_TOKEN_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_TRUST_TOKEN_push) +#define sk_X509_ATTRIBUTE_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_ATTRIBUTE_delete) +#define sk_X509_ATTRIBUTE_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_ATTRIBUTE_new_null) +#define sk_X509_ATTRIBUTE_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_ATTRIBUTE_num) +#define sk_X509_ATTRIBUTE_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_ATTRIBUTE_push) +#define sk_X509_ATTRIBUTE_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_ATTRIBUTE_value) +#define sk_X509_CRL_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_CRL_call_free_func) +#define sk_X509_CRL_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_CRL_free) +#define sk_X509_CRL_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_CRL_new_null) +#define sk_X509_CRL_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_CRL_num) +#define sk_X509_CRL_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_CRL_pop) +#define sk_X509_CRL_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_CRL_pop_free) +#define sk_X509_CRL_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_CRL_push) +#define sk_X509_CRL_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_CRL_value) +#define sk_X509_EXTENSION_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_EXTENSION_call_free_func) +#define sk_X509_EXTENSION_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_EXTENSION_delete) +#define sk_X509_EXTENSION_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_EXTENSION_free) +#define sk_X509_EXTENSION_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_EXTENSION_insert) +#define sk_X509_EXTENSION_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_EXTENSION_new_null) +#define sk_X509_EXTENSION_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_EXTENSION_num) +#define sk_X509_EXTENSION_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_EXTENSION_pop_free) +#define sk_X509_EXTENSION_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_EXTENSION_push) +#define sk_X509_EXTENSION_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_EXTENSION_set) +#define sk_X509_EXTENSION_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_EXTENSION_value) +#define sk_X509_INFO_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_INFO_call_free_func) +#define sk_X509_INFO_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_INFO_free) +#define sk_X509_INFO_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_INFO_new_null) +#define sk_X509_INFO_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_INFO_num) +#define sk_X509_INFO_pop BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_INFO_pop) +#define sk_X509_INFO_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_INFO_pop_free) +#define sk_X509_INFO_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_INFO_push) +#define sk_X509_INFO_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_INFO_value) +#define sk_X509_LOOKUP_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_LOOKUP_call_free_func) +#define sk_X509_LOOKUP_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_LOOKUP_new_null) +#define sk_X509_LOOKUP_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_LOOKUP_num) +#define sk_X509_LOOKUP_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_LOOKUP_pop_free) +#define sk_X509_LOOKUP_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_LOOKUP_push) +#define sk_X509_LOOKUP_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_LOOKUP_value) +#define sk_X509_NAME_ENTRY_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_ENTRY_call_free_func) +#define sk_X509_NAME_ENTRY_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_ENTRY_delete) +#define sk_X509_NAME_ENTRY_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_ENTRY_free) +#define sk_X509_NAME_ENTRY_insert BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_ENTRY_insert) +#define sk_X509_NAME_ENTRY_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_ENTRY_new_null) +#define sk_X509_NAME_ENTRY_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_ENTRY_num) +#define sk_X509_NAME_ENTRY_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_ENTRY_pop_free) +#define sk_X509_NAME_ENTRY_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_ENTRY_push) +#define sk_X509_NAME_ENTRY_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_ENTRY_set) +#define sk_X509_NAME_ENTRY_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_NAME_ENTRY_value) +#define sk_X509_OBJECT_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_OBJECT_call_cmp_func) +#define sk_X509_OBJECT_call_copy_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_OBJECT_call_copy_func) +#define sk_X509_OBJECT_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_OBJECT_call_free_func) +#define sk_X509_OBJECT_deep_copy BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_OBJECT_deep_copy) +#define sk_X509_OBJECT_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_OBJECT_find) +#define sk_X509_OBJECT_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_OBJECT_new) +#define sk_X509_OBJECT_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_OBJECT_num) +#define sk_X509_OBJECT_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_OBJECT_pop_free) +#define sk_X509_OBJECT_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_OBJECT_push) +#define sk_X509_OBJECT_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_OBJECT_sort) +#define sk_X509_OBJECT_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_OBJECT_value) +#define sk_X509_REVOKED_call_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_REVOKED_call_cmp_func) +#define sk_X509_REVOKED_find BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_REVOKED_find) +#define sk_X509_REVOKED_is_sorted BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_REVOKED_is_sorted) +#define sk_X509_REVOKED_new BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_REVOKED_new) +#define sk_X509_REVOKED_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_REVOKED_num) +#define sk_X509_REVOKED_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_REVOKED_push) +#define sk_X509_REVOKED_set_cmp_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_REVOKED_set_cmp_func) +#define sk_X509_REVOKED_sort BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_REVOKED_sort) +#define sk_X509_REVOKED_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_REVOKED_value) +#define sk_X509_call_free_func BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_call_free_func) +#define sk_X509_delete BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_delete) +#define sk_X509_delete_ptr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_delete_ptr) +#define sk_X509_dup BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_dup) +#define sk_X509_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_free) +#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 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_pop) +#define sk_X509_pop_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_pop_free) +#define sk_X509_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_push) +#define sk_X509_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_set) +#define sk_X509_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_X509_value) #define sk_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_free) #define sk_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_new_null) #define sk_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_num) @@ -3516,38 +3819,41 @@ #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_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_value) -#define spx_base_b BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_base_b) -#define spx_copy_keypair_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_copy_keypair_addr) -#define spx_fors_pk_from_sig BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_fors_pk_from_sig) -#define spx_fors_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_fors_sign) -#define spx_fors_sk_gen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_fors_sk_gen) -#define spx_fors_treehash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_fors_treehash) -#define spx_get_tree_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_get_tree_index) -#define spx_ht_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_ht_sign) -#define spx_ht_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_ht_verify) -#define spx_set_chain_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_set_chain_addr) -#define spx_set_hash_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_set_hash_addr) -#define spx_set_keypair_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_set_keypair_addr) -#define spx_set_layer_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_set_layer_addr) -#define spx_set_tree_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_set_tree_addr) -#define spx_set_tree_height BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_set_tree_height) -#define spx_set_tree_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_set_tree_index) -#define spx_set_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_set_type) -#define spx_thash_f BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_thash_f) -#define spx_thash_h BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_thash_h) -#define spx_thash_hmsg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_thash_hmsg) -#define spx_thash_prf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_thash_prf) -#define spx_thash_prfmsg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_thash_prfmsg) -#define spx_thash_tk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_thash_tk) -#define spx_thash_tl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_thash_tl) -#define spx_to_uint64 BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_to_uint64) -#define spx_treehash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_treehash) -#define spx_uint64_to_len_bytes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_uint64_to_len_bytes) -#define spx_wots_pk_from_sig BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_wots_pk_from_sig) -#define spx_wots_pk_gen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_wots_pk_gen) -#define spx_wots_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_wots_sign) -#define spx_xmss_pk_from_sig BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_xmss_pk_from_sig) -#define spx_xmss_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, spx_xmss_sign) +#define sk_void_free BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_void_free) +#define sk_void_new_null BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_void_new_null) +#define sk_void_num BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_void_num) +#define sk_void_push BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_void_push) +#define sk_void_set BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_void_set) +#define sk_void_value BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, sk_void_value) +#define slhdsa_copy_keypair_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_copy_keypair_addr) +#define slhdsa_fors_pk_from_sig BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_fors_pk_from_sig) +#define slhdsa_fors_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_fors_sign) +#define slhdsa_fors_sk_gen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_fors_sk_gen) +#define slhdsa_fors_treehash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_fors_treehash) +#define slhdsa_get_tree_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_get_tree_index) +#define slhdsa_ht_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_ht_sign) +#define slhdsa_ht_verify BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_ht_verify) +#define slhdsa_set_chain_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_set_chain_addr) +#define slhdsa_set_hash_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_set_hash_addr) +#define slhdsa_set_keypair_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_set_keypair_addr) +#define slhdsa_set_layer_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_set_layer_addr) +#define slhdsa_set_tree_addr BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_set_tree_addr) +#define slhdsa_set_tree_height BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_set_tree_height) +#define slhdsa_set_tree_index BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_set_tree_index) +#define slhdsa_set_type BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_set_type) +#define slhdsa_thash_f BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_thash_f) +#define slhdsa_thash_h BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_thash_h) +#define slhdsa_thash_hmsg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_thash_hmsg) +#define slhdsa_thash_prf BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_thash_prf) +#define slhdsa_thash_prfmsg BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_thash_prfmsg) +#define slhdsa_thash_tk BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_thash_tk) +#define slhdsa_thash_tl BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_thash_tl) +#define slhdsa_treehash BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_treehash) +#define slhdsa_wots_pk_from_sig BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_wots_pk_from_sig) +#define slhdsa_wots_pk_gen BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_wots_pk_gen) +#define slhdsa_wots_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_wots_sign) +#define slhdsa_xmss_pk_from_sig BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_xmss_pk_from_sig) +#define slhdsa_xmss_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, slhdsa_xmss_sign) #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) @@ -3592,9 +3898,11 @@ #define voprf_pst1_sign BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, voprf_pst1_sign) #define voprf_pst1_sign_with_proof_scalar_for_testing BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, voprf_pst1_sign_with_proof_scalar_for_testing) #define voprf_pst1_unblind BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, voprf_pst1_unblind) +#define vpaes_capable BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_capable) #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_decrypt_key_to_bsaes BORINGSSL_ADD_PREFIX(BORINGSSL_PREFIX, vpaes_decrypt_key_to_bsaes) #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) diff --git a/src/objective-c/BoringSSL-GRPC.podspec b/src/objective-c/BoringSSL-GRPC.podspec index 2a04a9cf65fbf..d94d93cf6524b 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.37' + version = '0.0.38' s.version = version s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' # Adapted from the homepage: @@ -76,7 +76,7 @@ Pod::Spec.new do |s| s.source = { :git => 'https://github.com/google/boringssl.git', - :commit => "b8b3e6e11166719a8ebfa43c0cde9ad7d57a84f6", + :commit => "dec0d8f681348af8bb675e07bd89989665fca8bc", } s.ios.deployment_target = '11.0' @@ -136,7 +136,7 @@ Pod::Spec.new do |s| # We have to include fiat because spake25519 depends on it 'src/third_party/fiat/*.{h,c,cc}', # Include the err_data.c pre-generated in boringssl's master-with-bazel branch - 'src/gen/crypto/err_data.c' + 'src/gen/crypto/err_data.cc' ss.private_header_files = 'src/ssl/*.h', 'src/ssl/**/*.h', @@ -173,529 +173,569 @@ Pod::Spec.new do |s| *) opts="--ignore-garbage" ;; esac base64 --decode $opts < src/include/openssl/boringssl_prefix_symbols.h - H4sICAAAAAAC/2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oALS9W3PbyJamfd+/QjFzMx2xo9uSyy7v - 746W6DLbsqQm6Zpy3yBAAhSxDQI0EpSl+vWTCYBAHtZKYK3UF7GjuyzifV4gz+f8z/+8eEyLtIrrNLnY - vPT/iDZllRWPQuTRsUp32XO0T+Mkrf5D7C/K4uJj8+tqdXuxLQ+HrP7/LjYfNm/T9+nl5eX7979f/jP+ - kG528W9vt2+2SfrPOPk9efd7/OG33ft/+7f//M+L6/L4UmWP+/ri/2z//eLqzeWHf1z8UZaPeXqxKLb/ - IR9RTz2k1SETIpN+dXlxEuk/pNvx5R8XhzLJdvL/x0Xyn2V1kWSirrLNqU4v6n0mLkS5q3/FVXqxkz/G - xYtiHU/VsRTpxa+slh9QNf+/PNUXuzS9kJJ9WqXq66u4kAHxj4tjVT5liQySeh/X8v+kF/GmfEoVadu/ - e1HW2TZVb9H6Hof3Pf90PKZxdZEVF3GeK2WWivPXrT/PL1b3n9b/d7acXyxWFw/L+z8XN/Obi/81W8l/ - /6+L2d1N89Ds2/rz/fLiZrG6vp0tvq4uZre3F1K1nN2tF/OVYv3fxfrzxXL+x2wpJfdSJXkD++769tvN - 4u6PRrj4+nC7kC4D4OL+k2J8nS+vP8u/zD4ubhfr7439p8X6br5a/YdkXNzdX8z/nN+tL1afFUd7s4/z - i9vF7OPt/OKT/Nfs7rvCrR7m14vZ7T/key/n1+t/SMT5v+RD1/d3q/l/f5M4+czFzezr7A/1Io36/M/m - wz7P1qt76buUn7f6drtWn/Fpef/14vZ+pd784ttqLj1m65lSyzCUr7z6h9TN5Qsu1XvP5P+u14v7O8WT - Amm9Xs7Ue9zN/7hd/DG/u54r7X0jWN8v5bPfVp3mHxez5WKlTO+/rZX6XjGbJHx/dzdvnmlDX4WHfJfm - LeZLGRBfZw34kxkb/9Gk/4/3S8mU2Sea3dxED8v5p8VfF8dY1Km4qH+VFzLpFXW2y9JKyMQjE39ZpDIS - apXEZKI+CPUHBcpqlVtViit3F4d4W5UX6fMxLppEKP+X1eIirh5PB8kTF5tUitPGSObe//i3/53InF2k - 4Ov8n/gfF5t/B3+KFvLTl+0DXob+4EV88b//90Wk/s/m3wbV4j7aRbKUgd9h+GP7h38Mgn83GCKtqZRO - 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 - SWWH6qnMiloNzwDiCcK///V/4K+mmdHmBAA= + H4sICAAAAAAC/2JvcmluZ3NzbF9wcmVmaXhfc3ltYm9scy5oALS923LbyJaue99PoVjrZq+IGd2WXPJU + 7TtZosvqsiVNUq6uWjcIkEiKmAIBGgnqUE+/MwGQyMMYCYyR2hEzussi/u8H8nzO//qvk0dRijptRHay + fDv+I1lWdV4+Slkku1qs89dkI9JM1P8pNydVefK5/XWx+HayqrbbvPl/TzKx+pBdrD9dnH785SJdXyyX + n/55Lj78c5ld/Prrxa+fPp2vV+nFcvUf//Ff/3VyVe3e6vxx05ycfTi9OHnYCIN4uW82VS3Vc/rRe1Fv + cylzZdpUJ3sp/qEsd2//ONlWWb5W/z8ts/+q6pMsl02dL/eNOGk2uTyR1bp5SWtxslY/puWbZu329a6S + 4uQlb9RX1O3/r/bNyVqIEyXZiFroIKjTUoXGP052dfWcZypcmk3aqP8jTtJl9Sw0aXX8gLJq8pXQb9H5 + 7ob3Pfy024m0PsnLk7QotDIX8j/7r3v4OjtZ3H15+J/L+ezkZnFyP7/74+Z6dn3yvy4X6t//6+Ty9rp9 + 6PLHw9e7+cn1zeLq2+XN98XJ5bdvJ0o1v7x9uJktNOt/bh6+nsxnv13OleROqRRvYN9efftxfXP7Wyu8 + +X7/7Ua5DICTuy+a8X02v/qq/nL5+ebbzcNfrf2Xm4fb2WLxn4pxcnt3MvtjdvtwsviqOcabfZ6dfLu5 + /PxtdvJF/evy9i+NW9zPrm4uv/1Dvfd8dvXwD4U4/Jd66OrudjH71w+FU8+cXF9+v/xNv0irPvyz/bCv + lw+LO+U7V5+3+PHtQX/Gl/nd95Nvdwv95ic/FjPlcflwqdUqDNUrL/6hdDP1gnP93pfqf1cPN3e3mqcE + yvphfqnf43b227eb32a3VzOtvWsFD3dz9eyPRa/5x8nl/GahTe9+PGj1nWa26fju9nbWPtOFvg4P9S7t + W8zmKiC+X7bgL3Zs/GebCT7fzRVTpfjk8vo6uZ/Pvtz8ebJLZSPkSfNSnaikVzb5Ohe1VIlHJf6qFCoS + Gp3EVKLeSv0HDcobnWV1iqvWJ9t0VVcn4nWXlm0iVP/LG3mS1o/7reLJk6VQYtEaqQz3n//xvzOVvUsB + vs7/k/7jZPl/wJ+SG/Xp8+6BIMN88CQ9+d//+yTR/2f5H4Pq5i5ZJ6qogd9h+GP3h38Mgv9jMaRoqJRe + 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 + f31dCnEaWgUA EOF # PrivacyInfo.xcprivacy is not part of BoringSSL repo, inject it during pod installation diff --git a/src/python/grpcio/grpc_core_dependencies.py b/src/python/grpcio/grpc_core_dependencies.py index bd812614e13ef..f69311b489442 100644 --- a/src/python/grpcio/grpc_core_dependencies.py +++ b/src/python/grpcio/grpc_core_dependencies.py @@ -1019,245 +1019,248 @@ '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/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_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_strex.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/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_int.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/f_string.c', - 'third_party/boringssl-with-bazel/src/crypto/asn1/posix_time.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/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/errno.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/blake2/blake2.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_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_des.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/conf/conf.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.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_aarch64_openbsd.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_sysreg.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_win.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.c', - 'third_party/boringssl-with-bazel/src/crypto/cpu_intel.c', - 'third_party/boringssl-with-bazel/src/crypto/crypto.c', - 'third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c', - 'third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_64_adx.c', - 'third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c', - 'third_party/boringssl-with-bazel/src/crypto/des/des.c', - 'third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/dh_extra/params.c', - 'third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.c', - 'third_party/boringssl-with-bazel/src/crypto/dilithium/dilithium.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/ec_extra/hash_to_curve.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/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_dh.c', - 'third_party/boringssl-with-bazel/src/crypto/evp/p_dh_asn1.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_hkdf.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/hpke/hpke.c', - 'third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c', - 'third_party/boringssl-with-bazel/src/crypto/keccak/keccak.c', - 'third_party/boringssl-with-bazel/src/crypto/kyber/kyber.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/mldsa/mldsa.c', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_d2i_fp.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_dup.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_gentm.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_i2d_fp.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_int.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_object.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_octet.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_strex.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_time.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_type.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/a_utctm.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/asn1_par.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/f_int.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/f_string.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/posix_time.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_new.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.cc', + 'third_party/boringssl-with-bazel/src/crypto/asn1/tasn_utl.cc', + 'third_party/boringssl-with-bazel/src/crypto/base64/base64.cc', + 'third_party/boringssl-with-bazel/src/crypto/bio/bio.cc', + 'third_party/boringssl-with-bazel/src/crypto/bio/bio_mem.cc', + 'third_party/boringssl-with-bazel/src/crypto/bio/connect.cc', + 'third_party/boringssl-with-bazel/src/crypto/bio/errno.cc', + 'third_party/boringssl-with-bazel/src/crypto/bio/fd.cc', + 'third_party/boringssl-with-bazel/src/crypto/bio/file.cc', + 'third_party/boringssl-with-bazel/src/crypto/bio/hexdump.cc', + 'third_party/boringssl-with-bazel/src/crypto/bio/pair.cc', + 'third_party/boringssl-with-bazel/src/crypto/bio/printf.cc', + 'third_party/boringssl-with-bazel/src/crypto/bio/socket.cc', + 'third_party/boringssl-with-bazel/src/crypto/bio/socket_helper.cc', + 'third_party/boringssl-with-bazel/src/crypto/blake2/blake2.cc', + 'third_party/boringssl-with-bazel/src/crypto/bn_extra/bn_asn1.cc', + 'third_party/boringssl-with-bazel/src/crypto/bn_extra/convert.cc', + 'third_party/boringssl-with-bazel/src/crypto/buf/buf.cc', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/asn1_compat.cc', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/ber.cc', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.cc', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.cc', + 'third_party/boringssl-with-bazel/src/crypto/bytestring/unicode.cc', + 'third_party/boringssl-with-bazel/src/crypto/chacha/chacha.cc', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.cc', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.cc', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesctrhmac.cc', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.cc', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_chacha20poly1305.cc', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_des.cc', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_null.cc', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc2.cc', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_rc4.cc', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.cc', + 'third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.cc', + 'third_party/boringssl-with-bazel/src/crypto/conf/conf.cc', + 'third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_apple.cc', + 'third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_fuchsia.cc', + 'third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_linux.cc', + 'third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_openbsd.cc', + 'third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_sysreg.cc', + 'third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_win.cc', + 'third_party/boringssl-with-bazel/src/crypto/cpu_arm_freebsd.cc', + 'third_party/boringssl-with-bazel/src/crypto/cpu_arm_linux.cc', + 'third_party/boringssl-with-bazel/src/crypto/cpu_intel.cc', + 'third_party/boringssl-with-bazel/src/crypto/crypto.cc', + 'third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.cc', + 'third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_64_adx.cc', + 'third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.cc', + 'third_party/boringssl-with-bazel/src/crypto/des/des.cc', + 'third_party/boringssl-with-bazel/src/crypto/dh_extra/dh_asn1.cc', + 'third_party/boringssl-with-bazel/src/crypto/dh_extra/params.cc', + 'third_party/boringssl-with-bazel/src/crypto/digest_extra/digest_extra.cc', + 'third_party/boringssl-with-bazel/src/crypto/dsa/dsa.cc', + 'third_party/boringssl-with-bazel/src/crypto/dsa/dsa_asn1.cc', + 'third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_asn1.cc', + 'third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.cc', + 'third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.cc', + 'third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.cc', + 'third_party/boringssl-with-bazel/src/crypto/ecdsa_extra/ecdsa_asn1.cc', + 'third_party/boringssl-with-bazel/src/crypto/engine/engine.cc', + 'third_party/boringssl-with-bazel/src/crypto/err/err.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/evp.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/evp_ctx.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_dh.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_dh_asn1.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_dsa_asn1.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ec.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ec_asn1.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_ed25519_asn1.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_hkdf.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_rsa_asn1.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_x25519.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/pbkdf.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/print.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/scrypt.cc', + 'third_party/boringssl-with-bazel/src/crypto/evp/sign.cc', + 'third_party/boringssl-with-bazel/src/crypto/ex_data.cc', + 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.cc', + 'third_party/boringssl-with-bazel/src/crypto/fipsmodule/fips_shared_support.cc', + 'third_party/boringssl-with-bazel/src/crypto/hpke/hpke.cc', + 'third_party/boringssl-with-bazel/src/crypto/hrss/hrss.cc', + 'third_party/boringssl-with-bazel/src/crypto/keccak/keccak.cc', + 'third_party/boringssl-with-bazel/src/crypto/kyber/kyber.cc', + 'third_party/boringssl-with-bazel/src/crypto/lhash/lhash.cc', + 'third_party/boringssl-with-bazel/src/crypto/md4/md4.cc', + 'third_party/boringssl-with-bazel/src/crypto/md5/md5.cc', + 'third_party/boringssl-with-bazel/src/crypto/mem.cc', + 'third_party/boringssl-with-bazel/src/crypto/mldsa/mldsa.cc', 'third_party/boringssl-with-bazel/src/crypto/mlkem/mlkem.cc', - '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/fork_detect.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/getentropy.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/ios.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/trusty.c', - 'third_party/boringssl-with-bazel/src/crypto/rand_extra/urandom.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.c', - 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c', - 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.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/spx/address.c', - 'third_party/boringssl-with-bazel/src/crypto/spx/fors.c', - 'third_party/boringssl-with-bazel/src/crypto/spx/merkle.c', - 'third_party/boringssl-with-bazel/src/crypto/spx/spx.c', - 'third_party/boringssl-with-bazel/src/crypto/spx/spx_util.c', - 'third_party/boringssl-with-bazel/src/crypto/spx/thash.c', - 'third_party/boringssl-with-bazel/src/crypto/spx/wots.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/trust_token/pmbtoken.c', - 'third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c', - 'third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.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_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/name_print.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/policy.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/v3_akey.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_akeya.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_alt.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_bcons.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_bitst.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_conf.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_cpols.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_crld.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_enum.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_extku.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_genn.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_ia5.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_info.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_int.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_lib.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_ncons.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_ocsp.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_pcons.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_pmaps.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_prn.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_purp.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_skey.c', - 'third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.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_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_name.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/gen/crypto/err_data.c', + 'third_party/boringssl-with-bazel/src/crypto/obj/obj.cc', + 'third_party/boringssl-with-bazel/src/crypto/obj/obj_xref.cc', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_all.cc', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_info.cc', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.cc', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.cc', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.cc', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.cc', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_x509.cc', + 'third_party/boringssl-with-bazel/src/crypto/pem/pem_xaux.cc', + 'third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.cc', + 'third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.cc', + 'third_party/boringssl-with-bazel/src/crypto/pkcs8/p5_pbev2.cc', + 'third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.cc', + 'third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.cc', + 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.cc', + 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.cc', + 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.cc', + 'third_party/boringssl-with-bazel/src/crypto/pool/pool.cc', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.cc', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/fork_detect.cc', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/forkunsafe.cc', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/getentropy.cc', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/ios.cc', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.cc', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.cc', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/trusty.cc', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/urandom.cc', + 'third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.cc', + 'third_party/boringssl-with-bazel/src/crypto/rc4/rc4.cc', + 'third_party/boringssl-with-bazel/src/crypto/refcount.cc', + 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.cc', + 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.cc', + 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_extra.cc', + 'third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_print.cc', + 'third_party/boringssl-with-bazel/src/crypto/sha/sha1.cc', + 'third_party/boringssl-with-bazel/src/crypto/sha/sha256.cc', + 'third_party/boringssl-with-bazel/src/crypto/sha/sha512.cc', + 'third_party/boringssl-with-bazel/src/crypto/siphash/siphash.cc', + 'third_party/boringssl-with-bazel/src/crypto/slhdsa/fors.cc', + 'third_party/boringssl-with-bazel/src/crypto/slhdsa/merkle.cc', + 'third_party/boringssl-with-bazel/src/crypto/slhdsa/slhdsa.cc', + 'third_party/boringssl-with-bazel/src/crypto/slhdsa/thash.cc', + 'third_party/boringssl-with-bazel/src/crypto/slhdsa/wots.cc', + 'third_party/boringssl-with-bazel/src/crypto/stack/stack.cc', + 'third_party/boringssl-with-bazel/src/crypto/thread.cc', + 'third_party/boringssl-with-bazel/src/crypto/thread_none.cc', + 'third_party/boringssl-with-bazel/src/crypto/thread_pthread.cc', + 'third_party/boringssl-with-bazel/src/crypto/thread_win.cc', + 'third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.cc', + 'third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.cc', + 'third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_digest.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_sign.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/a_verify.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/algorithm.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/by_dir.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/by_file.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/i2d_pr.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/name_print.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/policy.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/rsa_pss.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_crl.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_req.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_x509.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_akey.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_akeya.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_alt.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_bcons.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_bitst.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_conf.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_cpols.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_crld.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_enum.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_extku.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_genn.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_ia5.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_info.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_int.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_lib.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_ncons.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_ocsp.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_pcons.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_pmaps.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_prn.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_purp.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_skey.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/v3_utl.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_att.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_d2.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_def.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_ext.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_lu.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_req.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_set.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_txt.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_v3.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509cset.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509name.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509rset.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x509spki.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_algor.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_all.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_crl.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_exten.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_name.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_req.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_sig.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_spki.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_val.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_x509.cc', + 'third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.cc', + 'third_party/boringssl-with-bazel/src/gen/crypto/err_data.cc', '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', @@ -1450,6 +1453,8 @@ 'third_party/boringssl-with-bazel/src/crypto/curve25519/asm/x25519-asm-arm.S', 'third_party/boringssl-with-bazel/src/crypto/hrss/asm/poly_rq_mul.S', 'third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm_asm.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aes-gcm-avx10-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/bcm/aes-gcm-avx10-x86_64-linux.S', 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-gcm-x86_64-apple.S', 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-gcm-x86_64-linux.S', 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-x86-apple.S', @@ -1491,10 +1496,6 @@ 'third_party/boringssl-with-bazel/src/gen/bcm/ghashv8-armv8-apple.S', 'third_party/boringssl-with-bazel/src/gen/bcm/ghashv8-armv8-linux.S', 'third_party/boringssl-with-bazel/src/gen/bcm/ghashv8-armv8-win.S', - 'third_party/boringssl-with-bazel/src/gen/bcm/md5-586-apple.S', - 'third_party/boringssl-with-bazel/src/gen/bcm/md5-586-linux.S', - 'third_party/boringssl-with-bazel/src/gen/bcm/md5-x86_64-apple.S', - 'third_party/boringssl-with-bazel/src/gen/bcm/md5-x86_64-linux.S', 'third_party/boringssl-with-bazel/src/gen/bcm/p256-armv8-asm-apple.S', 'third_party/boringssl-with-bazel/src/gen/bcm/p256-armv8-asm-linux.S', 'third_party/boringssl-with-bazel/src/gen/bcm/p256-armv8-asm-win.S', @@ -1562,6 +1563,10 @@ 'third_party/boringssl-with-bazel/src/gen/crypto/chacha20_poly1305_armv8-win.S', 'third_party/boringssl-with-bazel/src/gen/crypto/chacha20_poly1305_x86_64-apple.S', 'third_party/boringssl-with-bazel/src/gen/crypto/chacha20_poly1305_x86_64-linux.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/md5-586-apple.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/md5-586-linux.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/md5-x86_64-apple.S', + 'third_party/boringssl-with-bazel/src/gen/crypto/md5-x86_64-linux.S', 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-armv4-linux.S', 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-armv8-apple.S', 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-armv8-linux.S', @@ -1576,6 +1581,7 @@ 'third_party/boringssl-with-bazel/src/third_party/fiat/asm/fiat_p256_adx_sqr.S', ], 'crypto_nasm': [ + 'third_party/boringssl-with-bazel/src/gen/bcm/aes-gcm-avx10-x86_64-win.asm', 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-gcm-x86_64-win.asm', 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-x86-win.asm', 'third_party/boringssl-with-bazel/src/gen/bcm/aesni-x86_64-win.asm', @@ -1585,8 +1591,6 @@ 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-ssse3-x86_64-win.asm', 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-x86-win.asm', 'third_party/boringssl-with-bazel/src/gen/bcm/ghash-x86_64-win.asm', - 'third_party/boringssl-with-bazel/src/gen/bcm/md5-586-win.asm', - 'third_party/boringssl-with-bazel/src/gen/bcm/md5-x86_64-win.asm', 'third_party/boringssl-with-bazel/src/gen/bcm/p256-x86_64-asm-win.asm', 'third_party/boringssl-with-bazel/src/gen/bcm/p256_beeu-x86_64-asm-win.asm', 'third_party/boringssl-with-bazel/src/gen/bcm/rdrand-x86_64-win.asm', @@ -1606,6 +1610,8 @@ 'third_party/boringssl-with-bazel/src/gen/crypto/chacha-x86-win.asm', 'third_party/boringssl-with-bazel/src/gen/crypto/chacha-x86_64-win.asm', 'third_party/boringssl-with-bazel/src/gen/crypto/chacha20_poly1305_x86_64-win.asm', + 'third_party/boringssl-with-bazel/src/gen/crypto/md5-586-win.asm', + 'third_party/boringssl-with-bazel/src/gen/crypto/md5-x86_64-win.asm', 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-x86-win.asm', 'third_party/boringssl-with-bazel/src/gen/test_support/trampoline-x86_64-win.asm', ], diff --git a/templates/gRPC-Core.podspec.template b/templates/gRPC-Core.podspec.template index 26b6f6860b009..981df6c6efd61 100644 --- a/templates/gRPC-Core.podspec.template +++ b/templates/gRPC-Core.podspec.template @@ -200,7 +200,7 @@ ss.libraries = 'z' ss.dependency "#{s.name}/Interface", version ss.dependency "#{s.name}/Privacy", version - ss.dependency 'BoringSSL-GRPC', '0.0.37' + ss.dependency 'BoringSSL-GRPC', '0.0.38' % for abseil_spec in grpc_abseil_specs: ss.dependency '${abseil_spec}', abseil_version % endfor diff --git a/templates/src/objective-c/BoringSSL-GRPC.podspec.template b/templates/src/objective-c/BoringSSL-GRPC.podspec.template index c3cdf4d4f3db4..a31e1bf4a5d75 100644 --- a/templates/src/objective-c/BoringSSL-GRPC.podspec.template +++ b/templates/src/objective-c/BoringSSL-GRPC.podspec.template @@ -70,7 +70,7 @@ Pod::Spec.new do |s| s.name = 'BoringSSL-GRPC' - version = '0.0.37' + version = '0.0.38' s.version = version s.summary = 'BoringSSL is a fork of OpenSSL that is designed to meet Google\'s needs.' # Adapted from the homepage: @@ -167,7 +167,7 @@ # We have to include fiat because spake25519 depends on it 'src/third_party/fiat/*.{h,c,cc}', # Include the err_data.c pre-generated in boringssl's master-with-bazel branch - 'src/gen/crypto/err_data.c' + 'src/gen/crypto/err_data.cc' ss.private_header_files = 'src/ssl/*.h', 'src/ssl/**/*.h', diff --git a/third_party/boringssl-with-bazel b/third_party/boringssl-with-bazel index b8b3e6e111667..dec0d8f681348 160000 --- a/third_party/boringssl-with-bazel +++ b/third_party/boringssl-with-bazel @@ -1 +1 @@ -Subproject commit b8b3e6e11166719a8ebfa43c0cde9ad7d57a84f6 +Subproject commit dec0d8f681348af8bb675e07bd89989665fca8bc diff --git a/tools/run_tests/sanity/check_submodules.sh b/tools/run_tests/sanity/check_submodules.sh index cff0f782c6033..fd6c9bd82ecc6 100755 --- a/tools/run_tests/sanity/check_submodules.sh +++ b/tools/run_tests/sanity/check_submodules.sh @@ -28,7 +28,7 @@ cat <"$want_submodules" third_party/abseil-cpp 4447c7562e3bc702ade25105912dce503f0c4010 third_party/benchmark 12235e24652fc7f809373e7c11a5f73c5763fc4c third_party/bloaty 60209eb1ccc34d5deefb002d1b7f37545204f7f2 -third_party/boringssl-with-bazel b8b3e6e11166719a8ebfa43c0cde9ad7d57a84f6 +third_party/boringssl-with-bazel dec0d8f681348af8bb675e07bd89989665fca8bc third_party/cares/cares 6360e96b5cf8e5980c887ce58ef727e53d77243a third_party/envoy-api f8b75d1efa92bbf534596a013d9ca5873f79dd30 third_party/googleapis fe8ba054ad4f7eca946c2d14a63c3f07c0b586a0 From 9a10ab96583d220c3d326d1abff52e1bed26aadb Mon Sep 17 00:00:00 2001 From: Tanvi Jagtap Date: Mon, 16 Dec 2024 22:05:35 -0800 Subject: [PATCH 06/26] [PH2][Documentation][Promise] Document the Join combinator PiperOrigin-RevId: 706950680 --- src/core/lib/promise/join.h | 65 +++++++++++++++++++++++++++++++++++-- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/src/core/lib/promise/join.h b/src/core/lib/promise/join.h index d97045d939e53..88d7eaa918803 100644 --- a/src/core/lib/promise/join.h +++ b/src/core/lib/promise/join.h @@ -28,6 +28,69 @@ namespace grpc_core { namespace promise_detail { +// The Join promise combinator takes as inputs multiple promises. +// When the Join promise is polled, these input promises will be executed +// serially on the same thread. +// Each promise being executed either returns a value or Pending{}. +// Each subsequent execution of the Join will only execute the input promises +// which returned Pending{} in any of the previous executions. This mechanism +// ensures that no promise is executed after it resolves, which is an essential +// requirement. +// +// Suppose you have three promises +// 1. First promise returning type Poll +// 2. Second promise returning type Poll +// 3. Third promise returning type Poll +// Then you poll the Join of theses three promises, the result will have the +// type Poll> +// +// Polling this join promise will +// 1. Return Pending{} if even one promise in the input list of promises +// returns Pending{} +// 2. Return the tuple if all promises are resolved. +// +// All promises in the input list will be executed irrespective of failure +// status. If you want the promise execution to stop when there is a failure in +// any one promise, consider using TryJoin promise combinator instead of the +// Join combinator. +// +// Example of Join : +// +// { +// int execution_order = 0; +// auto first_promise = [&execution_order]() mutable -> Poll { +// execution_order = (execution_order * 10) + 1; +// return 1; +// }; +// auto second_promise = [&execution_order]() mutable -> Poll { +// execution_order = (execution_order * 10) + 2; +// return false; +// }; +// auto third_promise = [&execution_order, +// once = false]() mutable -> Poll { +// execution_order = (execution_order * 10) + 3; +// if (once) return Success{}; +// once = true; +// return Pending{}; +// }; +// +// auto join_1_2_3 = Join(first_promise, second_promise, third_promise); +// +// using JoinTuple = std::tuple; +// Poll first_execution = join_1_2_3(); +// EXPECT_FALSE(first_execution.ready()); +// +// Poll second_execution = join_1_2_3(); +// EXPECT_TRUE(second_execution.ready()); +// +// JoinTuple& tuple = *(second_execution.value_if_ready()); +// EXPECT_EQ(get<0>(tuple), 1); +// EXPECT_EQ(get<1>(tuple), false); +// EXPECT_EQ(get<2>(tuple), Success{}); +// +// EXPECT_EQ(execution_order, 1233); // Check the order of execution. +// } + struct JoinTraits { template using ResultType = absl::remove_reference_t; @@ -72,8 +135,6 @@ struct WrapInTuple { } // namespace promise_detail -/// Combinator to run all promises to completion, and return a tuple -/// of their results. template GPR_ATTRIBUTE_ALWAYS_INLINE_FUNCTION inline promise_detail::Join Join(Promise... promises) { From d2615ff0f8602103b0f798770eea77770fa1fc39 Mon Sep 17 00:00:00 2001 From: Kannan J Date: Tue, 17 Dec 2024 10:55:37 -0800 Subject: [PATCH 07/26] [interop] Add grpc-java 1.68.2 and 1.69.0 to client_matrix.py (#38292) Closes #38292 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38292 from kannanjgithub:interop_matrix_1.69.0 6589269a1d635488cd118c5951c4f884d6083c81 PiperOrigin-RevId: 707166681 --- tools/interop_matrix/client_matrix.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/interop_matrix/client_matrix.py b/tools/interop_matrix/client_matrix.py index c91f3109520c3..07c771ba7b031 100644 --- a/tools/interop_matrix/client_matrix.py +++ b/tools/interop_matrix/client_matrix.py @@ -455,7 +455,8 @@ def __init__(self, patch=[], runtimes=[], testcases_file=None): ("v1.65.1", ReleaseInfo()), ("v1.66.0", ReleaseInfo()), ("v1.67.1", ReleaseInfo()), - ("v1.68.1", ReleaseInfo()), + ("v1.68.2", ReleaseInfo()), + ("v1.69.0", ReleaseInfo()), ] ), "python": OrderedDict( From a04e2f526afd1127bcc08630c690dee1079e3973 Mon Sep 17 00:00:00 2001 From: Tanvi Jagtap <139093547+tanvi-jagtap@users.noreply.github.com> Date: Tue, 17 Dec 2024 10:57:14 -0800 Subject: [PATCH 08/26] [PH2][Promise][Test] Test for if combinator (#38294) Testing the if combinator 1. Adding one test that asserts the case if the condition promise returns Pending. 2. Asserts which lambda should ( and should not ) be executed for the given conditions. Closes #38294 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38294 from tanvi-jagtap:ph2_combinator_if_tests ee4a0741f8aa436d0fb3eac20d7fa11d75f16357 PiperOrigin-RevId: 707167415 --- test/core/promise/if_test.cc | 153 ++++++++++++++++++++++++++++++----- 1 file changed, 135 insertions(+), 18 deletions(-) diff --git a/test/core/promise/if_test.cc b/test/core/promise/if_test.cc index 77894d1565cd5..218c0916d0df9 100644 --- a/test/core/promise/if_test.cc +++ b/test/core/promise/if_test.cc @@ -19,43 +19,160 @@ namespace grpc_core { TEST(IfTest, ChooseTrue) { - EXPECT_EQ(If([]() { return true; }, []() { return 1; }, []() { return 2; })(), - Poll(1)); + int execution_order = 0; + EXPECT_EQ(If( + [&execution_order]() { + execution_order = (10 * execution_order) + 1; + return true; + }, + [&execution_order]() { + execution_order = (10 * execution_order) + 2; + return 2; + }, + [&execution_order]() { + execution_order = (10 * execution_order) + 3; + return 3; + })(), + Poll(2)); + EXPECT_EQ(execution_order, 12); } TEST(IfTest, ChooseFalse) { - EXPECT_EQ( - If([]() { return false; }, []() { return 1; }, []() { return 2; })(), - Poll(2)); + int execution_order = 0; + EXPECT_EQ(If( + [&execution_order]() { + execution_order = (10 * execution_order) + 1; + return false; + }, + [&execution_order]() { + execution_order = (10 * execution_order) + 2; + return 2; + }, + [&execution_order]() { + execution_order = (10 * execution_order) + 3; + return 3; + })(), + Poll(3)); + EXPECT_EQ(execution_order, 13); } TEST(IfTest, ChooseSuccessfulTrue) { - EXPECT_EQ(If([]() { return absl::StatusOr(true); }, - []() { return absl::StatusOr(1); }, - []() { return absl::StatusOr(2); })(), - Poll>(absl::StatusOr(1))); + int execution_order = 0; + EXPECT_EQ(If( + [&execution_order]() { + execution_order = (10 * execution_order) + 1; + return absl::StatusOr(true); + }, + [&execution_order]() { + execution_order = (10 * execution_order) + 2; + return absl::StatusOr(2); + }, + [&execution_order]() { + execution_order = (10 * execution_order) + 3; + return absl::StatusOr(3); + })(), + Poll>(absl::StatusOr(2))); + EXPECT_EQ(execution_order, 12); } TEST(IfTest, ChooseSuccessfulFalse) { - EXPECT_EQ(If([]() { return absl::StatusOr(false); }, - []() { return absl::StatusOr(1); }, - []() { return absl::StatusOr(2); })(), - Poll>(absl::StatusOr(2))); + int execution_order = 0; + EXPECT_EQ(If( + [&execution_order]() { + execution_order = (10 * execution_order) + 1; + return absl::StatusOr(false); + }, + [&execution_order]() { + execution_order = (10 * execution_order) + 2; + return absl::StatusOr(2); + }, + [&execution_order]() { + execution_order = (10 * execution_order) + 3; + return absl::StatusOr(3); + })(), + Poll>(absl::StatusOr(3))); + EXPECT_EQ(execution_order, 13); } TEST(IfTest, ChooseFailure) { - EXPECT_EQ(If([]() { return absl::StatusOr(); }, - []() { return absl::StatusOr(1); }, - []() { return absl::StatusOr(2); })(), + int execution_order = 0; + EXPECT_EQ(If( + [&execution_order]() { + execution_order = (10 * execution_order) + 1; + return absl::StatusOr(); + }, + [&execution_order]() { + execution_order = (10 * execution_order) + 2; + return absl::StatusOr(2); + }, + [&execution_order]() { + execution_order = (10 * execution_order) + 3; + return absl::StatusOr(3); + })(), Poll>(absl::StatusOr())); + EXPECT_EQ(execution_order, 1); +} + +TEST(IfTest, ChoosePending) { + int execution_order = 0; + int once = false; + auto if_combiner = If( + [&execution_order, &once]() -> Poll { + execution_order = (10 * execution_order) + 1; + if (once) return true; + once = true; + return Pending{}; + }, + [&execution_order]() { + execution_order = (10 * execution_order) + 2; + return 2; + }, + [&execution_order]() { + execution_order = (10 * execution_order) + 3; + return 3; + }); + + Poll first_execution = if_combiner(); + EXPECT_FALSE(first_execution.ready()); + EXPECT_EQ(execution_order, 1); + + execution_order = 0; + Poll second_execution = if_combiner(); + EXPECT_TRUE(second_execution.ready()); + EXPECT_EQ(second_execution.value(), 2); + EXPECT_EQ(execution_order, 12); } TEST(IfTest, ImmediateChooseTrue) { - EXPECT_EQ(If(true, []() { return 1; }, []() { return 2; })(), Poll(1)); + int execution_order = 0; + EXPECT_EQ(If( + true, + [&execution_order]() { + execution_order = (10 * execution_order) + 2; + return 2; + }, + [&execution_order]() { + execution_order = (10 * execution_order) + 3; + return 3; + })(), + Poll(2)); + EXPECT_EQ(execution_order, 2); } TEST(IfTest, ImmediateChooseFalse) { - EXPECT_EQ(If(false, []() { return 1; }, []() { return 2; })(), Poll(2)); + int execution_order = 0; + EXPECT_EQ(If( + false, + [&execution_order]() { + execution_order = (10 * execution_order) + 2; + return 2; + }, + [&execution_order]() { + execution_order = (10 * execution_order) + 3; + return 3; + })(), + Poll(3)); + EXPECT_EQ(execution_order, 3); } } // namespace grpc_core From d04a97b694638b61e54898837bd559588f1d1b27 Mon Sep 17 00:00:00 2001 From: Yijie Ma Date: Tue, 17 Dec 2024 11:24:45 -0800 Subject: [PATCH 09/26] [Reland] [EventEngine] Migrate httpcli to use EventEngine DNSResolver (#38183) Closes #38183 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38183 from yijiem:httpcli-ee-dns-migration bd090914d5a2e1fb3d27330922fb27e408ba3e68 PiperOrigin-RevId: 707180165 --- BUILD | 5 +- src/core/util/http_client/httpcli.cc | 84 ++++++++++++++++++++++------ src/core/util/http_client/httpcli.h | 18 ++++-- 3 files changed, 83 insertions(+), 24 deletions(-) diff --git a/BUILD b/BUILD index 1b6b852009289..b3f5d3e2e4295 100644 --- a/BUILD +++ b/BUILD @@ -3872,6 +3872,7 @@ grpc_cc_library( deps = [ "config", "debug_location", + "event_engine_base_hdrs", "exec_ctx", "gpr", "grpc_base", @@ -3883,17 +3884,17 @@ grpc_cc_library( "orphanable", "ref_counted_ptr", "resource_quota_api", - "sockaddr_utils", "uri", "//src/core:channel_args", "//src/core:channel_args_preconditioning", "//src/core:closure", "//src/core:error", "//src/core:error_utils", + "//src/core:event_engine_common", + "//src/core:event_engine_tcp_socket_utils", "//src/core:handshaker_registry", "//src/core:iomgr_fwd", "//src/core:pollset_set", - "//src/core:resolved_address", "//src/core:resource_quota", "//src/core:slice", "//src/core:slice_refcount", diff --git a/src/core/util/http_client/httpcli.cc b/src/core/util/http_client/httpcli.cc index 5ddffec3c22d6..c37df768e0e23 100644 --- a/src/core/util/http_client/httpcli.cc +++ b/src/core/util/http_client/httpcli.cc @@ -35,9 +35,10 @@ #include "src/core/handshaker/handshaker.h" #include "src/core/handshaker/handshaker_registry.h" #include "src/core/handshaker/tcp_connect/tcp_connect_handshaker.h" -#include "src/core/lib/address_utils/sockaddr_utils.h" #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/channel/channel_args_preconditioning.h" +#include "src/core/lib/event_engine/resolved_address_internal.h" +#include "src/core/lib/event_engine/tcp_socket_utils.h" #include "src/core/lib/iomgr/endpoint.h" #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/pollset_set.h" @@ -55,6 +56,9 @@ namespace grpc_core { namespace { +using grpc_event_engine::experimental::EventEngine; +using grpc_event_engine::experimental::ResolvedAddressToURI; + grpc_httpcli_get_override g_get_override; grpc_httpcli_post_override g_post_override; grpc_httpcli_put_override g_put_override; @@ -171,7 +175,15 @@ HttpRequest::HttpRequest( pollent_(pollent), pollset_set_(grpc_pollset_set_create()), test_only_generate_response_(std::move(test_only_generate_response)), - resolver_(GetDNSResolver()) { + use_event_engine_dns_resolver_(IsEventEngineDnsNonClientChannelEnabled()), + resolver_(!use_event_engine_dns_resolver_ ? GetDNSResolver() : nullptr), + ee_resolver_( + use_event_engine_dns_resolver_ + ? ChannelArgs::FromC(channel_args_) + .GetObjectRef() + ->GetDNSResolver( + EventEngine::DNSResolver::ResolverOptions()) + : absl::InternalError("EventEngine DNS is not enabled")) { grpc_http_parser_init(&parser_, GRPC_HTTP_RESPONSE, response); grpc_slice_buffer_init(&incoming_); grpc_slice_buffer_init(&outgoing_); @@ -204,11 +216,39 @@ void HttpRequest::Start() { if (test_only_generate_response_.has_value()) { if (test_only_generate_response_.value()()) return; } + if (use_event_engine_dns_resolver_ && !ee_resolver_.ok()) { + Finish(ee_resolver_.status()); + return; + } Ref().release(); // ref held by pending DNS resolution - dns_request_handle_ = resolver_->LookupHostname( - absl::bind_front(&HttpRequest::OnResolved, this), uri_.authority(), - uri_.scheme(), kDefaultDNSRequestTimeout, pollset_set_, - /*name_server=*/""); + if (use_event_engine_dns_resolver_) { + (*ee_resolver_) + ->LookupHostname( + [this](absl::StatusOr> + addresses_or) { + ApplicationCallbackExecCtx callback_exec_ctx; + ExecCtx exec_ctx; + OnResolved(addresses_or); + }, + uri_.authority(), uri_.scheme()); + } else { + dns_request_handle_ = resolver_->LookupHostname( + [this](absl::StatusOr> addresses) { + if (addresses.ok()) { + std::vector ee_addresses; + for (const auto& addr : *addresses) { + ee_addresses.push_back( + grpc_event_engine::experimental::CreateResolvedAddress(addr)); + } + OnResolved(ee_addresses); + } else { + OnResolved(addresses.status()); + } + }, + uri_.authority(), uri_.scheme(), kDefaultDNSRequestTimeout, + pollset_set_, + /*name_server=*/""); + } } void HttpRequest::Orphan() { @@ -217,10 +257,16 @@ void HttpRequest::Orphan() { CHECK(!cancelled_); cancelled_ = true; // cancel potentially pending DNS resolution. - if (dns_request_handle_.has_value() && - resolver_->Cancel(dns_request_handle_.value())) { - Finish(GRPC_ERROR_CREATE("cancelled during DNS resolution")); - Unref(); + if (use_event_engine_dns_resolver_) { + if (*ee_resolver_ != nullptr) { + ee_resolver_->reset(); + } + } else { + if (dns_request_handle_.has_value() && + resolver_->Cancel(dns_request_handle_.value())) { + Finish(GRPC_ERROR_CREATE("cancelled during DNS resolution")); + Unref(); + } } if (handshake_mgr_ != nullptr) { // Shutdown will cancel any ongoing tcp connect. @@ -236,8 +282,7 @@ void HttpRequest::AppendError(grpc_error_handle error) { if (overall_error_.ok()) { overall_error_ = GRPC_ERROR_CREATE("Failed HTTP/1 client request"); } - const grpc_resolved_address* addr = &addresses_[next_address_ - 1]; - auto addr_text = grpc_sockaddr_to_uri(addr); + auto addr_text = ResolvedAddressToURI(addresses_[next_address_ - 1]); if (addr_text.ok()) error = AddMessagePrefix(*addr_text, std::move(error)); overall_error_ = grpc_error_add_child(overall_error_, std::move(error)); } @@ -311,7 +356,7 @@ void HttpRequest::OnHandshakeDone(absl::StatusOr result) { StartWrite(); } -void HttpRequest::DoHandshake(const grpc_resolved_address* addr) { +void HttpRequest::DoHandshake(const EventEngine::ResolvedAddress& addr) { // Create the security connector using the credentials and target name. ChannelArgs args = ChannelArgs::FromC(channel_args_); RefCountedPtr sc = @@ -322,7 +367,7 @@ void HttpRequest::DoHandshake(const grpc_resolved_address* addr) { &overall_error_, 1)); return; } - absl::StatusOr address = grpc_sockaddr_to_uri(addr); + absl::StatusOr address = ResolvedAddressToURI(addr); if (!address.ok()) { Finish(GRPC_ERROR_CREATE_REFERENCING("Failed to extract URI from address", &overall_error_, 1)); @@ -355,15 +400,18 @@ void HttpRequest::NextAddress(grpc_error_handle error) { &overall_error_, 1)); return; } - const grpc_resolved_address* addr = &addresses_[next_address_++]; - DoHandshake(addr); + DoHandshake(addresses_[next_address_++]); } void HttpRequest::OnResolved( - absl::StatusOr> addresses_or) { + absl::StatusOr> addresses_or) { RefCountedPtr unreffer(this); MutexLock lock(&mu_); - dns_request_handle_.reset(); + if (use_event_engine_dns_resolver_) { + ee_resolver_->reset(); + } else { + dns_request_handle_.reset(); + } if (cancelled_) { Finish(GRPC_ERROR_CREATE("cancelled during DNS resolution")); return; diff --git a/src/core/util/http_client/httpcli.h b/src/core/util/http_client/httpcli.h index 8857d0df01476..e242a7808c694 100644 --- a/src/core/util/http_client/httpcli.h +++ b/src/core/util/http_client/httpcli.h @@ -19,6 +19,7 @@ #ifndef GRPC_SRC_CORE_UTIL_HTTP_CLIENT_HTTPCLI_H #define GRPC_SRC_CORE_UTIL_HTTP_CLIENT_HTTPCLI_H +#include #include #include #include @@ -42,7 +43,6 @@ #include "src/core/lib/iomgr/iomgr_internal.h" #include "src/core/lib/iomgr/polling_entity.h" #include "src/core/lib/iomgr/resolve_address.h" -#include "src/core/lib/iomgr/resolved_address.h" #include "src/core/lib/resource_quota/resource_quota.h" #include "src/core/util/debug_location.h" #include "src/core/util/http_client/parser.h" @@ -225,13 +225,16 @@ class HttpRequest : public InternallyRefCounted { void OnHandshakeDone(absl::StatusOr result); - void DoHandshake(const grpc_resolved_address* addr) + void DoHandshake( + const grpc_event_engine::experimental::EventEngine::ResolvedAddress& addr) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_); void NextAddress(grpc_error_handle error) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_); void OnResolved( - absl::StatusOr> addresses_or); + absl::StatusOr> + addresses_or); const URI uri_; const grpc_slice request_text_; @@ -252,16 +255,23 @@ class HttpRequest : public InternallyRefCounted { RefCountedPtr handshake_mgr_ ABSL_GUARDED_BY(mu_); bool cancelled_ ABSL_GUARDED_BY(mu_) = false; grpc_http_parser parser_ ABSL_GUARDED_BY(mu_); - std::vector addresses_ ABSL_GUARDED_BY(mu_); + std::vector + addresses_ ABSL_GUARDED_BY(mu_); size_t next_address_ ABSL_GUARDED_BY(mu_) = 0; int have_read_byte_ ABSL_GUARDED_BY(mu_) = 0; grpc_iomgr_object iomgr_obj_ ABSL_GUARDED_BY(mu_); grpc_slice_buffer incoming_ ABSL_GUARDED_BY(mu_); grpc_slice_buffer outgoing_ ABSL_GUARDED_BY(mu_); grpc_error_handle overall_error_ ABSL_GUARDED_BY(mu_) = absl::OkStatus(); + // TODO(yijiem): remove these once event_engine_dns_non_client_channel + // experiment is fully enabled. + bool use_event_engine_dns_resolver_; std::shared_ptr resolver_; absl::optional dns_request_handle_ ABSL_GUARDED_BY(mu_) = DNSResolver::kNullHandle; + absl::StatusOr> + ee_resolver_; }; } // namespace grpc_core From 3f001f748250a45384f31567133cd3d6b0198c32 Mon Sep 17 00:00:00 2001 From: Marcel Date: Tue, 17 Dec 2024 11:26:11 -0800 Subject: [PATCH 10/26] Use Label() instead of specifying the repo name (#38280) This allows dependents to use another repo name and allows to avoid specifying transitive dependencies with Bzlmod. Closes #38280 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38280 from mering:use-label 692a139dece429ed56fee7a1dee51ec19b7eebf3 PiperOrigin-RevId: 707180688 --- bazel/cc_grpc_library.bzl | 4 ++-- bazel/generate_objc.bzl | 4 ++-- bazel/objc_grpc_library.bzl | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/bazel/cc_grpc_library.bzl b/bazel/cc_grpc_library.bzl index f23ac0d5b65ae..f56ed1441cece 100644 --- a/bazel/cc_grpc_library.bzl +++ b/bazel/cc_grpc_library.bzl @@ -102,7 +102,7 @@ def cc_grpc_library( generate_cc( name = codegen_grpc_target, srcs = proto_targets, - plugin = "@com_github_grpc_grpc//src/compiler:grpc_cpp_plugin", + plugin = Label("//src/compiler:grpc_cpp_plugin"), well_known_protos = well_known_protos, generate_mocks = generate_mocks, **kwargs @@ -114,6 +114,6 @@ def cc_grpc_library( hdrs = [":" + codegen_grpc_target], deps = deps + extra_deps + - ["@com_github_grpc_grpc//:grpc++_codegen_proto"], + [Label("//:grpc++_codegen_proto")], **kwargs ) diff --git a/bazel/generate_objc.bzl b/bazel/generate_objc.bzl index d6eeb4cab04df..6fadabc4707f1 100644 --- a/bazel/generate_objc.bzl +++ b/bazel/generate_objc.bzl @@ -163,7 +163,7 @@ generate_objc = rule( providers = [ProtoInfo], ), "plugin": attr.label( - default = "@com_github_grpc_grpc//src/compiler:grpc_objective_c_plugin", + default = Label("//src/compiler:grpc_objective_c_plugin"), executable = True, providers = ["files_to_run"], cfg = "exec", @@ -177,7 +177,7 @@ generate_objc = rule( default = False, ), "well_known_protos": attr.label( - default = "@com_google_protobuf//:well_known_type_protos", + default = Label("@com_google_protobuf//:well_known_type_protos"), ), "_protoc": attr.label( default = Label("@com_google_protobuf//:protoc"), diff --git a/bazel/objc_grpc_library.bzl b/bazel/objc_grpc_library.bzl index dbe07b1811d14..33061ce6e997e 100644 --- a/bazel/objc_grpc_library.bzl +++ b/bazel/objc_grpc_library.bzl @@ -77,8 +77,8 @@ def objc_grpc_library(name, deps, srcs = [], use_well_known_protos = False, **kw "src/objective-c", ], deps = [ - "@com_github_grpc_grpc//src/objective-c:proto_objc_rpc", - "@com_google_protobuf//:protobuf_objc", + Label("//src/objective-c:proto_objc_rpc"), + Label("@com_google_protobuf//:protobuf_objc"), ], **kwargs ) From 4e65d1388e6dff89c4e9f3cce4d692f53b3cbdf8 Mon Sep 17 00:00:00 2001 From: Alisha Nanda Date: Tue, 17 Dec 2024 12:35:32 -0800 Subject: [PATCH 11/26] Remove privacy experiments and update expirations (#38299) Closes #38299 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38299 from ananda1066:remove_pc dbc199a9ab7c90d5abf9b602f1c956af5127a049 PiperOrigin-RevId: 707207731 --- bazel/experiments.bzl | 3 -- src/core/lib/experiments/experiments.cc | 39 ----------------------- src/core/lib/experiments/experiments.h | 24 -------------- src/core/lib/experiments/experiments.yaml | 25 ++------------- 4 files changed, 2 insertions(+), 89 deletions(-) diff --git a/bazel/experiments.bzl b/bazel/experiments.bzl index 2167f16497de3..eee5edf8eedf3 100644 --- a/bazel/experiments.bzl +++ b/bazel/experiments.bzl @@ -19,9 +19,7 @@ EXPERIMENT_ENABLES = { "backoff_cap_initial_at_max": "backoff_cap_initial_at_max", "call_tracer_in_transport": "call_tracer_in_transport", - "canary_client_privacy": "canary_client_privacy", "chaotic_good_legacy_protocol": "chaotic_good_legacy_protocol", - "client_privacy": "client_privacy", "disable_buffer_hint_on_high_memory_pressure": "disable_buffer_hint_on_high_memory_pressure", "event_engine_application_callbacks": "event_engine_application_callbacks", "event_engine_callback_cq": "event_engine_application_callbacks,event_engine_callback_cq", @@ -42,7 +40,6 @@ EXPERIMENT_ENABLES = { "retry_in_callv3": "retry_in_callv3", "rq_fast_reject": "rq_fast_reject", "schedule_cancellation_over_write": "schedule_cancellation_over_write", - "server_privacy": "server_privacy", "tcp_frame_size_tuning": "tcp_frame_size_tuning", "tcp_rcv_lowat": "tcp_rcv_lowat", "time_caching_in_party": "time_caching_in_party", diff --git a/src/core/lib/experiments/experiments.cc b/src/core/lib/experiments/experiments.cc index 703a8a171e924..8ba5cf72b3071 100644 --- a/src/core/lib/experiments/experiments.cc +++ b/src/core/lib/experiments/experiments.cc @@ -29,15 +29,10 @@ const char* const additional_constraints_backoff_cap_initial_at_max = "{}"; const char* const description_call_tracer_in_transport = "Transport directly passes byte counts to CallTracer."; const char* const additional_constraints_call_tracer_in_transport = "{}"; -const char* const description_canary_client_privacy = - "If set, canary client privacy"; -const char* const additional_constraints_canary_client_privacy = "{}"; const char* const description_chaotic_good_legacy_protocol = "If set, use the first version of the chaotic-good protocol when that " "protocol is enabled."; const char* const additional_constraints_chaotic_good_legacy_protocol = "{}"; -const char* const description_client_privacy = "If set, client privacy"; -const char* const additional_constraints_client_privacy = "{}"; const char* const description_disable_buffer_hint_on_high_memory_pressure = "Disable buffer hint flag parsing in the transport under high memory " "pressure."; @@ -118,8 +113,6 @@ const char* const description_schedule_cancellation_over_write = "Allow cancellation op to be scheduled over a write"; const char* const additional_constraints_schedule_cancellation_over_write = "{}"; -const char* const description_server_privacy = "If set, server privacy"; -const char* const additional_constraints_server_privacy = "{}"; const char* const description_tcp_frame_size_tuning = "If set, enables TCP to use RPC size estimation made by higher layers. TCP " "would not indicate completion of a read operation until a specified " @@ -154,13 +147,9 @@ const ExperimentMetadata g_experiment_metadata[] = { additional_constraints_backoff_cap_initial_at_max, nullptr, 0, true, true}, {"call_tracer_in_transport", description_call_tracer_in_transport, additional_constraints_call_tracer_in_transport, nullptr, 0, true, true}, - {"canary_client_privacy", description_canary_client_privacy, - additional_constraints_canary_client_privacy, nullptr, 0, false, false}, {"chaotic_good_legacy_protocol", description_chaotic_good_legacy_protocol, additional_constraints_chaotic_good_legacy_protocol, nullptr, 0, false, true}, - {"client_privacy", description_client_privacy, - additional_constraints_client_privacy, nullptr, 0, false, false}, {"disable_buffer_hint_on_high_memory_pressure", description_disable_buffer_hint_on_high_memory_pressure, additional_constraints_disable_buffer_hint_on_high_memory_pressure, @@ -218,8 +207,6 @@ const ExperimentMetadata g_experiment_metadata[] = { description_schedule_cancellation_over_write, additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, true}, - {"server_privacy", description_server_privacy, - additional_constraints_server_privacy, nullptr, 0, false, false}, {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, {"tcp_rcv_lowat", description_tcp_rcv_lowat, @@ -246,15 +233,10 @@ const char* const additional_constraints_backoff_cap_initial_at_max = "{}"; const char* const description_call_tracer_in_transport = "Transport directly passes byte counts to CallTracer."; const char* const additional_constraints_call_tracer_in_transport = "{}"; -const char* const description_canary_client_privacy = - "If set, canary client privacy"; -const char* const additional_constraints_canary_client_privacy = "{}"; const char* const description_chaotic_good_legacy_protocol = "If set, use the first version of the chaotic-good protocol when that " "protocol is enabled."; const char* const additional_constraints_chaotic_good_legacy_protocol = "{}"; -const char* const description_client_privacy = "If set, client privacy"; -const char* const additional_constraints_client_privacy = "{}"; const char* const description_disable_buffer_hint_on_high_memory_pressure = "Disable buffer hint flag parsing in the transport under high memory " "pressure."; @@ -335,8 +317,6 @@ const char* const description_schedule_cancellation_over_write = "Allow cancellation op to be scheduled over a write"; const char* const additional_constraints_schedule_cancellation_over_write = "{}"; -const char* const description_server_privacy = "If set, server privacy"; -const char* const additional_constraints_server_privacy = "{}"; const char* const description_tcp_frame_size_tuning = "If set, enables TCP to use RPC size estimation made by higher layers. TCP " "would not indicate completion of a read operation until a specified " @@ -371,13 +351,9 @@ const ExperimentMetadata g_experiment_metadata[] = { additional_constraints_backoff_cap_initial_at_max, nullptr, 0, true, true}, {"call_tracer_in_transport", description_call_tracer_in_transport, additional_constraints_call_tracer_in_transport, nullptr, 0, true, true}, - {"canary_client_privacy", description_canary_client_privacy, - additional_constraints_canary_client_privacy, nullptr, 0, false, false}, {"chaotic_good_legacy_protocol", description_chaotic_good_legacy_protocol, additional_constraints_chaotic_good_legacy_protocol, nullptr, 0, false, true}, - {"client_privacy", description_client_privacy, - additional_constraints_client_privacy, nullptr, 0, false, false}, {"disable_buffer_hint_on_high_memory_pressure", description_disable_buffer_hint_on_high_memory_pressure, additional_constraints_disable_buffer_hint_on_high_memory_pressure, @@ -435,8 +411,6 @@ const ExperimentMetadata g_experiment_metadata[] = { description_schedule_cancellation_over_write, additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, true}, - {"server_privacy", description_server_privacy, - additional_constraints_server_privacy, nullptr, 0, false, false}, {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, {"tcp_rcv_lowat", description_tcp_rcv_lowat, @@ -463,15 +437,10 @@ const char* const additional_constraints_backoff_cap_initial_at_max = "{}"; const char* const description_call_tracer_in_transport = "Transport directly passes byte counts to CallTracer."; const char* const additional_constraints_call_tracer_in_transport = "{}"; -const char* const description_canary_client_privacy = - "If set, canary client privacy"; -const char* const additional_constraints_canary_client_privacy = "{}"; const char* const description_chaotic_good_legacy_protocol = "If set, use the first version of the chaotic-good protocol when that " "protocol is enabled."; const char* const additional_constraints_chaotic_good_legacy_protocol = "{}"; -const char* const description_client_privacy = "If set, client privacy"; -const char* const additional_constraints_client_privacy = "{}"; const char* const description_disable_buffer_hint_on_high_memory_pressure = "Disable buffer hint flag parsing in the transport under high memory " "pressure."; @@ -552,8 +521,6 @@ const char* const description_schedule_cancellation_over_write = "Allow cancellation op to be scheduled over a write"; const char* const additional_constraints_schedule_cancellation_over_write = "{}"; -const char* const description_server_privacy = "If set, server privacy"; -const char* const additional_constraints_server_privacy = "{}"; const char* const description_tcp_frame_size_tuning = "If set, enables TCP to use RPC size estimation made by higher layers. TCP " "would not indicate completion of a read operation until a specified " @@ -588,13 +555,9 @@ const ExperimentMetadata g_experiment_metadata[] = { additional_constraints_backoff_cap_initial_at_max, nullptr, 0, true, true}, {"call_tracer_in_transport", description_call_tracer_in_transport, additional_constraints_call_tracer_in_transport, nullptr, 0, true, true}, - {"canary_client_privacy", description_canary_client_privacy, - additional_constraints_canary_client_privacy, nullptr, 0, false, false}, {"chaotic_good_legacy_protocol", description_chaotic_good_legacy_protocol, additional_constraints_chaotic_good_legacy_protocol, nullptr, 0, false, true}, - {"client_privacy", description_client_privacy, - additional_constraints_client_privacy, nullptr, 0, false, false}, {"disable_buffer_hint_on_high_memory_pressure", description_disable_buffer_hint_on_high_memory_pressure, additional_constraints_disable_buffer_hint_on_high_memory_pressure, @@ -652,8 +615,6 @@ const ExperimentMetadata g_experiment_metadata[] = { description_schedule_cancellation_over_write, additional_constraints_schedule_cancellation_over_write, nullptr, 0, false, true}, - {"server_privacy", description_server_privacy, - additional_constraints_server_privacy, nullptr, 0, false, false}, {"tcp_frame_size_tuning", description_tcp_frame_size_tuning, additional_constraints_tcp_frame_size_tuning, nullptr, 0, false, true}, {"tcp_rcv_lowat", description_tcp_rcv_lowat, diff --git a/src/core/lib/experiments/experiments.h b/src/core/lib/experiments/experiments.h index 66341e3826046..95a77ff405e65 100644 --- a/src/core/lib/experiments/experiments.h +++ b/src/core/lib/experiments/experiments.h @@ -61,9 +61,7 @@ namespace grpc_core { inline bool IsBackoffCapInitialAtMaxEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_IN_TRANSPORT inline bool IsCallTracerInTransportEnabled() { return true; } -inline bool IsCanaryClientPrivacyEnabled() { return false; } inline bool IsChaoticGoodLegacyProtocolEnabled() { return false; } -inline bool IsClientPrivacyEnabled() { return false; } inline bool IsDisableBufferHintOnHighMemoryPressureEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_APPLICATION_CALLBACKS inline bool IsEventEngineApplicationCallbacksEnabled() { return true; } @@ -88,7 +86,6 @@ inline bool IsPromiseBasedInprocTransportEnabled() { return false; } inline bool IsRetryInCallv3Enabled() { return false; } inline bool IsRqFastRejectEnabled() { return false; } inline bool IsScheduleCancellationOverWriteEnabled() { return false; } -inline bool IsServerPrivacyEnabled() { return false; } inline bool IsTcpFrameSizeTuningEnabled() { return false; } inline bool IsTcpRcvLowatEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_TIME_CACHING_IN_PARTY @@ -104,9 +101,7 @@ inline bool IsWorkSerializerDispatchEnabled() { return true; } inline bool IsBackoffCapInitialAtMaxEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_IN_TRANSPORT inline bool IsCallTracerInTransportEnabled() { return true; } -inline bool IsCanaryClientPrivacyEnabled() { return false; } inline bool IsChaoticGoodLegacyProtocolEnabled() { return false; } -inline bool IsClientPrivacyEnabled() { return false; } inline bool IsDisableBufferHintOnHighMemoryPressureEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_APPLICATION_CALLBACKS inline bool IsEventEngineApplicationCallbacksEnabled() { return true; } @@ -134,7 +129,6 @@ inline bool IsPromiseBasedInprocTransportEnabled() { return false; } inline bool IsRetryInCallv3Enabled() { return false; } inline bool IsRqFastRejectEnabled() { return false; } inline bool IsScheduleCancellationOverWriteEnabled() { return false; } -inline bool IsServerPrivacyEnabled() { return false; } inline bool IsTcpFrameSizeTuningEnabled() { return false; } inline bool IsTcpRcvLowatEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_TIME_CACHING_IN_PARTY @@ -150,9 +144,7 @@ inline bool IsWorkSerializerDispatchEnabled() { return true; } inline bool IsBackoffCapInitialAtMaxEnabled() { return true; } #define GRPC_EXPERIMENT_IS_INCLUDED_CALL_TRACER_IN_TRANSPORT inline bool IsCallTracerInTransportEnabled() { return true; } -inline bool IsCanaryClientPrivacyEnabled() { return false; } inline bool IsChaoticGoodLegacyProtocolEnabled() { return false; } -inline bool IsClientPrivacyEnabled() { return false; } inline bool IsDisableBufferHintOnHighMemoryPressureEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_EVENT_ENGINE_APPLICATION_CALLBACKS inline bool IsEventEngineApplicationCallbacksEnabled() { return true; } @@ -180,7 +172,6 @@ inline bool IsPromiseBasedInprocTransportEnabled() { return false; } inline bool IsRetryInCallv3Enabled() { return false; } inline bool IsRqFastRejectEnabled() { return false; } inline bool IsScheduleCancellationOverWriteEnabled() { return false; } -inline bool IsServerPrivacyEnabled() { return false; } inline bool IsTcpFrameSizeTuningEnabled() { return false; } inline bool IsTcpRcvLowatEnabled() { return false; } #define GRPC_EXPERIMENT_IS_INCLUDED_TIME_CACHING_IN_PARTY @@ -196,9 +187,7 @@ inline bool IsWorkSerializerDispatchEnabled() { return true; } enum ExperimentIds { kExperimentIdBackoffCapInitialAtMax, kExperimentIdCallTracerInTransport, - kExperimentIdCanaryClientPrivacy, kExperimentIdChaoticGoodLegacyProtocol, - kExperimentIdClientPrivacy, kExperimentIdDisableBufferHintOnHighMemoryPressure, kExperimentIdEventEngineApplicationCallbacks, kExperimentIdEventEngineCallbackCq, @@ -219,7 +208,6 @@ enum ExperimentIds { kExperimentIdRetryInCallv3, kExperimentIdRqFastReject, kExperimentIdScheduleCancellationOverWrite, - kExperimentIdServerPrivacy, kExperimentIdTcpFrameSizeTuning, kExperimentIdTcpRcvLowat, kExperimentIdTimeCachingInParty, @@ -236,18 +224,10 @@ inline bool IsBackoffCapInitialAtMaxEnabled() { inline bool IsCallTracerInTransportEnabled() { return IsExperimentEnabled(); } -#define GRPC_EXPERIMENT_IS_INCLUDED_CANARY_CLIENT_PRIVACY -inline bool IsCanaryClientPrivacyEnabled() { - return IsExperimentEnabled(); -} #define GRPC_EXPERIMENT_IS_INCLUDED_CHAOTIC_GOOD_LEGACY_PROTOCOL inline bool IsChaoticGoodLegacyProtocolEnabled() { return IsExperimentEnabled(); } -#define GRPC_EXPERIMENT_IS_INCLUDED_CLIENT_PRIVACY -inline bool IsClientPrivacyEnabled() { - return IsExperimentEnabled(); -} #define GRPC_EXPERIMENT_IS_INCLUDED_DISABLE_BUFFER_HINT_ON_HIGH_MEMORY_PRESSURE inline bool IsDisableBufferHintOnHighMemoryPressureEnabled() { return IsExperimentEnabled< @@ -329,10 +309,6 @@ inline bool IsRqFastRejectEnabled() { inline bool IsScheduleCancellationOverWriteEnabled() { return IsExperimentEnabled(); } -#define GRPC_EXPERIMENT_IS_INCLUDED_SERVER_PRIVACY -inline bool IsServerPrivacyEnabled() { - return IsExperimentEnabled(); -} #define GRPC_EXPERIMENT_IS_INCLUDED_TCP_FRAME_SIZE_TUNING inline bool IsTcpFrameSizeTuningEnabled() { return IsExperimentEnabled(); diff --git a/src/core/lib/experiments/experiments.yaml b/src/core/lib/experiments/experiments.yaml index f7862622f806b..4c6310b1ce004 100644 --- a/src/core/lib/experiments/experiments.yaml +++ b/src/core/lib/experiments/experiments.yaml @@ -50,25 +50,11 @@ expiry: 2025/02/01 owner: roth@google.com test_tags: [] -- name: canary_client_privacy - description: - If set, canary client privacy - expiry: 2025/01/01 - owner: alishananda@google.com - test_tags: [] - allow_in_fuzzing_config: false - name: chaotic_good_legacy_protocol description: If set, use the first version of the chaotic-good protocol when that protocol is enabled. expiry: 2025/01/15 owner: ctiller@google.com test_tags: [core_end2end_test] -- name: client_privacy - description: - If set, client privacy - expiry: 2025/01/01 - owner: alishananda@google.com - test_tags: [] - allow_in_fuzzing_config: false - name: disable_buffer_hint_on_high_memory_pressure description: Disable buffer hint flag parsing in the transport under high memory pressure. @@ -127,7 +113,7 @@ Experiment to throttle pings to a period of 1 min when GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA limit has reached (instead of completely blocking). - expiry: 2024/12/31 + expiry: 2024/01/30 owner: yashkt@google.com test_tags: [] - name: monitoring_experiment @@ -194,13 +180,6 @@ expiry: 2025/03/01 owner: vigneshbabu@google.com test_tags: [] -- name: server_privacy - description: - If set, server privacy - expiry: 2025/01/01 - owner: alishananda@google.com - test_tags: [] - allow_in_fuzzing_config: false - name: tcp_frame_size_tuning description: If set, enables TCP to use RPC size estimation made by higher layers. @@ -222,7 +201,7 @@ test_tags: [] - name: trace_record_callops description: Enables tracing of call batch initiation and completion. - expiry: 2025/01/01 + expiry: 2025/01/30 owner: vigneshbabu@google.com test_tags: [] - name: unconstrained_max_quota_buffer_size From 0b9ff8edb04d17d88c4224c3b1694a763a142374 Mon Sep 17 00:00:00 2001 From: Alisha Nanda Date: Wed, 18 Dec 2024 11:45:53 -0800 Subject: [PATCH 12/26] [experiments] Fix expiration date (#38310) Closes #38310 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38310 from ananda1066:exp 68fb013d2ddd2278f706646e4294cf212c688df7 PiperOrigin-RevId: 707620925 --- src/core/lib/experiments/experiments.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/lib/experiments/experiments.yaml b/src/core/lib/experiments/experiments.yaml index 4c6310b1ce004..6917f677774ae 100644 --- a/src/core/lib/experiments/experiments.yaml +++ b/src/core/lib/experiments/experiments.yaml @@ -113,7 +113,7 @@ Experiment to throttle pings to a period of 1 min when GRPC_ARG_HTTP2_MAX_PINGS_WITHOUT_DATA limit has reached (instead of completely blocking). - expiry: 2024/01/30 + expiry: 2025/01/30 owner: yashkt@google.com test_tags: [] - name: monitoring_experiment From 1d49120fd83039c1c7710818c9d34cadbe96828b Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Wed, 18 Dec 2024 15:05:37 -0800 Subject: [PATCH 13/26] [experiments] Verify expiration date makes sense (#38301) Closes #38301 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38301 from ctiller:expire 325fc80a3c7ac32711df963c673ac4801a01ee8f PiperOrigin-RevId: 707680259 --- src/core/lib/experiments/experiments.yaml | 4 ++-- .../experiments/fixtures/test_experiments.yaml | 8 ++++---- tools/codegen/core/experiments_compiler.py | 17 ++++++++++++++--- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/core/lib/experiments/experiments.yaml b/src/core/lib/experiments/experiments.yaml index 6917f677774ae..56a8a69a8fd8f 100644 --- a/src/core/lib/experiments/experiments.yaml +++ b/src/core/lib/experiments/experiments.yaml @@ -105,7 +105,7 @@ test_tags: [resource_quota_test] - name: local_connector_secure description: Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP connections. - expiry: 2024/12/30 + expiry: 2024/01/30 owner: mattstev@google.com test_tags: ["core_end2end_test"] - name: max_pings_wo_data_throttle @@ -214,6 +214,6 @@ Have the work serializer dispatch work to event engine for every callback, instead of running things inline in the first thread that successfully enqueues work. - expiry: 2024/12/31 + expiry: 2024/01/30 owner: ysseung@google.com test_tags: ["core_end2end_test", "cpp_end2end_test", "xds_end2end_test", "lb_unit_test"] diff --git a/test/core/experiments/fixtures/test_experiments.yaml b/test/core/experiments/fixtures/test_experiments.yaml index 5be0e1c9e003c..e5044341ebc5b 100644 --- a/test/core/experiments/fixtures/test_experiments.yaml +++ b/test/core/experiments/fixtures/test_experiments.yaml @@ -14,18 +14,18 @@ - name: test_experiment_1 description: Test Experiment 1 - expiry: 2023/08/01 + expiry: 2023/08/30 owner: blah@abc.com test_tags: [experiments_tag_test] - name: test_experiment_2 description: Test Experiment 2 - expiry: 2023/01/01 + expiry: 2023/01/30 owner: blah1@abc.com - name: test_experiment_3 description: Test Experiment 3 - expiry: 2024/01/01 + expiry: 2024/01/30 owner: blah2@abc.com - name: test_experiment_4 description: Test Experiment 4 - expiry: 2022/01/01 + expiry: 2022/01/30 owner: blah3@abc.com diff --git a/tools/codegen/core/experiments_compiler.py b/tools/codegen/core/experiments_compiler.py index 3d3cc2ee13d44..743a5bd38d2d8 100644 --- a/tools/codegen/core/experiments_compiler.py +++ b/tools/codegen/core/experiments_compiler.py @@ -218,16 +218,27 @@ def __init__(self, attributes): def IsValid(self, check_expiry=False): if self._error: return False - if not check_expiry: - return True if ( self._name == "monitoring_experiment" and self._expiry == "never-ever" ): return True + expiry = datetime.datetime.strptime(self._expiry, "%Y/%m/%d").date() + if ( + expiry.month == 11 + or expiry.month == 12 + or (expiry.month == 1 and expiry.day < 15) + ): + print( + "For experiment %s: Experiment expiration is not allowed between Nov 1 and Jan 15 (experiment lists %s)." + % (self._name, self._expiry) + ) + self._error = True + return False + if not check_expiry: + return True today = datetime.date.today() two_quarters_from_now = today + datetime.timedelta(days=180) - expiry = datetime.datetime.strptime(self._expiry, "%Y/%m/%d").date() if expiry < today: print( "WARNING: experiment %s expired on %s" From 4a72b8844de3515f8a58058714de54d1c22a0f16 Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Wed, 18 Dec 2024 15:35:54 -0800 Subject: [PATCH 14/26] [Dep] Updated opentelemetry-cpp to 1.18.0 (#38317) - Updated opentelemetry-cpp to 1.18.0 (now it's a released one) - Clean up the old `com_github_jupp0r_prometheus_cpp` dep Closes #38317 PiperOrigin-RevId: 707689177 --- bazel/grpc_deps.bzl | 27 ++++--------------- third_party/opentelemetry-cpp | 2 +- .../run_tests/sanity/check_bazel_workspace.py | 8 +++--- tools/run_tests/sanity/check_submodules.sh | 2 +- 4 files changed, 11 insertions(+), 28 deletions(-) diff --git a/bazel/grpc_deps.bzl b/bazel/grpc_deps.bzl index 71fba238ec523..df7f18ac00979 100644 --- a/bazel/grpc_deps.bzl +++ b/bazel/grpc_deps.bzl @@ -320,32 +320,15 @@ def grpc_deps(): ], ) - # TODO(stanleycheung): remove this when prometheus-cpp AND - # opentelemetry-cpp cut a new release - # This override is needed because this fix - # https://github.com/jupp0r/prometheus-cpp/pull/626 - # has not been included in the latest prometheus-cpp release yet. - # We also need opentelemetry-cpp to update their dependency on - # prometheus-cpp after that fix is released. - # Without the fix, we cannot build the prometheus exporter with bazel 6 - if "com_github_jupp0r_prometheus_cpp" not in native.existing_rules(): - http_archive( - name = "com_github_jupp0r_prometheus_cpp", - sha256 = "cdf03ee63fcb1d9e113f7bd525e043c254729dddf19d80396489f5b92c83c18d", - strip_prefix = "prometheus-cpp-b1234816facfdda29845c46696a02998a4af115a", - urls = [ - "https://github.com/jupp0r/prometheus-cpp/archive/b123481.zip", - ], - ) - if "io_opentelemetry_cpp" not in native.existing_rules(): http_archive( name = "io_opentelemetry_cpp", - sha256 = "4b822a2f137b8c2ea403c5ec9a661addcc048aa8ba3afebffd58cbcf218457bc", - strip_prefix = "opentelemetry-cpp-a388e87d72b8321c189c8d41edb746ffa687ce3c", + sha256 = "fb7c38e82ce5a5dcad70be7eafe0d3d4f439e3ef822b414a99db7514580ddac4", + strip_prefix = "opentelemetry-cpp-955a807c0461544560429c2414b8967f6023e590", urls = [ - "https://storage.googleapis.com/grpc-bazel-mirror/github.com/open-telemetry/opentelemetry-cpp/archive/a388e87d72b8321c189c8d41edb746ffa687ce3c.tar.gz", - "https://github.com/open-telemetry/opentelemetry-cpp/archive/a388e87d72b8321c189c8d41edb746ffa687ce3c.tar.gz", + # v1.18.0 + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/open-telemetry/opentelemetry-cpp/archive/955a807c0461544560429c2414b8967f6023e590.tar.gz", + "https://github.com/open-telemetry/opentelemetry-cpp/archive/955a807c0461544560429c2414b8967f6023e590.tar.gz", ], ) diff --git a/third_party/opentelemetry-cpp b/third_party/opentelemetry-cpp index a388e87d72b83..955a807c04615 160000 --- a/third_party/opentelemetry-cpp +++ b/third_party/opentelemetry-cpp @@ -1 +1 @@ -Subproject commit a388e87d72b8321c189c8d41edb746ffa687ce3c +Subproject commit 955a807c0461544560429c2414b8967f6023e590 diff --git a/tools/run_tests/sanity/check_bazel_workspace.py b/tools/run_tests/sanity/check_bazel_workspace.py index cc825901aaeb9..e6ebd880cf102 100755 --- a/tools/run_tests/sanity/check_bazel_workspace.py +++ b/tools/run_tests/sanity/check_bazel_workspace.py @@ -59,8 +59,6 @@ "com_google_fuzztest", "io_opencensus_cpp", "io_opentelemetry_cpp", - # TODO(stanleycheung): remove when prometheus-cpp has new release - "com_github_jupp0r_prometheus_cpp", "envoy_api", _BAZEL_SKYLIB_DEP_NAME, _BAZEL_TOOLCHAINS_DEP_NAME, @@ -91,8 +89,6 @@ "com_google_absl", "com_google_fuzztest", "io_opencensus_cpp", - # TODO(stanleycheung): remove when prometheus-cpp has new release - "com_github_jupp0r_prometheus_cpp", _BAZEL_SKYLIB_DEP_NAME, _BAZEL_TOOLCHAINS_DEP_NAME, _BAZEL_COMPDB_DEP_NAME, @@ -191,6 +187,10 @@ def grpc_python_deps(self): for dep_name in _GRPC_BAZEL_ONLY_DEPS: names_without_bazel_only_deps.remove(dep_name) archive_urls = [names_and_urls[name] for name in names_without_bazel_only_deps] +for url in archive_urls: + if re.search(git_hash_pattern, url) is None: + print("Cannot find the hash value from url", url) + sys.exit(1) workspace_git_hashes = { re.search(git_hash_pattern, url).group() for url in archive_urls } diff --git a/tools/run_tests/sanity/check_submodules.sh b/tools/run_tests/sanity/check_submodules.sh index fd6c9bd82ecc6..d0568a8a249b7 100755 --- a/tools/run_tests/sanity/check_submodules.sh +++ b/tools/run_tests/sanity/check_submodules.sh @@ -35,7 +35,7 @@ third_party/googleapis fe8ba054ad4f7eca946c2d14a63c3f07c0b586a0 third_party/googletest 2dd1c131950043a8ad5ab0d2dda0e0970596586a third_party/opencensus-proto 4aa53e15cbf1a47bc9087e6cfdca214c1eea4e89 third_party/opentelemetry 60fa8754d890b5c55949a8c68dcfd7ab5c2395df -third_party/opentelemetry-cpp a388e87d72b8321c189c8d41edb746ffa687ce3c +third_party/opentelemetry-cpp 955a807c0461544560429c2414b8967f6023e590 third_party/protobuf 2d4414f384dc499af113b5991ce3eaa9df6dd931 third_party/protoc-gen-validate 32c2415389a3538082507ae537e7edd9578c64ed third_party/re2 0c5616df9c0aaa44c9440d87422012423d91c7d1 From c4ce4777c617c790980540a865061c0a0437fb75 Mon Sep 17 00:00:00 2001 From: alto-ruby Date: Thu, 19 Dec 2024 09:07:06 -0800 Subject: [PATCH 15/26] [Ruby] update bundle before building the native lib (#38303) fixes #38298 What happened was that in the rake dock container, Bundler version is 2.6.0; but on the CI host, Bundler version is 2.5.3 When starting the container, Gemfile.lock is mounted to the container as well, which causes in version compatibility issues when it tries to switch back to 2.5.3 in the container. This PR runs bundle update in the container to reconcile the versions of bundler and other germs so the build can succeed. ``` Bundler 2.6.0 is running, but your lockfile was generated with 2.5.3. Installing Bundler 2.5.3 and restarting using that version. Fetching gem metadata from [https://rubygems.org/](https://www.google.com/url?q=https://rubygems.org/&sa=D). Fetching bundler 2.5.3 Installing bundler 2.5.3 ``` Closes #38303 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38303 from alto-ruby:fix-distribution-tests-ruby-linux 1efc15eec85d88a67c43c1686b716ce96262456c PiperOrigin-RevId: 707932172 --- Rakefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Rakefile b/Rakefile index d383cb5ff2fe0..05b92b457be3b 100755 --- a/Rakefile +++ b/Rakefile @@ -184,7 +184,7 @@ task 'gem:native', [:plat] do |t, args| run_rake_compiler(plat, <<~EOT) #{prepare_ccache_cmd} && \ gem update --system --no-document && \ - bundle && \ + bundle update && \ bundle exec rake clean && \ bundle exec rake native:#{plat} pkg/#{spec.full_name}-#{plat}.gem pkg/#{spec.full_name}.gem \ RUBY_CC_VERSION=#{ruby_cc_versions} \ @@ -216,7 +216,7 @@ task 'gem:native', [:plat] do |t, args| run_rake_compiler(plat, <<~EOT) #{prepare_ccache_cmd} && \ gem update --system --no-document && \ - bundle && \ + bundle update && \ bundle exec rake clean && \ export GRPC_RUBY_DEBUG_SYMBOLS_OUTPUT_DIR=#{debug_symbols_dir} && \ bundle exec rake native:#{plat} pkg/#{spec.full_name}-#{plat}.gem pkg/#{spec.full_name}.gem \ From 8184d795bfb46c689e310f5e37b97711a6b807e9 Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Thu, 19 Dec 2024 12:32:21 -0800 Subject: [PATCH 16/26] [CI] Updated Bazel to 7.4.1 in rbe_ubuntu2004 (#38318) - Updated Bazel 7 to 7.4.1 in RBE/Linux --- third_party/toolchains/BUILD | 6 +- third_party/toolchains/README.md | 3 +- .../toolchains/generate_linux_rbe_configs.sh | 4 +- .../LICENSE | 0 .../cc/BUILD | 154 ++++---- .../cc/REPO.bazel} | 0 .../rbe_ubuntu2004_bazel7/cc/WORKSPACE | 0 .../cc/armeabi_cc_toolchain_config.bzl | 0 .../cc/builtin_include_directory_paths | 0 .../cc/cc_toolchain_config.bzl | 366 ++++++++++++------ .../cc/cc_wrapper.sh | 0 .../cc/module.modulemap | 0 .../cc/tools/cpp/empty.cc | 0 .../cc/validate_static_library.sh | 44 +++ .../config/BUILD | 5 +- 15 files changed, 364 insertions(+), 218 deletions(-) rename third_party/toolchains/{rbe_ubuntu2004 => rbe_ubuntu2004_bazel7}/LICENSE (100%) rename third_party/toolchains/{rbe_ubuntu2004 => rbe_ubuntu2004_bazel7}/cc/BUILD (70%) rename third_party/toolchains/{rbe_ubuntu2004/cc/WORKSPACE => rbe_ubuntu2004_bazel7/cc/REPO.bazel} (100%) create mode 100644 third_party/toolchains/rbe_ubuntu2004_bazel7/cc/WORKSPACE rename third_party/toolchains/{rbe_ubuntu2004 => rbe_ubuntu2004_bazel7}/cc/armeabi_cc_toolchain_config.bzl (100%) rename third_party/toolchains/{rbe_ubuntu2004 => rbe_ubuntu2004_bazel7}/cc/builtin_include_directory_paths (100%) rename third_party/toolchains/{rbe_ubuntu2004 => rbe_ubuntu2004_bazel7}/cc/cc_toolchain_config.bzl (84%) rename third_party/toolchains/{rbe_ubuntu2004 => rbe_ubuntu2004_bazel7}/cc/cc_wrapper.sh (100%) rename third_party/toolchains/{rbe_ubuntu2004 => rbe_ubuntu2004_bazel7}/cc/module.modulemap (100%) rename third_party/toolchains/{rbe_ubuntu2004 => rbe_ubuntu2004_bazel7}/cc/tools/cpp/empty.cc (100%) create mode 100644 third_party/toolchains/rbe_ubuntu2004_bazel7/cc/validate_static_library.sh rename third_party/toolchains/{rbe_ubuntu2004 => rbe_ubuntu2004_bazel7}/config/BUILD (94%) diff --git a/third_party/toolchains/BUILD b/third_party/toolchains/BUILD index 6f81bfc6ce300..f3db198d986d0 100644 --- a/third_party/toolchains/BUILD +++ b/third_party/toolchains/BUILD @@ -21,13 +21,13 @@ package(default_visibility = ["//visibility:public"]) # The default toolchain suite for RBE linux, pass it to --crosstool_top alias( name = "rbe_linux_default_toolchain_suite", - actual = "//third_party/toolchains/rbe_ubuntu2004/cc:toolchain", + actual = "//third_party/toolchains/rbe_ubuntu2004_bazel7/cc:toolchain", ) # The default CC toolchain suite for RBE linux alias( name = "rbe_linux_default_cc_toolchain", - actual = "//third_party/toolchains/rbe_ubuntu2004/config:cc-toolchain", + actual = "//third_party/toolchains/rbe_ubuntu2004_bazel7/config:cc-toolchain", ) # The default platform for RBE Linux @@ -46,7 +46,7 @@ platform( os_family = "Linux", ), # Inherit from the platform target generated by 'rbe_configs_gen'. - parents = ["//third_party/toolchains/rbe_ubuntu2004/config:platform"], + parents = ["//third_party/toolchains/rbe_ubuntu2004_bazel7/config:platform"], ) # The default toolchain suite for RBE windows, pass it to --crosstool_top diff --git a/third_party/toolchains/README.md b/third_party/toolchains/README.md index b776d8c85fc26..92032c642ae6b 100644 --- a/third_party/toolchains/README.md +++ b/third_party/toolchains/README.md @@ -1,7 +1,8 @@ # RBE toolchain configuration (Linux and Windows) ## Linux -The `rbe_ubuntu2004` directory contains the autogenerated toolchain configuration for linux RBE. + +The `rbe_ubuntu2004_bazel7` directory contains the autogenerated toolchain configuration for linux RBE. Run `generate_linux_rbe_configs.sh` to regenerate. ## Windows diff --git a/third_party/toolchains/generate_linux_rbe_configs.sh b/third_party/toolchains/generate_linux_rbe_configs.sh index b1a5ad022c136..1faa69d8f6c47 100755 --- a/third_party/toolchains/generate_linux_rbe_configs.sh +++ b/third_party/toolchains/generate_linux_rbe_configs.sh @@ -42,12 +42,12 @@ LINUX_RBE_DOCKER_IMAGE=$(cat ${LINUX_RBE_DOCKERFILE_DIR}.current_version) # Bazel version used for configuring # Needs to be the oldest of the versions from bazel/supported_versions.txt chosen # so that the result is compatible with other supported bazel versions. -BAZEL_VERSION=7.3.1 +BAZEL_VERSION=7.4.1 # TODO(jtattermusch): experiment with --cpp_env_json to simplify bazel build configuration. # Where to store the generated configs (relative to repo root) -CONFIG_OUTPUT_PATH=third_party/toolchains/rbe_ubuntu2004 +CONFIG_OUTPUT_PATH=third_party/toolchains/rbe_ubuntu2004_bazel7 # Delete old generated configs. rm -rf "${REPO_ROOT}/${CONFIG_OUTPUT_PATH}" diff --git a/third_party/toolchains/rbe_ubuntu2004/LICENSE b/third_party/toolchains/rbe_ubuntu2004_bazel7/LICENSE similarity index 100% rename from third_party/toolchains/rbe_ubuntu2004/LICENSE rename to third_party/toolchains/rbe_ubuntu2004_bazel7/LICENSE diff --git a/third_party/toolchains/rbe_ubuntu2004/cc/BUILD b/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/BUILD similarity index 70% rename from third_party/toolchains/rbe_ubuntu2004/cc/BUILD rename to third_party/toolchains/rbe_ubuntu2004_bazel7/cc/BUILD index f993e63333e0f..4398be4d0eb62 100644 --- a/third_party/toolchains/rbe_ubuntu2004/cc/BUILD +++ b/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/BUILD @@ -14,9 +14,9 @@ # This becomes the BUILD file for @local_config_cc// under non-BSD unixes. -load("@rules_cc//cc:defs.bzl", "cc_toolchain", "cc_toolchain_suite") -load(":armeabi_cc_toolchain_config.bzl", "armeabi_cc_toolchain_config") load(":cc_toolchain_config.bzl", "cc_toolchain_config") +load(":armeabi_cc_toolchain_config.bzl", "armeabi_cc_toolchain_config") +load("@rules_cc//cc:defs.bzl", "cc_toolchain", "cc_toolchain_suite") package(default_visibility = ["//visibility:public"]) @@ -54,15 +54,16 @@ filegroup( srcs = ["cc_wrapper.sh"], ) +filegroup( + name = "validate_static_library", + srcs = ["validate_static_library.sh"], +) + filegroup( name = "compiler_deps", - srcs = glob( - ["extra_tools/**"], - allow_empty = True, - ) + [ - ":builtin_include_directory_paths", - ":cc_wrapper", - ], + srcs = glob(["extra_tools/**"], allow_empty = True) + [":builtin_include_directory_paths", + ":cc_wrapper", + ":validate_static_library"], ) # This is the entry point for --crosstool_top. Toolchains are found @@ -80,87 +81,42 @@ cc_toolchain_suite( cc_toolchain( name = "cc-compiler-k8", + toolchain_identifier = "linux_gnu_x86", + toolchain_config = ":linux_gnu_x86", all_files = ":compiler_deps", ar_files = ":compiler_deps", as_files = ":compiler_deps", compiler_files = ":compiler_deps", dwp_files = ":empty", linker_files = ":compiler_deps", - module_map = ":module.modulemap", objcopy_files = ":empty", strip_files = ":empty", supports_header_parsing = 1, supports_param_files = 1, - toolchain_config = ":linux_gnu_x86", - toolchain_identifier = "linux_gnu_x86", + module_map = ":module.modulemap", ) cc_toolchain_config( name = "linux_gnu_x86", - abi_libc_version = "glibc_2.19", - abi_version = "clang", - compile_flags = [ - "-fstack-protector", - "-Wall", - "-Wthread-safety", - "-Wself-assign", - "-Wunused-but-set-parameter", - "-Wno-free-nonheap-object", - "-fcolor-diagnostics", - "-fno-omit-frame-pointer", - ], - compiler = "clang", - conly_flags = [], - coverage_compile_flags = ["--coverage"], - coverage_link_flags = ["--coverage"], cpu = "k8", - cxx_builtin_include_directories = [ - "/usr/local/lib/clang/19/include", - "/usr/local/include", - "/usr/include/x86_64-linux-gnu", - "/usr/include", - "/usr/local/lib/clang/19/share", - "/usr/include/c++/9", - "/usr/include/x86_64-linux-gnu/c++/9", - "/usr/include/c++/9/backward", - "/usr/local/include/c++/v1", - "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk", - ], - cxx_flags = ["-std=c++14"], - dbg_compile_flags = ["-g"], - extra_flags_per_feature = {"use_module_maps": [ - "-Xclang", - "-fno-cxx-modules", - ]}, + compiler = "clang", + toolchain_identifier = "linux_gnu_x86", host_system_name = "i686-unknown-linux-gnu", - link_flags = [ - "-fuse-ld=/usr/local/bin/ld.lld", - "-B/usr/local/bin", - "-Wl,-no-as-needed", - "-Wl,-z,relro,-z,now", - ], - link_libs = [ - "-Wl,--push-state,-as-needed", - "-lstdc++", - "-Wl,--pop-state", - "-Wl,--push-state,-as-needed", - "-lm", - "-Wl,--pop-state", - ], - opt_compile_flags = [ - "-g0", - "-O2", - "-D_FORTIFY_SOURCE=1", - "-DNDEBUG", - "-ffunction-sections", - "-fdata-sections", - ], - opt_link_flags = ["-Wl,--gc-sections"], - supports_start_end_lib = True, - target_libc = "glibc_2.19", target_system_name = "x86_64-unknown-linux-gnu", - tool_paths = { - "ar": "/usr/bin/ar", + target_libc = "glibc_2.19", + abi_version = "clang", + abi_libc_version = "glibc_2.19", + cxx_builtin_include_directories = ["/usr/local/lib/clang/19/include", + "/usr/local/include", + "/usr/include/x86_64-linux-gnu", + "/usr/include", + "/usr/local/lib/clang/19/share", + "/usr/include/c++/9", + "/usr/include/x86_64-linux-gnu/c++/9", + "/usr/include/c++/9/backward", + "/usr/local/include/c++/v1", + "/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk"], + tool_paths = {"ar": "/usr/bin/ar", "ld": "/usr/bin/ld", "llvm-cov": "/usr/local/bin/llvm-cov", "llvm-profdata": "/usr/local/bin/llvm-profdata", @@ -172,21 +128,53 @@ cc_toolchain_config( "objcopy": "/usr/bin/objcopy", "objdump": "/usr/bin/objdump", "strip": "/usr/bin/strip", + "c++filt": "/usr/bin/c++filt", "parse_headers": "cc_wrapper.sh", - }, - toolchain_identifier = "linux_gnu_x86", - unfiltered_compile_flags = [ - "-no-canonical-prefixes", - "-Wno-builtin-macro-redefined", - "-D__DATE__=\"redacted\"", - "-D__TIMESTAMP__=\"redacted\"", - "-D__TIME__=\"redacted\"", - ], + "validate_static_library": "validate_static_library.sh"}, + compile_flags = ["-fstack-protector", + "-Wall", + "-Wthread-safety", + "-Wself-assign", + "-Wunused-but-set-parameter", + "-Wno-free-nonheap-object", + "-fcolor-diagnostics", + "-fno-omit-frame-pointer"], + opt_compile_flags = ["-g0", + "-O2", + "-D_FORTIFY_SOURCE=1", + "-DNDEBUG", + "-ffunction-sections", + "-fdata-sections"], + dbg_compile_flags = ["-g"], + conly_flags = [], + cxx_flags = ["-std=c++14"], + link_flags = ["-fuse-ld=/usr/local/bin/ld.lld", + "-B/usr/local/bin", + "-Wl,-no-as-needed", + "-Wl,-z,relro,-z,now"], + link_libs = ["-Wl,--push-state,-as-needed", + "-lstdc++", + "-Wl,--pop-state", + "-Wl,--push-state,-as-needed", + "-lm", + "-Wl,--pop-state"], + opt_link_flags = ["-Wl,--gc-sections"], + unfiltered_compile_flags = ["-no-canonical-prefixes", + "-Wno-builtin-macro-redefined", + "-D__DATE__=\"redacted\"", + "-D__TIMESTAMP__=\"redacted\"", + "-D__TIME__=\"redacted\""], + coverage_compile_flags = ["--coverage"], + coverage_link_flags = ["--coverage"], + supports_start_end_lib = True, + extra_flags_per_feature = {"use_module_maps": ["-Xclang", "-fno-cxx-modules"]}, ) # Android tooling requires a default toolchain for the armeabi-v7a cpu. cc_toolchain( name = "cc-compiler-armeabi-v7a", + toolchain_identifier = "stub_armeabi-v7a", + toolchain_config = ":stub_armeabi-v7a", all_files = ":empty", ar_files = ":empty", as_files = ":empty", @@ -196,8 +184,6 @@ cc_toolchain( objcopy_files = ":empty", strip_files = ":empty", supports_param_files = 1, - toolchain_config = ":stub_armeabi-v7a", - toolchain_identifier = "stub_armeabi-v7a", ) armeabi_cc_toolchain_config(name = "stub_armeabi-v7a") diff --git a/third_party/toolchains/rbe_ubuntu2004/cc/WORKSPACE b/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/REPO.bazel similarity index 100% rename from third_party/toolchains/rbe_ubuntu2004/cc/WORKSPACE rename to third_party/toolchains/rbe_ubuntu2004_bazel7/cc/REPO.bazel diff --git a/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/WORKSPACE b/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/WORKSPACE new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/third_party/toolchains/rbe_ubuntu2004/cc/armeabi_cc_toolchain_config.bzl b/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/armeabi_cc_toolchain_config.bzl similarity index 100% rename from third_party/toolchains/rbe_ubuntu2004/cc/armeabi_cc_toolchain_config.bzl rename to third_party/toolchains/rbe_ubuntu2004_bazel7/cc/armeabi_cc_toolchain_config.bzl diff --git a/third_party/toolchains/rbe_ubuntu2004/cc/builtin_include_directory_paths b/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/builtin_include_directory_paths similarity index 100% rename from third_party/toolchains/rbe_ubuntu2004/cc/builtin_include_directory_paths rename to third_party/toolchains/rbe_ubuntu2004_bazel7/cc/builtin_include_directory_paths diff --git a/third_party/toolchains/rbe_ubuntu2004/cc/cc_toolchain_config.bzl b/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/cc_toolchain_config.bzl similarity index 84% rename from third_party/toolchains/rbe_ubuntu2004/cc/cc_toolchain_config.bzl rename to third_party/toolchains/rbe_ubuntu2004_bazel7/cc/cc_toolchain_config.bzl index b25f26e4e0655..1dd0e7a6e7ad0 100644 --- a/third_party/toolchains/rbe_ubuntu2004/cc/cc_toolchain_config.bzl +++ b/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/cc_toolchain_config.bzl @@ -222,6 +222,8 @@ def _sanitizer_feature(name = "", specific_compile_flags = [], specific_link_fla ) def _impl(ctx): + is_linux = ctx.attr.target_libc != "macosx" + tool_paths = [ tool_path(name = name, path = path) for name, path in ctx.attr.tool_paths.items() @@ -249,6 +251,25 @@ def _impl(ctx): action_configs.append(llvm_cov_action) action_configs.append(objcopy_action) + validate_static_library = ctx.attr.tool_paths.get("validate_static_library") + if validate_static_library: + validate_static_library_action = action_config( + action_name = ACTION_NAMES.validate_static_library, + tools = [ + tool( + path = validate_static_library, + ), + ], + ) + action_configs.append(validate_static_library_action) + + symbol_check = feature( + name = "symbol_check", + implies = [ACTION_NAMES.validate_static_library], + ) + else: + symbol_check = None + supports_pic_feature = feature( name = "supports_pic", enabled = True, @@ -593,69 +614,134 @@ def _impl(ctx): provides = ["profile"], ) - runtime_library_search_directories_feature = feature( - name = "runtime_library_search_directories", - flag_sets = [ - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = [ - flag_group( - iterate_over = "runtime_library_search_directories", - flag_groups = [ - flag_group( - flags = [ - "-Xlinker", - "-rpath", - "-Xlinker", - "$EXEC_ORIGIN/%{runtime_library_search_directories}", - ], - expand_if_true = "is_cc_test", - ), - flag_group( - flags = [ - "-Xlinker", - "-rpath", - "-Xlinker", - "$ORIGIN/%{runtime_library_search_directories}", - ], - expand_if_false = "is_cc_test", - ), - ], - expand_if_available = - "runtime_library_search_directories", - ), - ], - with_features = [ - with_feature_set(features = ["static_link_cpp_runtimes"]), - ], - ), - flag_set( - actions = all_link_actions + lto_index_actions, - flag_groups = [ - flag_group( - iterate_over = "runtime_library_search_directories", - flag_groups = [ - flag_group( - flags = [ - "-Xlinker", - "-rpath", - "-Xlinker", - "$ORIGIN/%{runtime_library_search_directories}", - ], - ), - ], - expand_if_available = - "runtime_library_search_directories", - ), - ], - with_features = [ - with_feature_set( - not_features = ["static_link_cpp_runtimes"], - ), - ], - ), - ], - ) + if is_linux: + runtime_library_search_directories_feature = feature( + name = "runtime_library_search_directories", + flag_sets = [ + flag_set( + actions = all_link_actions + lto_index_actions, + flag_groups = [ + flag_group( + iterate_over = "runtime_library_search_directories", + flag_groups = [ + flag_group( + flags = [ + "-Xlinker", + "-rpath", + "-Xlinker", + "$EXEC_ORIGIN/%{runtime_library_search_directories}", + ], + expand_if_true = "is_cc_test", + ), + flag_group( + flags = [ + "-Xlinker", + "-rpath", + "-Xlinker", + "$ORIGIN/%{runtime_library_search_directories}", + ], + expand_if_false = "is_cc_test", + ), + ], + expand_if_available = + "runtime_library_search_directories", + ), + ], + with_features = [ + with_feature_set(features = ["static_link_cpp_runtimes"]), + ], + ), + flag_set( + actions = all_link_actions + lto_index_actions, + flag_groups = [ + flag_group( + iterate_over = "runtime_library_search_directories", + flag_groups = [ + flag_group( + flags = [ + "-Xlinker", + "-rpath", + "-Xlinker", + "$ORIGIN/%{runtime_library_search_directories}", + ], + ), + ], + expand_if_available = + "runtime_library_search_directories", + ), + ], + with_features = [ + with_feature_set( + not_features = ["static_link_cpp_runtimes"], + ), + ], + ), + ], + ) + set_install_name_feature = feature( + name = "set_soname", + flag_sets = [ + flag_set( + actions = [ + ACTION_NAMES.cpp_link_dynamic_library, + ACTION_NAMES.cpp_link_nodeps_dynamic_library, + ], + flag_groups = [ + flag_group( + flags = [ + "-Wl,-soname,%{runtime_solib_name}", + ], + expand_if_available = "runtime_solib_name", + ), + ], + ), + ], + ) + else: + runtime_library_search_directories_feature = feature( + name = "runtime_library_search_directories", + flag_sets = [ + flag_set( + actions = all_link_actions + lto_index_actions, + flag_groups = [ + flag_group( + iterate_over = "runtime_library_search_directories", + flag_groups = [ + flag_group( + flags = [ + "-Xlinker", + "-rpath", + "-Xlinker", + "@loader_path/%{runtime_library_search_directories}", + ], + ), + ], + expand_if_available = "runtime_library_search_directories", + ), + ], + ), + ], + ) + set_install_name_feature = feature( + name = "set_install_name", + enabled = ctx.fragments.cpp.do_not_use_macos_set_install_name, + flag_sets = [ + flag_set( + actions = [ + ACTION_NAMES.cpp_link_dynamic_library, + ACTION_NAMES.cpp_link_nodeps_dynamic_library, + ], + flag_groups = [ + flag_group( + flags = [ + "-Wl,-install_name,@rpath/%{runtime_solib_name}", + ], + expand_if_available = "runtime_solib_name", + ), + ], + ), + ], + ) fission_support_feature = feature( name = "fission_support", @@ -884,11 +970,77 @@ def _impl(ctx): ], ) + libraries_to_link_common_flag_groups = [ + flag_group( + flags = ["-Wl,-whole-archive"], + expand_if_true = + "libraries_to_link.is_whole_archive", + expand_if_equal = variable_with_value( + name = "libraries_to_link.type", + value = "static_library", + ), + ), + flag_group( + flags = ["%{libraries_to_link.object_files}"], + iterate_over = "libraries_to_link.object_files", + expand_if_equal = variable_with_value( + name = "libraries_to_link.type", + value = "object_file_group", + ), + ), + flag_group( + flags = ["%{libraries_to_link.name}"], + expand_if_equal = variable_with_value( + name = "libraries_to_link.type", + value = "object_file", + ), + ), + flag_group( + flags = ["%{libraries_to_link.name}"], + expand_if_equal = variable_with_value( + name = "libraries_to_link.type", + value = "interface_library", + ), + ), + flag_group( + flags = ["%{libraries_to_link.name}"], + expand_if_equal = variable_with_value( + name = "libraries_to_link.type", + value = "static_library", + ), + ), + flag_group( + flags = ["-l%{libraries_to_link.name}"], + expand_if_equal = variable_with_value( + name = "libraries_to_link.type", + value = "dynamic_library", + ), + ), + flag_group( + flags = ["-l:%{libraries_to_link.name}"], + expand_if_equal = variable_with_value( + name = "libraries_to_link.type", + value = "versioned_dynamic_library", + ), + ), + flag_group( + flags = ["-Wl,-no-whole-archive"], + expand_if_true = "libraries_to_link.is_whole_archive", + expand_if_equal = variable_with_value( + name = "libraries_to_link.type", + value = "static_library", + ), + ), + ] + libraries_to_link_feature = feature( name = "libraries_to_link", flag_sets = [ flag_set( - actions = all_link_actions + lto_index_actions, + actions = [ + ACTION_NAMES.cpp_link_executable, + ACTION_NAMES.cpp_link_dynamic_library, + ] + lto_index_actions, flag_groups = [ flag_group( iterate_over = "libraries_to_link", @@ -900,66 +1052,7 @@ def _impl(ctx): value = "object_file_group", ), ), - flag_group( - flags = ["-Wl,-whole-archive"], - expand_if_true = - "libraries_to_link.is_whole_archive", - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "static_library", - ), - ), - flag_group( - flags = ["%{libraries_to_link.object_files}"], - iterate_over = "libraries_to_link.object_files", - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "object_file_group", - ), - ), - flag_group( - flags = ["%{libraries_to_link.name}"], - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "object_file", - ), - ), - flag_group( - flags = ["%{libraries_to_link.name}"], - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "interface_library", - ), - ), - flag_group( - flags = ["%{libraries_to_link.name}"], - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "static_library", - ), - ), - flag_group( - flags = ["-l%{libraries_to_link.name}"], - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "dynamic_library", - ), - ), - flag_group( - flags = ["-l:%{libraries_to_link.name}"], - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "versioned_dynamic_library", - ), - ), - flag_group( - flags = ["-Wl,-no-whole-archive"], - expand_if_true = "libraries_to_link.is_whole_archive", - expand_if_equal = variable_with_value( - name = "libraries_to_link.type", - value = "static_library", - ), - ), + ] + libraries_to_link_common_flag_groups + [ flag_group( flags = ["-Wl,--end-lib"], expand_if_equal = variable_with_value( @@ -976,6 +1069,22 @@ def _impl(ctx): ), ], ), + # Object file groups may contain symbols that aren't referenced in the same target that + # produces the object files and must thus not be wrapped in --start-lib/--end-lib when + # linking a nodeps dynamic library. + flag_set( + actions = [ACTION_NAMES.cpp_link_nodeps_dynamic_library], + flag_groups = [ + flag_group( + iterate_over = "libraries_to_link", + flag_groups = libraries_to_link_common_flag_groups, + ), + flag_group( + flags = ["-Wl,@%{thinlto_param_file}"], + expand_if_true = "thinlto_param_file", + ), + ], + ), ], ) @@ -1044,7 +1153,6 @@ def _impl(ctx): ], ) - is_linux = ctx.attr.target_libc != "macosx" libtool_feature = feature( name = "libtool", enabled = not is_linux, @@ -1486,6 +1594,7 @@ def _impl(ctx): unfiltered_compile_flags_feature, treat_warnings_as_errors_feature, archive_param_file_feature, + set_install_name_feature, ] + layering_check_features(ctx.attr.compiler, ctx.attr.extra_flags_per_feature, is_macos = False) else: # macOS artifact name patterns differ from the defaults only for dynamic @@ -1500,6 +1609,8 @@ def _impl(ctx): features = [ macos_minimum_os_feature, macos_default_link_flags_feature, + runtime_library_search_directories_feature, + set_install_name_feature, libtool_feature, archiver_flags_feature, asan_feature, @@ -1535,6 +1646,9 @@ def _impl(ctx): action_configs += parse_headers_action_configs features += parse_headers_features + if symbol_check: + features.append(symbol_check) + return cc_common.create_cc_toolchain_config_info( ctx = ctx, features = features, @@ -1586,6 +1700,6 @@ cc_toolchain_config = rule( name = "xcode_config_label", )), }, - fragments = ["apple"], + fragments = ["apple", "cpp"], provides = [CcToolchainConfigInfo], ) diff --git a/third_party/toolchains/rbe_ubuntu2004/cc/cc_wrapper.sh b/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/cc_wrapper.sh similarity index 100% rename from third_party/toolchains/rbe_ubuntu2004/cc/cc_wrapper.sh rename to third_party/toolchains/rbe_ubuntu2004_bazel7/cc/cc_wrapper.sh diff --git a/third_party/toolchains/rbe_ubuntu2004/cc/module.modulemap b/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/module.modulemap similarity index 100% rename from third_party/toolchains/rbe_ubuntu2004/cc/module.modulemap rename to third_party/toolchains/rbe_ubuntu2004_bazel7/cc/module.modulemap diff --git a/third_party/toolchains/rbe_ubuntu2004/cc/tools/cpp/empty.cc b/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/tools/cpp/empty.cc similarity index 100% rename from third_party/toolchains/rbe_ubuntu2004/cc/tools/cpp/empty.cc rename to third_party/toolchains/rbe_ubuntu2004_bazel7/cc/tools/cpp/empty.cc diff --git a/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/validate_static_library.sh b/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/validate_static_library.sh new file mode 100644 index 0000000000000..6c959e4a57f47 --- /dev/null +++ b/third_party/toolchains/rbe_ubuntu2004_bazel7/cc/validate_static_library.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +# +# Copyright 2023 The Bazel Authors. All rights reserved. +# +# 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 -euo pipefail + +# Find all duplicate symbols in the given static library: +# 1. Use nm to list all global symbols in the library in POSIX format: +# libstatic.a[my_object.o]: my_function T 1234 abcd +# 2. Use sed to transform the output to a format that can be sorted by symbol +# name and is readable by humans: +# my_object.o: T my_function +# By using the `t` and `d` commands, lines for symbols of type U (undefined) +# as well as V and W (weak) and their local lowercase variants are removed. +# 3. Use sort to sort the lines by symbol name. +# 4. Use uniq to only keep the lines corresponding to duplicate symbols. +# 5. Use c++filt to demangle the symbol names. +# c++filt is applied to the duplicated symbols instead of using the -C flag +# of nm because it is not in POSIX and demangled names may not be unique +# (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=35201). +DUPLICATE_SYMBOLS=$( + "/usr/bin/nm" -A -g -P "$1" | + sed -E -e 's/.*\[([^][]+)\]: (.+) ([A-TX-Z]) [a-f0-9]+ [a-f0-9]+/\1: \3 \2/g' -e t -e d | + LC_ALL=C sort -k 3 | + LC_ALL=C uniq -D -f 2 | + "/usr/bin/c++filt") +if [[ -n "$DUPLICATE_SYMBOLS" ]]; then + >&2 echo "Duplicate symbols found in $1:" + >&2 echo "$DUPLICATE_SYMBOLS" + exit 1 +else + touch "$2" +fi diff --git a/third_party/toolchains/rbe_ubuntu2004/config/BUILD b/third_party/toolchains/rbe_ubuntu2004_bazel7/config/BUILD similarity index 94% rename from third_party/toolchains/rbe_ubuntu2004/config/BUILD rename to third_party/toolchains/rbe_ubuntu2004_bazel7/config/BUILD index 6e61e647c17f4..12136e5a68040 100755 --- a/third_party/toolchains/rbe_ubuntu2004/config/BUILD +++ b/third_party/toolchains/rbe_ubuntu2004_bazel7/config/BUILD @@ -17,6 +17,7 @@ package(default_visibility = ["//visibility:public"]) + toolchain( name = "cc-toolchain", exec_compatible_with = [ @@ -28,12 +29,13 @@ toolchain( "@platforms//os:linux", "@platforms//cpu:x86_64", ], - toolchain = "//third_party/toolchains/rbe_ubuntu2004/cc:cc-compiler-k8", + toolchain = "//third_party/toolchains/rbe_ubuntu2004_bazel7/cc:cc-compiler-k8", toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", ) platform( name = "platform", + parents = ["@local_config_platform//:host"], constraint_values = [ "@platforms//os:linux", "@platforms//cpu:x86_64", @@ -43,5 +45,4 @@ platform( "container-image": "docker://us-docker.pkg.dev/grpc-testing/testing-images-public/rbe_ubuntu2004@sha256:b3eb1a17b7b091e3c5648a803076b2c40601242ff91c04d55997af6641305f68", "OSFamily": "Linux", }, - parents = ["@local_config_platform//:host"], ) From bb8fc89d092fea302d79b55a61aea6ed4abf875e Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 19 Dec 2024 12:59:23 -0800 Subject: [PATCH 17/26] [experiments] Actually increment the year... (#38322) Closes #38322 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38322 from ctiller:math 8fca49289f30b1e8367125c24ef798ad94084678 PiperOrigin-RevId: 708001459 --- src/core/lib/experiments/experiments.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/lib/experiments/experiments.yaml b/src/core/lib/experiments/experiments.yaml index 56a8a69a8fd8f..1e7f453280a8c 100644 --- a/src/core/lib/experiments/experiments.yaml +++ b/src/core/lib/experiments/experiments.yaml @@ -105,7 +105,7 @@ test_tags: [resource_quota_test] - name: local_connector_secure description: Local security connector uses TSI_SECURITY_NONE for LOCAL_TCP connections. - expiry: 2024/01/30 + expiry: 2025/01/30 owner: mattstev@google.com test_tags: ["core_end2end_test"] - name: max_pings_wo_data_throttle @@ -214,6 +214,6 @@ Have the work serializer dispatch work to event engine for every callback, instead of running things inline in the first thread that successfully enqueues work. - expiry: 2024/01/30 + expiry: 2025/01/30 owner: ysseung@google.com test_tags: ["core_end2end_test", "cpp_end2end_test", "xds_end2end_test", "lb_unit_test"] From 24d3d0cebe59d0e7ac02b44fc06476b3e564556d Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Thu, 19 Dec 2024 13:27:44 -0800 Subject: [PATCH 18/26] [Dep] Updated google-cloud-cpp-2.33.0 (#38321) Closes #38321 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38321 from veblush:cloud-cpp-2.33 63f4e44086f746f46ffe75484fc28c1ec4d48345 PiperOrigin-RevId: 708010591 --- bazel/grpc_deps.bzl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bazel/grpc_deps.bzl b/bazel/grpc_deps.bzl index df7f18ac00979..5f3b33e2657e2 100644 --- a/bazel/grpc_deps.bzl +++ b/bazel/grpc_deps.bzl @@ -335,11 +335,11 @@ def grpc_deps(): if "google_cloud_cpp" not in native.existing_rules(): http_archive( name = "google_cloud_cpp", - sha256 = "7ca7f583b60d2aa1274411fed3b9fb3887119b2e84244bb3fc69ea1db819e4e5", - strip_prefix = "google-cloud-cpp-2.16.0", + sha256 = "e53ba3799c052d97acac9a6a6b27af24ce822dbde7bfde973bac9e5da714e6b2", + strip_prefix = "google-cloud-cpp-2.33.0", urls = [ - "https://storage.googleapis.com/grpc-bazel-mirror/github.com/googleapis/google-cloud-cpp/archive/refs/tags/v2.16.0.tar.gz", - "https://github.com/googleapis/google-cloud-cpp/archive/refs/tags/v2.16.0.tar.gz", + "https://storage.googleapis.com/grpc-bazel-mirror/github.com/googleapis/google-cloud-cpp/archive/refs/tags/v2.33.0.tar.gz", + "https://github.com/googleapis/google-cloud-cpp/archive/refs/tags/v2.33.0.tar.gz", ], ) From 01673b03f459c98c5274d80169f36484d91c075e Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Thu, 19 Dec 2024 14:10:31 -0800 Subject: [PATCH 19/26] [CI] Updated Bazel to 7.4.1 in rbe_windows (#38320) - Updated Bazel 7 to 7.4.1 in RBE/Windows --- test/distrib/bazel/test_single_bazel_version.sh | 2 +- third_party/toolchains/BUILD | 6 +++--- third_party/toolchains/README.md | 2 +- .../toolchains/generate_windows_rbe_configs.sh | 4 ++-- .../LICENSE | 0 .../cc/BUILD | 0 .../cc/REPO.bazel | 0 .../cc/WORKSPACE | 0 .../cc/armeabi_cc_toolchain_config.bzl | 0 .../cc/builtin_include_directory_paths_clangcl | 0 .../cc/builtin_include_directory_paths_mingw | 0 .../cc/builtin_include_directory_paths_msvc | 0 .../cc/clang_installation_error.bat | 0 .../cc/get_env.bat | 0 .../cc/msys_gcc_installation_error.bat | 0 .../cc/vc_installation_error_arm.bat | 0 .../cc/vc_installation_error_arm64.bat | 0 .../cc/windows_cc_toolchain_config.bzl | 12 ++++++++++++ .../config/BUILD | 2 +- 19 files changed, 20 insertions(+), 8 deletions(-) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/LICENSE (100%) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/cc/BUILD (100%) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/cc/REPO.bazel (100%) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/cc/WORKSPACE (100%) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/cc/armeabi_cc_toolchain_config.bzl (100%) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/cc/builtin_include_directory_paths_clangcl (100%) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/cc/builtin_include_directory_paths_mingw (100%) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/cc/builtin_include_directory_paths_msvc (100%) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/cc/clang_installation_error.bat (100%) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/cc/get_env.bat (100%) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/cc/msys_gcc_installation_error.bat (100%) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/cc/vc_installation_error_arm.bat (100%) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/cc/vc_installation_error_arm64.bat (100%) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/cc/windows_cc_toolchain_config.bzl (99%) rename third_party/toolchains/{rbe_windows_bazel_7.3.1_vs2022 => rbe_windows_vs2022_bazel7}/config/BUILD (93%) diff --git a/test/distrib/bazel/test_single_bazel_version.sh b/test/distrib/bazel/test_single_bazel_version.sh index ecbb8a82f7ad0..e3e8d63af9d95 100755 --- a/test/distrib/bazel/test_single_bazel_version.sh +++ b/test/distrib/bazel/test_single_bazel_version.sh @@ -63,7 +63,7 @@ EXCLUDED_TARGETS=( # Analyzing windows toolchains when running on linux results in an error. # Since bazel distribtests are run on linux, we exclude the windows RBE toolchains. - "-//third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/..." + "-//third_party/toolchains/rbe_windows_vs2022_bazel7/..." "-//third_party/toolchains:rbe_windows_default_toolchain_suite" # Exclude bazelified tests as they contain some bazel hackery diff --git a/third_party/toolchains/BUILD b/third_party/toolchains/BUILD index f3db198d986d0..a15ed3817d261 100644 --- a/third_party/toolchains/BUILD +++ b/third_party/toolchains/BUILD @@ -52,13 +52,13 @@ platform( # The default toolchain suite for RBE windows, pass it to --crosstool_top alias( name = "rbe_windows_default_toolchain_suite", - actual = "//third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc:toolchain", + actual = "//third_party/toolchains/rbe_windows_vs2022_bazel7/cc:toolchain", ) # The default CC toolchain suite for RBE windows alias( name = "rbe_windows_default_cc_toolchain", - actual = "//third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/config:cc-toolchain", + actual = "//third_party/toolchains/rbe_windows_vs2022_bazel7/config:cc-toolchain", ) # The default platform for RBE windows @@ -73,5 +73,5 @@ platform( os_family = "Windows", ), # Inherit from the platform target generated by 'rbe_configs_gen'. - parents = ["//third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/config:platform"], + parents = ["//third_party/toolchains/rbe_windows_vs2022_bazel7/config:platform"], ) diff --git a/third_party/toolchains/README.md b/third_party/toolchains/README.md index 92032c642ae6b..7c661b209b420 100644 --- a/third_party/toolchains/README.md +++ b/third_party/toolchains/README.md @@ -7,7 +7,7 @@ Run `generate_linux_rbe_configs.sh` to regenerate. ## Windows -The `rbe_windows_bazel_7.3.1_vs2022` directory contains the autogenerated toolchain configuration for windows RBE. +The `rbe_windows_vs2022_bazel7` directory contains the autogenerated toolchain configuration for windows RBE. The configuration was generated by the `rbe_configs_gen` tool (just as the linux RBE config), but since it's a windows configuration, it needs to be run on a windows machine. diff --git a/third_party/toolchains/generate_windows_rbe_configs.sh b/third_party/toolchains/generate_windows_rbe_configs.sh index 4a74480c646c4..31a4d915665a9 100755 --- a/third_party/toolchains/generate_windows_rbe_configs.sh +++ b/third_party/toolchains/generate_windows_rbe_configs.sh @@ -33,10 +33,10 @@ WINDOWS_RBE_DOCKER_IMAGE=us-docker.pkg.dev/grpc-testing/testing-images-public/rb # Bazel version used for configuring # Needs to be one of the versions from bazel/supported_versions.txt chosen so that the result is compatible # with other supported bazel versions. -BAZEL_VERSION=7.3.1 +BAZEL_VERSION=7.4.1 # Where to store the generated configs (relative to repo root) -CONFIG_OUTPUT_PATH=third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022 +CONFIG_OUTPUT_PATH=third_party/toolchains/rbe_windows_vs2022_bazel7 # Delete old generated configs. rm -rf "${REPO_ROOT}/${CONFIG_OUTPUT_PATH}" diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/LICENSE b/third_party/toolchains/rbe_windows_vs2022_bazel7/LICENSE similarity index 100% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/LICENSE rename to third_party/toolchains/rbe_windows_vs2022_bazel7/LICENSE diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/BUILD b/third_party/toolchains/rbe_windows_vs2022_bazel7/cc/BUILD similarity index 100% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/BUILD rename to third_party/toolchains/rbe_windows_vs2022_bazel7/cc/BUILD diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/REPO.bazel b/third_party/toolchains/rbe_windows_vs2022_bazel7/cc/REPO.bazel similarity index 100% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/REPO.bazel rename to third_party/toolchains/rbe_windows_vs2022_bazel7/cc/REPO.bazel diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/WORKSPACE b/third_party/toolchains/rbe_windows_vs2022_bazel7/cc/WORKSPACE similarity index 100% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/WORKSPACE rename to third_party/toolchains/rbe_windows_vs2022_bazel7/cc/WORKSPACE diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/armeabi_cc_toolchain_config.bzl b/third_party/toolchains/rbe_windows_vs2022_bazel7/cc/armeabi_cc_toolchain_config.bzl similarity index 100% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/armeabi_cc_toolchain_config.bzl rename to third_party/toolchains/rbe_windows_vs2022_bazel7/cc/armeabi_cc_toolchain_config.bzl diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/builtin_include_directory_paths_clangcl b/third_party/toolchains/rbe_windows_vs2022_bazel7/cc/builtin_include_directory_paths_clangcl similarity index 100% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/builtin_include_directory_paths_clangcl rename to third_party/toolchains/rbe_windows_vs2022_bazel7/cc/builtin_include_directory_paths_clangcl diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/builtin_include_directory_paths_mingw b/third_party/toolchains/rbe_windows_vs2022_bazel7/cc/builtin_include_directory_paths_mingw similarity index 100% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/builtin_include_directory_paths_mingw rename to third_party/toolchains/rbe_windows_vs2022_bazel7/cc/builtin_include_directory_paths_mingw diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/builtin_include_directory_paths_msvc b/third_party/toolchains/rbe_windows_vs2022_bazel7/cc/builtin_include_directory_paths_msvc similarity index 100% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/builtin_include_directory_paths_msvc rename to third_party/toolchains/rbe_windows_vs2022_bazel7/cc/builtin_include_directory_paths_msvc diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/clang_installation_error.bat b/third_party/toolchains/rbe_windows_vs2022_bazel7/cc/clang_installation_error.bat similarity index 100% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/clang_installation_error.bat rename to third_party/toolchains/rbe_windows_vs2022_bazel7/cc/clang_installation_error.bat diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/get_env.bat b/third_party/toolchains/rbe_windows_vs2022_bazel7/cc/get_env.bat similarity index 100% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/get_env.bat rename to third_party/toolchains/rbe_windows_vs2022_bazel7/cc/get_env.bat diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/msys_gcc_installation_error.bat b/third_party/toolchains/rbe_windows_vs2022_bazel7/cc/msys_gcc_installation_error.bat similarity index 100% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/msys_gcc_installation_error.bat rename to third_party/toolchains/rbe_windows_vs2022_bazel7/cc/msys_gcc_installation_error.bat diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/vc_installation_error_arm.bat b/third_party/toolchains/rbe_windows_vs2022_bazel7/cc/vc_installation_error_arm.bat similarity index 100% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/vc_installation_error_arm.bat rename to third_party/toolchains/rbe_windows_vs2022_bazel7/cc/vc_installation_error_arm.bat diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/vc_installation_error_arm64.bat b/third_party/toolchains/rbe_windows_vs2022_bazel7/cc/vc_installation_error_arm64.bat similarity index 100% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/vc_installation_error_arm64.bat rename to third_party/toolchains/rbe_windows_vs2022_bazel7/cc/vc_installation_error_arm64.bat diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/windows_cc_toolchain_config.bzl b/third_party/toolchains/rbe_windows_vs2022_bazel7/cc/windows_cc_toolchain_config.bzl similarity index 99% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/windows_cc_toolchain_config.bzl rename to third_party/toolchains/rbe_windows_vs2022_bazel7/cc/windows_cc_toolchain_config.bzl index 183fedad041c9..5a470eabda8af 100755 --- a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc/windows_cc_toolchain_config.bzl +++ b/third_party/toolchains/rbe_windows_vs2022_bazel7/cc/windows_cc_toolchain_config.bzl @@ -1124,6 +1124,17 @@ def _impl(ctx): ], implies = ["msvc_compile_env", "msvc_link_env"], ) + + symbol_check_feature = feature( + name = "symbol_check", + flag_sets = [ + flag_set( + actions = [ACTION_NAMES.cpp_link_static_library], + flag_groups = [flag_group(flags = ["/WX:4006"])], + ), + ], + ) + features = [ no_legacy_features_feature, nologo_feature, @@ -1174,6 +1185,7 @@ def _impl(ctx): no_windows_export_all_symbols_feature, supports_dynamic_linker_feature, supports_interface_shared_libraries_feature, + symbol_check_feature, ] else: targets_windows_feature = feature( diff --git a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/config/BUILD b/third_party/toolchains/rbe_windows_vs2022_bazel7/config/BUILD similarity index 93% rename from third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/config/BUILD rename to third_party/toolchains/rbe_windows_vs2022_bazel7/config/BUILD index ac4134bb465c8..7c0f6165d6a48 100755 --- a/third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/config/BUILD +++ b/third_party/toolchains/rbe_windows_vs2022_bazel7/config/BUILD @@ -28,7 +28,7 @@ toolchain( "@platforms//os:windows", "@platforms//cpu:x86_64", ], - toolchain = "//third_party/toolchains/rbe_windows_bazel_7.3.1_vs2022/cc:cc-compiler-x64_windows", + toolchain = "//third_party/toolchains/rbe_windows_vs2022_bazel7/cc:cc-compiler-x64_windows", toolchain_type = "@bazel_tools//tools/cpp:toolchain_type", ) From 6fa8043bf9befb070b846993b59a3348248e6566 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 19 Dec 2024 15:21:38 -0800 Subject: [PATCH 20/26] [ring_hash] allow use without xDS, and allow setting endpoint hash key in EDS (#38312) As per gRFC A76 (https://github.com/grpc/proposal/pull/412). Closes #38312 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38312 from markdroth:ring_hash_changes ae691bbcbdf2c49a43347a43015a1fb4620b22be PiperOrigin-RevId: 708054036 --- BUILD | 2 +- CMakeLists.txt | 1 + build_autogenerated.yaml | 6 + src/core/BUILD | 4 + src/core/load_balancing/lb_policy.h | 8 - .../load_balancing/ring_hash/ring_hash.cc | 207 ++++++++++++------ src/core/load_balancing/ring_hash/ring_hash.h | 15 +- .../plugin_registry/grpc_plugin_registry.cc | 2 + .../grpc_plugin_registry_extra.cc | 2 - src/core/xds/grpc/xds_endpoint_parser.cc | 77 +++++-- src/core/xds/grpc/xds_metadata.h | 8 + test/core/load_balancing/BUILD | 1 + test/core/load_balancing/lb_policy_test_lib.h | 20 +- .../load_balancing/outlier_detection_test.cc | 2 +- test/core/load_balancing/ring_hash_test.cc | 145 +++++++++++- .../load_balancing/xds_override_host_test.cc | 9 +- test/cpp/end2end/xds/BUILD | 1 + test/cpp/end2end/xds/xds_end2end_test_lib.h | 5 +- .../end2end/xds/xds_ring_hash_end2end_test.cc | 159 +++++++++++++- test/cpp/end2end/xds/xds_utils.cc | 11 + test/cpp/end2end/xds/xds_utils.h | 17 +- 21 files changed, 564 insertions(+), 138 deletions(-) diff --git a/BUILD b/BUILD index b3f5d3e2e4295..310d4d53f57c1 100644 --- a/BUILD +++ b/BUILD @@ -605,7 +605,6 @@ GRPC_XDS_TARGETS = [ "//src/core:grpc_lb_policy_xds_cluster_manager", "//src/core:grpc_lb_policy_xds_override_host", "//src/core:grpc_lb_policy_xds_wrr_locality", - "//src/core:grpc_lb_policy_ring_hash", "//src/core:grpc_resolver_xds", "//src/core:grpc_resolver_c2p", "//src/core:grpc_xds_server_config_fetcher", @@ -838,6 +837,7 @@ grpc_cc_library( "//src/core:grpc_lb_policy_outlier_detection", "//src/core:grpc_lb_policy_pick_first", "//src/core:grpc_lb_policy_priority", + "//src/core:grpc_lb_policy_ring_hash", "//src/core:grpc_lb_policy_round_robin", "//src/core:grpc_lb_policy_weighted_round_robin", "//src/core:grpc_lb_policy_weighted_target", diff --git a/CMakeLists.txt b/CMakeLists.txt index 5aa53b28b9257..00003281ac66a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3671,6 +3671,7 @@ add_library(grpc_unsecure src/core/load_balancing/outlier_detection/outlier_detection.cc src/core/load_balancing/pick_first/pick_first.cc src/core/load_balancing/priority/priority.cc + src/core/load_balancing/ring_hash/ring_hash.cc src/core/load_balancing/rls/rls.cc src/core/load_balancing/round_robin/round_robin.cc src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 45df9d5128eab..9e0e3020e6810 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -2673,6 +2673,7 @@ libs: - src/core/load_balancing/oob_backend_metric_internal.h - src/core/load_balancing/outlier_detection/outlier_detection.h - src/core/load_balancing/pick_first/pick_first.h + - src/core/load_balancing/ring_hash/ring_hash.h - src/core/load_balancing/rls/rls.h - src/core/load_balancing/subchannel_interface.h - src/core/load_balancing/weighted_round_robin/static_stride_scheduler.h @@ -2762,7 +2763,9 @@ libs: - src/core/util/uuid_v4.h - src/core/util/validation_errors.h - src/core/util/work_serializer.h + - src/core/util/xxhash_inline.h - third_party/upb/upb/generated_code_support.h + - third_party/xxhash/xxhash.h src: - src/core/call/request_buffer.cc - src/core/channelz/channel_trace.cc @@ -3097,6 +3100,7 @@ libs: - src/core/load_balancing/outlier_detection/outlier_detection.cc - src/core/load_balancing/pick_first/pick_first.cc - src/core/load_balancing/priority/priority.cc + - src/core/load_balancing/ring_hash/ring_hash.cc - src/core/load_balancing/rls/rls.cc - src/core/load_balancing/round_robin/round_robin.cc - src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc @@ -20435,6 +20439,7 @@ targets: - test/core/event_engine/event_engine_test_utils.h - test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h - test/core/load_balancing/lb_policy_test_lib.h + - test/core/test_util/scoped_env_var.h src: - test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.proto - test/core/event_engine/event_engine_test_utils.cc @@ -26825,6 +26830,7 @@ targets: run: false language: c++ headers: + - test/core/test_util/scoped_env_var.h - test/cpp/end2end/connection_attempt_injector.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/test_service_impl.h diff --git a/src/core/BUILD b/src/core/BUILD index 9335eb1f22889..27bc4d6d9e0f6 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -6011,6 +6011,7 @@ grpc_cc_library( "grpc_fake_credentials", "grpc_fault_injection_filter", "grpc_lb_policy_pick_first", + "grpc_lb_policy_ring_hash", "grpc_lb_xds_channel_args", "grpc_matchers", "grpc_outlier_detection_header", @@ -6667,6 +6668,7 @@ grpc_cc_library( "absl/container:inlined_vector", "absl/log:check", "absl/log:log", + "absl/random", "absl/status", "absl/status:statusor", "absl/strings", @@ -6679,6 +6681,7 @@ grpc_cc_library( "closure", "connectivity_state", "delegating_helper", + "env", "error", "grpc_lb_policy_pick_first", "grpc_service_config", @@ -6690,6 +6693,7 @@ grpc_cc_library( "lb_policy_registry", "pollset_set", "ref_counted", + "ref_counted_string", "resolved_address", "unique_type_name", "validation_errors", diff --git a/src/core/load_balancing/lb_policy.h b/src/core/load_balancing/lb_policy.h index 1bf499bce447c..e7ff9d56939ca 100644 --- a/src/core/load_balancing/lb_policy.h +++ b/src/core/load_balancing/lb_policy.h @@ -152,14 +152,6 @@ class LoadBalancingPolicy : public InternallyRefCounted { /// The LB policy may use the existing metadata to influence its routing /// decision, and it may add new metadata elements to be sent with the /// call to the chosen backend. - // TODO(roth): Before making the LB policy API public, consider - // whether this is the right way to expose metadata to the picker. - // This approach means that if a pick modifies metadata but then we - // discard the pick because the subchannel is not connected, the - // metadata change will still have been made. Maybe we actually - // want to somehow provide metadata changes in PickResult::Complete - // instead? Or maybe we use a CallTracer that can add metadata when - // the call actually starts on the subchannel? MetadataInterface* initial_metadata; /// An interface for accessing call state. Can be used to allocate /// memory associated with the call in an efficient way. diff --git a/src/core/load_balancing/ring_hash/ring_hash.cc b/src/core/load_balancing/ring_hash/ring_hash.cc index 2409a40e425b1..f8f2c052ca0cb 100644 --- a/src/core/load_balancing/ring_hash/ring_hash.cc +++ b/src/core/load_balancing/ring_hash/ring_hash.cc @@ -35,6 +35,7 @@ #include "absl/container/inlined_vector.h" #include "absl/log/check.h" #include "absl/log/log.h" +#include "absl/random/random.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/str_cat.h" @@ -59,10 +60,12 @@ #include "src/core/resolver/endpoint_addresses.h" #include "src/core/util/crash.h" #include "src/core/util/debug_location.h" +#include "src/core/util/env.h" #include "src/core/util/json/json.h" #include "src/core/util/orphanable.h" #include "src/core/util/ref_counted.h" #include "src/core/util/ref_counted_ptr.h" +#include "src/core/util/ref_counted_string.h" #include "src/core/util/unique_type_name.h" #include "src/core/util/work_serializer.h" #include "src/core/util/xxhash_inline.h" @@ -74,53 +77,79 @@ UniqueTypeName RequestHashAttribute::TypeName() { return kFactory.Create(); } -// Helper Parser method +namespace { + +constexpr absl::string_view kRingHash = "ring_hash_experimental"; -const JsonLoaderInterface* RingHashConfig::JsonLoader(const JsonArgs&) { - static const auto* loader = - JsonObjectLoader() - .OptionalField("minRingSize", &RingHashConfig::min_ring_size) - .OptionalField("maxRingSize", &RingHashConfig::max_ring_size) - .Finish(); - return loader; +bool XdsRingHashSetRequestHashKeyEnabled() { + auto value = GetEnv("GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY"); + if (!value.has_value()) return false; + bool parsed_value; + bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value); + return parse_succeeded && parsed_value; } -void RingHashConfig::JsonPostLoad(const Json&, const JsonArgs&, - ValidationErrors* errors) { - { - ValidationErrors::ScopedField field(errors, ".minRingSize"); - if (!errors->FieldHasErrors() && - (min_ring_size == 0 || min_ring_size > 8388608)) { - errors->AddError("must be in the range [1, 8388608]"); - } - } - { - ValidationErrors::ScopedField field(errors, ".maxRingSize"); - if (!errors->FieldHasErrors() && - (max_ring_size == 0 || max_ring_size > 8388608)) { - errors->AddError("must be in the range [1, 8388608]"); +class RingHashJsonArgs final : public JsonArgs { + public: + bool IsEnabled(absl::string_view key) const override { + if (key == "request_hash_header") { + return XdsRingHashSetRequestHashKeyEnabled(); } + return true; } - if (min_ring_size > max_ring_size) { - errors->AddError("max_ring_size cannot be smaller than min_ring_size"); - } -} - -namespace { - -constexpr absl::string_view kRingHash = "ring_hash_experimental"; +}; class RingHashLbConfig final : public LoadBalancingPolicy::Config { public: - RingHashLbConfig(size_t min_ring_size, size_t max_ring_size) - : min_ring_size_(min_ring_size), max_ring_size_(max_ring_size) {} + RingHashLbConfig() = default; + + RingHashLbConfig(const RingHashLbConfig&) = delete; + RingHashLbConfig& operator=(const RingHashLbConfig&) = delete; + + RingHashLbConfig(RingHashLbConfig&& other) = delete; + RingHashLbConfig& operator=(RingHashLbConfig&& other) = delete; + absl::string_view name() const override { return kRingHash; } size_t min_ring_size() const { return min_ring_size_; } size_t max_ring_size() const { return max_ring_size_; } + absl::string_view request_hash_header() const { return request_hash_header_; } + + static const JsonLoaderInterface* JsonLoader(const JsonArgs&) { + static const auto* loader = + JsonObjectLoader() + .OptionalField("minRingSize", &RingHashLbConfig::min_ring_size_) + .OptionalField("maxRingSize", &RingHashLbConfig::max_ring_size_) + .OptionalField("requestHashHeader", + &RingHashLbConfig::request_hash_header_, + "request_hash_header") + .Finish(); + return loader; + } + + void JsonPostLoad(const Json&, const JsonArgs&, ValidationErrors* errors) { + { + ValidationErrors::ScopedField field(errors, ".minRingSize"); + if (!errors->FieldHasErrors() && + (min_ring_size_ == 0 || min_ring_size_ > 8388608)) { + errors->AddError("must be in the range [1, 8388608]"); + } + } + { + ValidationErrors::ScopedField field(errors, ".maxRingSize"); + if (!errors->FieldHasErrors() && + (max_ring_size_ == 0 || max_ring_size_ > 8388608)) { + errors->AddError("must be in the range [1, 8388608]"); + } + } + if (min_ring_size_ > max_ring_size_) { + errors->AddError("maxRingSize cannot be smaller than minRingSize"); + } + } private: - size_t min_ring_size_; - size_t max_ring_size_; + uint64_t min_ring_size_ = 1024; + uint64_t max_ring_size_ = 4096; + std::string request_hash_header_; }; // @@ -217,9 +246,13 @@ class RingHash final : public LoadBalancingPolicy { explicit Picker(RefCountedPtr ring_hash) : ring_hash_(std::move(ring_hash)), ring_(ring_hash_->ring_), - endpoints_(ring_hash_->endpoints_.size()) { + endpoints_(ring_hash_->endpoints_.size()), + request_hash_header_(ring_hash_->request_hash_header_) { for (const auto& p : ring_hash_->endpoint_map_) { endpoints_[p.second->index()] = p.second->GetInfoForPicker(); + if (endpoints_[p.second->index()].state == GRPC_CHANNEL_CONNECTING) { + has_endpoint_in_connecting_state_ = true; + } } } @@ -260,6 +293,8 @@ class RingHash final : public LoadBalancingPolicy { RefCountedPtr ring_hash_; RefCountedPtr ring_; std::vector endpoints_; + bool has_endpoint_in_connecting_state_ = false; + RefCountedStringValue request_hash_header_; }; ~RingHash() override; @@ -278,6 +313,7 @@ class RingHash final : public LoadBalancingPolicy { // Current endpoint list, channel args, and ring. EndpointAddressesList endpoints_; ChannelArgs args_; + RefCountedStringValue request_hash_header_; RefCountedPtr ring_; std::map> endpoint_map_; @@ -297,17 +333,34 @@ class RingHash final : public LoadBalancingPolicy { // RingHash::PickResult RingHash::Picker::Pick(PickArgs args) { - auto* call_state = static_cast(args.call_state); - auto* hash_attribute = call_state->GetCallAttribute(); - if (hash_attribute == nullptr) { - return PickResult::Fail(absl::InternalError("hash attribute not present")); + // Determine request hash. + bool using_random_hash = false; + uint64_t request_hash; + if (request_hash_header_.as_string_view().empty()) { + // Being used in xDS. Request hash is passed in via an attribute. + auto* call_state = static_cast(args.call_state); + auto* hash_attribute = call_state->GetCallAttribute(); + if (hash_attribute == nullptr) { + return PickResult::Fail( + absl::InternalError("hash attribute not present")); + } + request_hash = hash_attribute->request_hash(); + } else { + std::string buffer; + auto header_value = args.initial_metadata->Lookup( + request_hash_header_.as_string_view(), &buffer); + if (header_value.has_value()) { + request_hash = XXH64(header_value->data(), header_value->size(), 0); + } else { + request_hash = absl::Uniform(absl::BitGen()); + using_random_hash = true; + } } - uint64_t request_hash = hash_attribute->request_hash(); - const auto& ring = ring_->ring(); // Find the index in the ring to use for this RPC. // Ported from https://github.com/RJ/ketama/blob/master/libketama/ketama.c // (ketama_get_server) NOTE: The algorithm depends on using signed integers // for lowp, highp, and index. Do not change them! + const auto& ring = ring_->ring(); int64_t lowp = 0; int64_t highp = ring.size(); int64_t index = 0; @@ -333,22 +386,42 @@ RingHash::PickResult RingHash::Picker::Pick(PickArgs args) { } } // Find the first endpoint we can use from the selected index. - for (size_t i = 0; i < ring.size(); ++i) { - const auto& entry = ring[(index + i) % ring.size()]; - const auto& endpoint_info = endpoints_[entry.endpoint_index]; - switch (endpoint_info.state) { - case GRPC_CHANNEL_READY: + if (!using_random_hash) { + for (size_t i = 0; i < ring.size(); ++i) { + const auto& entry = ring[(index + i) % ring.size()]; + const auto& endpoint_info = endpoints_[entry.endpoint_index]; + switch (endpoint_info.state) { + case GRPC_CHANNEL_READY: + return endpoint_info.picker->Pick(args); + case GRPC_CHANNEL_IDLE: + new EndpointConnectionAttempter( + ring_hash_.Ref(DEBUG_LOCATION, "EndpointConnectionAttempter"), + endpoint_info.endpoint); + ABSL_FALLTHROUGH_INTENDED; + case GRPC_CHANNEL_CONNECTING: + return PickResult::Queue(); + default: + break; + } + } + } else { + // Using a random hash. We will use the first READY endpoint we + // find, triggering at most one endpoint to attempt connecting. + bool requested_connection = has_endpoint_in_connecting_state_; + for (size_t i = 0; i < ring.size(); ++i) { + const auto& entry = ring[(index + i) % ring.size()]; + const auto& endpoint_info = endpoints_[entry.endpoint_index]; + if (endpoint_info.state == GRPC_CHANNEL_READY) { return endpoint_info.picker->Pick(args); - case GRPC_CHANNEL_IDLE: + } + if (!requested_connection && endpoint_info.state == GRPC_CHANNEL_IDLE) { new EndpointConnectionAttempter( ring_hash_.Ref(DEBUG_LOCATION, "EndpointConnectionAttempter"), endpoint_info.endpoint); - ABSL_FALLTHROUGH_INTENDED; - case GRPC_CHANNEL_CONNECTING: - return PickResult::Queue(); - default: - break; + requested_connection = true; + } } + if (requested_connection) return PickResult::Queue(); } return PickResult::Fail(absl::UnavailableError(absl::StrCat( "ring hash cannot find a connected endpoint; first failure: ", @@ -362,7 +435,7 @@ RingHash::PickResult RingHash::Picker::Pick(PickArgs args) { RingHash::Ring::Ring(RingHash* ring_hash, RingHashLbConfig* config) { // Store the weights while finding the sum. struct EndpointWeight { - std::string address; // Key by endpoint's first address. + std::string hash_key; // By default, endpoint's first address. // Default weight is 1 for the cases where a weight is not provided, // each occurrence of the address will be counted a weight value of 1. uint32_t weight = 1; @@ -374,8 +447,14 @@ RingHash::Ring::Ring(RingHash* ring_hash, RingHashLbConfig* config) { endpoint_weights.reserve(endpoints.size()); for (const auto& endpoint : endpoints) { EndpointWeight endpoint_weight; - endpoint_weight.address = - grpc_sockaddr_to_string(&endpoint.addresses().front(), false).value(); + auto hash_key = + endpoint.args().GetString(GRPC_ARG_RING_HASH_ENDPOINT_HASH_KEY); + if (hash_key.has_value()) { + endpoint_weight.hash_key = std::string(*hash_key); + } else { + endpoint_weight.hash_key = + grpc_sockaddr_to_string(&endpoint.addresses().front(), false).value(); + } // Weight should never be zero, but ignore it just in case, since // that value would screw up the ring-building algorithm. auto weight_arg = endpoint.args().GetInt(GRPC_ARG_ADDRESS_WEIGHT); @@ -425,8 +504,8 @@ RingHash::Ring::Ring(RingHash* ring_hash, RingHashLbConfig* config) { uint64_t min_hashes_per_host = ring_size; uint64_t max_hashes_per_host = 0; for (size_t i = 0; i < endpoints.size(); ++i) { - const std::string& address_string = endpoint_weights[i].address; - hash_key_buffer.assign(address_string.begin(), address_string.end()); + const std::string& hash_key = endpoint_weights[i].hash_key; + hash_key_buffer.assign(hash_key.begin(), hash_key.end()); hash_key_buffer.emplace_back('_'); auto offset_start = hash_key_buffer.end(); target_hashes += scale * endpoint_weights[i].normalized_weight; @@ -652,9 +731,11 @@ absl::Status RingHash::UpdateLocked(UpdateArgs args) { } // Save channel args. args_ = std::move(args.args); + // Save config. + auto* config = DownCast(args.config.get()); + request_hash_header_ = RefCountedStringValue(config->request_hash_header()); // Build new ring. - ring_ = MakeRefCounted( - this, static_cast(args.config.get())); + ring_ = MakeRefCounted(this, config); // Update endpoint map. std::map> endpoint_map; std::vector errors; @@ -853,11 +934,9 @@ class RingHashFactory final : public LoadBalancingPolicyFactory { absl::StatusOr> ParseLoadBalancingConfig(const Json& json) const override { - auto config = LoadFromJson( - json, JsonArgs(), "errors validating ring_hash LB policy config"); - if (!config.ok()) return config.status(); - return MakeRefCounted(config->min_ring_size, - config->max_ring_size); + return LoadFromJson>( + json, RingHashJsonArgs(), + "errors validating ring_hash LB policy config"); } }; diff --git a/src/core/load_balancing/ring_hash/ring_hash.h b/src/core/load_balancing/ring_hash/ring_hash.h index 95f17cbe81dfd..b3e9886202ce7 100644 --- a/src/core/load_balancing/ring_hash/ring_hash.h +++ b/src/core/load_balancing/ring_hash/ring_hash.h @@ -27,6 +27,10 @@ #include "src/core/util/unique_type_name.h" #include "src/core/util/validation_errors.h" +// Optional endpoint attribute specifying the hash key. +#define GRPC_ARG_RING_HASH_ENDPOINT_HASH_KEY \ + GRPC_ARG_NO_SUBCHANNEL_PREFIX "hash_key" + namespace grpc_core { class RequestHashAttribute final @@ -45,17 +49,6 @@ class RequestHashAttribute final uint64_t request_hash_; }; -// Helper Parsing method to parse ring hash policy configs; for example, ring -// hash size validity. -struct RingHashConfig { - uint64_t min_ring_size = 1024; - uint64_t max_ring_size = 4096; - - static const JsonLoaderInterface* JsonLoader(const JsonArgs&); - void JsonPostLoad(const Json& json, const JsonArgs&, - ValidationErrors* errors); -}; - } // namespace grpc_core #endif // GRPC_SRC_CORE_LOAD_BALANCING_RING_HASH_RING_HASH_H diff --git a/src/core/plugin_registry/grpc_plugin_registry.cc b/src/core/plugin_registry/grpc_plugin_registry.cc index 4970e2a012747..a276ea9222355 100644 --- a/src/core/plugin_registry/grpc_plugin_registry.cc +++ b/src/core/plugin_registry/grpc_plugin_registry.cc @@ -62,6 +62,7 @@ extern void RegisterOutlierDetectionLbPolicy( CoreConfiguration::Builder* builder); extern void RegisterWeightedTargetLbPolicy(CoreConfiguration::Builder* builder); extern void RegisterPickFirstLbPolicy(CoreConfiguration::Builder* builder); +extern void RegisterRingHashLbPolicy(CoreConfiguration::Builder* builder); extern void RegisterRoundRobinLbPolicy(CoreConfiguration::Builder* builder); extern void RegisterWeightedRoundRobinLbPolicy( CoreConfiguration::Builder* builder); @@ -102,6 +103,7 @@ void BuildCoreConfiguration(CoreConfiguration::Builder* builder) { RegisterWeightedTargetLbPolicy(builder); RegisterPickFirstLbPolicy(builder); RegisterRoundRobinLbPolicy(builder); + RegisterRingHashLbPolicy(builder); RegisterWeightedRoundRobinLbPolicy(builder); BuildClientChannelConfiguration(builder); SecurityRegisterHandshakerFactories(builder); diff --git a/src/core/plugin_registry/grpc_plugin_registry_extra.cc b/src/core/plugin_registry/grpc_plugin_registry_extra.cc index aa91cba241788..7854b5154ab59 100644 --- a/src/core/plugin_registry/grpc_plugin_registry_extra.cc +++ b/src/core/plugin_registry/grpc_plugin_registry_extra.cc @@ -37,7 +37,6 @@ extern void RegisterCdsLbPolicy(CoreConfiguration::Builder* builder); extern void RegisterXdsOverrideHostLbPolicy( CoreConfiguration::Builder* builder); extern void RegisterXdsWrrLocalityLbPolicy(CoreConfiguration::Builder* builder); -extern void RegisterRingHashLbPolicy(CoreConfiguration::Builder* builder); extern void RegisterFileWatcherCertificateProvider( CoreConfiguration::Builder* builder); extern void RegisterXdsHttpProxyMapper(CoreConfiguration::Builder* builder); @@ -60,7 +59,6 @@ void RegisterExtraFilters(CoreConfiguration::Builder* builder) { RegisterCdsLbPolicy(builder); RegisterXdsOverrideHostLbPolicy(builder); RegisterXdsWrrLocalityLbPolicy(builder); - RegisterRingHashLbPolicy(builder); RegisterFileWatcherCertificateProvider(builder); RegisterXdsHttpProxyMapper(builder); #endif diff --git a/src/core/xds/grpc/xds_endpoint_parser.cc b/src/core/xds/grpc/xds_endpoint_parser.cc index 2bf1f44386365..92a17c6743ad6 100644 --- a/src/core/xds/grpc/xds_endpoint_parser.cc +++ b/src/core/xds/grpc/xds_endpoint_parser.cc @@ -45,8 +45,11 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/debug/trace.h" #include "src/core/lib/iomgr/resolved_address.h" +#include "src/core/load_balancing/ring_hash/ring_hash.h" #include "src/core/util/down_cast.h" #include "src/core/util/env.h" +#include "src/core/util/json/json_args.h" +#include "src/core/util/json/json_object_loader.h" #include "src/core/util/string.h" #include "src/core/util/upb_utils.h" #include "src/core/util/validation_errors.h" @@ -72,6 +75,16 @@ bool XdsDualstackEndpointsEnabled() { return parse_succeeded && parsed_value; } +// TODO(roth): Flip the default to false once this proves stable, then +// remove it entirely at some point in the future. +bool XdsEndpointHashKeyBackwardCompatEnabled() { + auto value = GetEnv("GRPC_XDS_ENDPOINT_HASH_KEY_BACKWARD_COMPAT"); + if (!value.has_value()) return true; + bool parsed_value; + bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value); + return parse_succeeded && parsed_value; +} + void MaybeLogClusterLoadAssignment( const XdsResourceType::DecodeContext& context, const envoy_config_endpoint_v3_ClusterLoadAssignment* cla) { @@ -87,21 +100,22 @@ void MaybeLogClusterLoadAssignment( } } -std::string GetProxyAddressFromMetadata( - const XdsResourceType::DecodeContext& context, - const envoy_config_core_v3_Metadata* metadata, ValidationErrors* errors) { - if (XdsHttpConnectEnabled() && metadata != nullptr) { - XdsMetadataMap metadata_map = - ParseXdsMetadataMap(context, metadata, errors); - auto* proxy_address_entry = - metadata_map.Find("envoy.http11_proxy_transport_socket.proxy_address"); - if (proxy_address_entry != nullptr && - proxy_address_entry->type() == XdsAddressMetadataValue::Type()) { - return DownCast(proxy_address_entry) - ->address(); - } - } - return ""; +std::string GetProxyAddressFromMetadata(const XdsMetadataMap& metadata_map) { + auto* proxy_address_entry = metadata_map.FindType( + "envoy.http11_proxy_transport_socket.proxy_address"); + if (proxy_address_entry == nullptr) return ""; + return proxy_address_entry->address(); +} + +std::string GetHashKeyFromMetadata(const XdsMetadataMap& metadata_map) { + auto* hash_key_entry = + metadata_map.FindType("envoy.lb"); + if (hash_key_entry == nullptr) return ""; + ValidationErrors unused_errors; + return LoadJsonObjectField(hash_key_entry->json().object(), + JsonArgs(), "hash_key", + &unused_errors) + .value_or(""); } absl::optional EndpointAddressesParse( @@ -126,9 +140,19 @@ absl::optional EndpointAddressesParse( } } // metadata - std::string proxy_address = GetProxyAddressFromMetadata( - context, envoy_config_endpoint_v3_LbEndpoint_metadata(lb_endpoint), - errors); + std::string proxy_address; + std::string hash_key; + if (XdsHttpConnectEnabled() || !XdsEndpointHashKeyBackwardCompatEnabled()) { + XdsMetadataMap metadata_map = ParseXdsMetadataMap( + context, envoy_config_endpoint_v3_LbEndpoint_metadata(lb_endpoint), + errors); + if (XdsHttpConnectEnabled()) { + proxy_address = GetProxyAddressFromMetadata(metadata_map); + } + if (!XdsEndpointHashKeyBackwardCompatEnabled()) { + hash_key = GetHashKeyFromMetadata(metadata_map); + } + } // endpoint std::vector addresses; absl::string_view hostname; @@ -177,6 +201,9 @@ absl::optional EndpointAddressesParse( } else if (!locality_proxy_address.empty()) { args = args.Set(GRPC_ARG_XDS_HTTP_PROXY, locality_proxy_address); } + if (!hash_key.empty()) { + args = args.Set(GRPC_ARG_RING_HASH_ENDPOINT_HASH_KEY, hash_key); + } return EndpointAddresses(addresses, args); } @@ -231,11 +258,15 @@ absl::optional LocalityParse( parsed_locality.locality.name = MakeRefCounted( std::move(region), std::move(zone), std::move(sub_zone)); // metadata - std::string proxy_address = GetProxyAddressFromMetadata( - context, - envoy_config_endpoint_v3_LocalityLbEndpoints_metadata( - locality_lb_endpoints), - errors); + std::string proxy_address; + if (XdsHttpConnectEnabled()) { + XdsMetadataMap metadata_map = ParseXdsMetadataMap( + context, + envoy_config_endpoint_v3_LocalityLbEndpoints_metadata( + locality_lb_endpoints), + errors); + proxy_address = GetProxyAddressFromMetadata(metadata_map); + } // lb_endpoints size_t size; const envoy_config_endpoint_v3_LbEndpoint* const* lb_endpoints = diff --git a/src/core/xds/grpc/xds_metadata.h b/src/core/xds/grpc/xds_metadata.h index 3e8fa4f214b79..419540cb3631b 100644 --- a/src/core/xds/grpc/xds_metadata.h +++ b/src/core/xds/grpc/xds_metadata.h @@ -60,6 +60,14 @@ class XdsMetadataMap { const XdsMetadataValue* Find(absl::string_view key) const; + template + const T* FindType(absl::string_view key) const { + auto it = map_.find(key); + if (it == map_.end()) return nullptr; + if (it->second->type() != T::Type()) return nullptr; + return DownCast(it->second.get()); + } + bool empty() const { return map_.empty(); } size_t size() const { return map_.size(); } diff --git a/test/core/load_balancing/BUILD b/test/core/load_balancing/BUILD index 022d2ca07691d..2c89018f7d56e 100644 --- a/test/core/load_balancing/BUILD +++ b/test/core/load_balancing/BUILD @@ -265,6 +265,7 @@ grpc_cc_test( "//src/core:channel_args", "//src/core:grpc_lb_policy_ring_hash", "//test/core/test_util:grpc_test_util", + "//test/core/test_util:scoped_env_var", ], ) diff --git a/test/core/load_balancing/lb_policy_test_lib.h b/test/core/load_balancing/lb_policy_test_lib.h index f784f925a6cbe..1194b02e2d548 100644 --- a/test/core/load_balancing/lb_policy_test_lib.h +++ b/test/core/load_balancing/lb_policy_test_lib.h @@ -948,7 +948,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { EXPECT_TRUE(update.status.ok()) << update.status << " at " << location.file() << ":" << location.line(); - ExpectPickQueued(update.picker.get(), {}, location); + ExpectPickQueued(update.picker.get(), {}, {}, location); return true; // Keep going. } EXPECT_EQ(update.state, GRPC_CHANNEL_READY) @@ -992,7 +992,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { EXPECT_TRUE(update.status.ok()) << update.status << " at " << location.file() << ":" << location.line(); - ExpectPickQueued(update.picker.get(), {}, location); + ExpectPickQueued(update.picker.get(), {}, {}, location); return true; // Keep going. } EXPECT_EQ(update.state, GRPC_CHANNEL_TRANSIENT_FAILURE) @@ -1059,7 +1059,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { absl::Status expected_status = absl::OkStatus(), SourceLocation location = SourceLocation()) { auto picker = ExpectState(expected_state, expected_status, location); - return ExpectPickQueued(picker.get(), {}, location); + return ExpectPickQueued(picker.get(), {}, {}, location); } // Convenient frontend to ExpectStateAndQueuingPicker() for CONNECTING. @@ -1076,20 +1076,22 @@ class LoadBalancingPolicyTest : public ::testing::Test { // Does a pick and returns the result. LoadBalancingPolicy::PickResult DoPick( LoadBalancingPolicy::SubchannelPicker* picker, - const CallAttributes& call_attributes = {}) { + const CallAttributes& call_attributes = {}, + const std::map& metadata = {}) { ExecCtx exec_ctx; - FakeMetadata metadata({}); + FakeMetadata md(metadata); FakeCallState call_state(call_attributes); - return picker->Pick({"/service/method", &metadata, &call_state}); + return picker->Pick({"/service/method", &md, &call_state}); } // Requests a pick on picker and expects a Queue result. bool ExpectPickQueued(LoadBalancingPolicy::SubchannelPicker* picker, const CallAttributes call_attributes = {}, + const std::map& metadata = {}, SourceLocation location = SourceLocation()) { EXPECT_NE(picker, nullptr) << location.file() << ":" << location.line(); if (picker == nullptr) return false; - auto pick_result = DoPick(picker, call_attributes); + auto pick_result = DoPick(picker, call_attributes, metadata); EXPECT_TRUE(absl::holds_alternative( pick_result.result)) << PickResultString(pick_result) << "\nat " << location.file() << ":" @@ -1108,6 +1110,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { absl::optional ExpectPickComplete( LoadBalancingPolicy::SubchannelPicker* picker, const CallAttributes& call_attributes = {}, + const std::map& metadata = {}, std::unique_ptr* subchannel_call_tracker = nullptr, SubchannelState::FakeSubchannel** picked_subchannel = nullptr, @@ -1116,7 +1119,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { if (picker == nullptr) { return absl::nullopt; } - auto pick_result = DoPick(picker, call_attributes); + auto pick_result = DoPick(picker, call_attributes, metadata); auto* complete = absl::get_if( &pick_result.result); EXPECT_NE(complete, nullptr) << PickResultString(pick_result) << " at " @@ -1167,6 +1170,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { std::unique_ptr subchannel_call_tracker; auto address = ExpectPickComplete(picker, call_attributes, + /*metadata=*/{}, subchannel_call_trackers == nullptr ? nullptr : &subchannel_call_tracker, diff --git a/test/core/load_balancing/outlier_detection_test.cc b/test/core/load_balancing/outlier_detection_test.cc index d73a4ed54bf0d..40a8cfc280ff3 100644 --- a/test/core/load_balancing/outlier_detection_test.cc +++ b/test/core/load_balancing/outlier_detection_test.cc @@ -154,7 +154,7 @@ class OutlierDetectionTest : public LoadBalancingPolicyTest { LoadBalancingPolicy::SubchannelPicker* picker) { std::unique_ptr subchannel_call_tracker; - auto address = ExpectPickComplete(picker, {}, &subchannel_call_tracker); + auto address = ExpectPickComplete(picker, {}, {}, &subchannel_call_tracker); if (address.has_value()) { subchannel_call_tracker->Start(); FakeMetadata metadata({}); diff --git a/test/core/load_balancing/ring_hash_test.cc b/test/core/load_balancing/ring_hash_test.cc index 522f5794921dc..c0b8dcaa3747a 100644 --- a/test/core/load_balancing/ring_hash_test.cc +++ b/test/core/load_balancing/ring_hash_test.cc @@ -38,6 +38,7 @@ #include "src/core/util/ref_counted_ptr.h" #include "src/core/util/xxhash_inline.h" #include "test/core/load_balancing/lb_policy_test_lib.h" +#include "test/core/test_util/scoped_env_var.h" #include "test/core/test_util/test_config.h" namespace grpc_core { @@ -53,7 +54,8 @@ class RingHashTest : public LoadBalancingPolicyTest { RingHashTest() : LoadBalancingPolicyTest("ring_hash_experimental") {} static RefCountedPtr MakeRingHashConfig( - int min_ring_size = 0, int max_ring_size = 0) { + int min_ring_size = 0, int max_ring_size = 0, + const std::string& request_hash_header = "") { Json::Object fields; if (min_ring_size > 0) { fields["minRingSize"] = Json::FromString(absl::StrCat(min_ring_size)); @@ -61,19 +63,25 @@ class RingHashTest : public LoadBalancingPolicyTest { if (max_ring_size > 0) { fields["maxRingSize"] = Json::FromString(absl::StrCat(max_ring_size)); } + if (!request_hash_header.empty()) { + fields["requestHashHeader"] = Json::FromString(request_hash_header); + } return MakeConfig(Json::FromArray({Json::FromObject( {{"ring_hash_experimental", Json::FromObject(fields)}})})); } - RequestHashAttribute* MakeHashAttribute(absl::string_view address) { - std::string hash_input = - absl::StrCat(absl::StripPrefix(address, "ipv4:"), "_0"); - uint64_t hash = XXH64(hash_input.data(), hash_input.size(), 0); + RequestHashAttribute* MakeHashAttributeForString(absl::string_view key) { + std::string key_str = absl::StrCat(key, "_0"); + uint64_t hash = XXH64(key_str.data(), key_str.size(), 0); attribute_storage_.emplace_back( std::make_unique(hash)); return attribute_storage_.back().get(); } + RequestHashAttribute* MakeHashAttribute(absl::string_view address) { + return MakeHashAttributeForString(absl::StripPrefix(address, "ipv4:")); + } + std::vector> attribute_storage_; }; @@ -94,6 +102,8 @@ TEST_F(RingHashTest, Basic) { subchannel->SetConnectivityState(GRPC_CHANNEL_CONNECTING); picker = ExpectState(GRPC_CHANNEL_CONNECTING); ExpectPickQueued(picker.get(), {address0_attribute}); + EXPECT_EQ(nullptr, FindSubchannel(kAddresses[1])); + EXPECT_EQ(nullptr, FindSubchannel(kAddresses[2])); subchannel->SetConnectivityState(GRPC_CHANNEL_READY); picker = ExpectState(GRPC_CHANNEL_READY); auto address = ExpectPickComplete(picker.get(), {address0_attribute}); @@ -182,6 +192,131 @@ TEST_F(RingHashTest, MultipleAddressesPerEndpoint) { EXPECT_EQ(address, kEndpoint1Addresses[1]); } +TEST_F(RingHashTest, EndpointHashKeys) { + const std::array kAddresses = { + "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; + const std::array kHashKeys = {"foo", "bar", "baz"}; + std::vector endpoints; + for (size_t i = 0; i < 3; ++i) { + endpoints.push_back(MakeEndpointAddresses( + {kAddresses[i]}, + ChannelArgs().Set(GRPC_ARG_RING_HASH_ENDPOINT_HASH_KEY, kHashKeys[i]))); + }; + EXPECT_EQ( + ApplyUpdate(BuildUpdate(endpoints, MakeRingHashConfig()), lb_policy()), + absl::OkStatus()); + auto picker = ExpectState(GRPC_CHANNEL_IDLE); + auto* hash_attribute = MakeHashAttributeForString(kHashKeys[1]); + ExpectPickQueued(picker.get(), {hash_attribute}); + WaitForWorkSerializerToFlush(); + WaitForWorkSerializerToFlush(); + auto* subchannel = FindSubchannel(kAddresses[1]); + ASSERT_NE(subchannel, nullptr); + EXPECT_TRUE(subchannel->ConnectionRequested()); + subchannel->SetConnectivityState(GRPC_CHANNEL_CONNECTING); + picker = ExpectState(GRPC_CHANNEL_CONNECTING); + ExpectPickQueued(picker.get(), {hash_attribute}); + EXPECT_EQ(nullptr, FindSubchannel(kAddresses[0])); + EXPECT_EQ(nullptr, FindSubchannel(kAddresses[2])); + subchannel->SetConnectivityState(GRPC_CHANNEL_READY); + picker = ExpectState(GRPC_CHANNEL_READY); + auto address = ExpectPickComplete(picker.get(), {hash_attribute}); + EXPECT_EQ(address, kAddresses[1]); +} + +TEST_F(RingHashTest, PickFailsWithoutRequestHashAttribute) { + const std::array kAddresses = { + "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; + EXPECT_EQ( + ApplyUpdate(BuildUpdate(kAddresses, MakeRingHashConfig()), lb_policy()), + absl::OkStatus()); + auto picker = ExpectState(GRPC_CHANNEL_IDLE); + ExpectPickFail(picker.get(), [&](const absl::Status& status) { + EXPECT_EQ(status, absl::InternalError("hash attribute not present")); + }); +} + +TEST_F(RingHashTest, RequestHashHeaderNotEnabled) { + const std::array kAddresses = { + "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; + EXPECT_EQ( + ApplyUpdate(BuildUpdate(kAddresses, MakeRingHashConfig(0, 0, "foo")), + lb_policy()), + absl::OkStatus()); + auto picker = ExpectState(GRPC_CHANNEL_IDLE); + ExpectPickFail(picker.get(), [&](const absl::Status& status) { + EXPECT_EQ(status, absl::InternalError("hash attribute not present")); + }); +} + +TEST_F(RingHashTest, RequestHashHeader) { + ScopedExperimentalEnvVar env( + "GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY"); + const std::array kAddresses = { + "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; + EXPECT_EQ( + ApplyUpdate(BuildUpdate(kAddresses, MakeRingHashConfig(0, 0, "foo")), + lb_policy()), + absl::OkStatus()); + auto picker = ExpectState(GRPC_CHANNEL_IDLE); + std::string hash_key = + absl::StrCat(absl::StripPrefix(kAddresses[0], "ipv4:"), "_0"); + std::map metadata = {{"foo", hash_key}}; + ExpectPickQueued(picker.get(), /*call_attributes=*/{}, metadata); + WaitForWorkSerializerToFlush(); + WaitForWorkSerializerToFlush(); + auto* subchannel = FindSubchannel(kAddresses[0]); + ASSERT_NE(subchannel, nullptr); + EXPECT_TRUE(subchannel->ConnectionRequested()); + subchannel->SetConnectivityState(GRPC_CHANNEL_CONNECTING); + picker = ExpectState(GRPC_CHANNEL_CONNECTING); + ExpectPickQueued(picker.get(), {}, metadata); + EXPECT_EQ(nullptr, FindSubchannel(kAddresses[1])); + EXPECT_EQ(nullptr, FindSubchannel(kAddresses[2])); + subchannel->SetConnectivityState(GRPC_CHANNEL_READY); + picker = ExpectState(GRPC_CHANNEL_READY); + auto address = ExpectPickComplete(picker.get(), {}, metadata); + EXPECT_EQ(address, kAddresses[0]); +} + +TEST_F(RingHashTest, RequestHashHeaderNotPresent) { + ScopedExperimentalEnvVar env( + "GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY"); + const std::array kAddresses = { + "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; + EXPECT_EQ( + ApplyUpdate(BuildUpdate(kAddresses, MakeRingHashConfig(0, 0, "foo")), + lb_policy()), + absl::OkStatus()); + auto picker = ExpectState(GRPC_CHANNEL_IDLE); + ExpectPickQueued(picker.get()); + WaitForWorkSerializerToFlush(); + WaitForWorkSerializerToFlush(); + // It will randomly pick one. + size_t index = 0; + SubchannelState* subchannel = nullptr; + for (; index < kAddresses.size(); ++index) { + subchannel = FindSubchannel(kAddresses[index]); + if (subchannel != nullptr) { + LOG(INFO) << "Randomly picked subchannel index " << index; + break; + } + } + ASSERT_NE(subchannel, nullptr); + EXPECT_TRUE(subchannel->ConnectionRequested()); + subchannel->SetConnectivityState(GRPC_CHANNEL_CONNECTING); + picker = ExpectState(GRPC_CHANNEL_CONNECTING); + ExpectPickQueued(picker.get()); + // No other subchannels should have been created yet. + for (size_t i = 0; i < kAddresses.size(); ++i) { + if (i != index) EXPECT_EQ(nullptr, FindSubchannel(kAddresses[i])); + } + subchannel->SetConnectivityState(GRPC_CHANNEL_READY); + picker = ExpectState(GRPC_CHANNEL_READY); + auto address = ExpectPickComplete(picker.get()); + EXPECT_EQ(address, kAddresses[index]); +} + } // namespace } // namespace testing } // namespace grpc_core diff --git a/test/core/load_balancing/xds_override_host_test.cc b/test/core/load_balancing/xds_override_host_test.cc index e487b6ab32366..7f65f5a222196 100644 --- a/test/core/load_balancing/xds_override_host_test.cc +++ b/test/core/load_balancing/xds_override_host_test.cc @@ -183,7 +183,7 @@ class XdsOverrideHostTest : public LoadBalancingPolicyTest { } std::string expected_addresses_str = absl::StrJoin(expected_addresses, ","); for (size_t i = 0; i < 3; ++i) { - EXPECT_EQ(ExpectPickComplete(picker, {attribute}, + EXPECT_EQ(ExpectPickComplete(picker, {attribute}, /*metadata=*/{}, /*subchannel_call_tracker=*/nullptr, /*picked_subchannel=*/nullptr, location), expected) @@ -202,9 +202,10 @@ class XdsOverrideHostTest : public LoadBalancingPolicyTest { SourceLocation location = SourceLocation()) { std::vector actual_picks; for (size_t i = 0; i < expected.size(); ++i) { - auto address = ExpectPickComplete( - picker, {attribute}, /*subchannel_call_tracker=*/nullptr, - /*picked_subchannel=*/nullptr, location); + auto address = + ExpectPickComplete(picker, {attribute}, /*metadata=*/{}, + /*subchannel_call_tracker=*/nullptr, + /*picked_subchannel=*/nullptr, location); ASSERT_TRUE(address.has_value()) << location.file() << ":" << location.line(); EXPECT_THAT(*address, ::testing::AnyOfArray(expected)) diff --git a/test/cpp/end2end/xds/BUILD b/test/cpp/end2end/xds/BUILD index 22e9441ac6a12..77e8e4f99fa90 100644 --- a/test/cpp/end2end/xds/BUILD +++ b/test/cpp/end2end/xds/BUILD @@ -414,6 +414,7 @@ grpc_cc_test( "//:grpc++", "//:grpc_resolver_fake", "//test/core/test_util:grpc_test_util", + "//test/core/test_util:scoped_env_var", "//test/cpp/end2end:connection_attempt_injector", "@envoy_api//envoy/config/cluster/v3:pkg_cc_proto", "@envoy_api//envoy/config/endpoint/v3:pkg_cc_proto", diff --git a/test/cpp/end2end/xds/xds_end2end_test_lib.h b/test/cpp/end2end/xds/xds_end2end_test_lib.h index bfed1231aa664..5a91d4554e03c 100644 --- a/test/cpp/end2end/xds/xds_end2end_test_lib.h +++ b/test/cpp/end2end/xds/xds_end2end_test_lib.h @@ -487,7 +487,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam, ::envoy::config::core::v3::HealthStatus health_status = ::envoy::config::core::v3::HealthStatus::UNKNOWN, int lb_weight = 1, std::vector additional_backend_indexes = {}, - absl::string_view hostname = "") { + absl::string_view hostname = "", + const std::map& metadata = {}) { std::vector additional_ports; additional_ports.reserve(additional_backend_indexes.size()); for (size_t idx : additional_backend_indexes) { @@ -495,7 +496,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam, } return EdsResourceArgs::Endpoint(backends_[backend_idx]->port(), health_status, lb_weight, additional_ports, - hostname); + hostname, metadata); } // Creates a vector of endpoints for a specified range of backends, diff --git a/test/cpp/end2end/xds/xds_ring_hash_end2end_test.cc b/test/cpp/end2end/xds/xds_ring_hash_end2end_test.cc index 75afa6c12bfb3..4755ac0349aea 100644 --- a/test/cpp/end2end/xds/xds_ring_hash_end2end_test.cc +++ b/test/cpp/end2end/xds/xds_ring_hash_end2end_test.cc @@ -33,6 +33,7 @@ #include "src/core/resolver/fake/fake_resolver.h" #include "src/core/util/env.h" #include "test/core/test_util/resolve_localhost_ip46.h" +#include "test/core/test_util/scoped_env_var.h" #include "test/cpp/end2end/connection_attempt_injector.h" #include "test/cpp/end2end/xds/xds_end2end_test_lib.h" @@ -455,6 +456,160 @@ TEST_P(RingHashTest, HeaderHashingWithRegexRewrite) { EXPECT_TRUE(found); } +TEST_P(RingHashTest, HashKeysInEds) { + grpc_core::testing::ScopedEnvVar env( + "GRPC_XDS_ENDPOINT_HASH_KEY_BACKWARD_COMPAT", "false"); + CreateAndStartBackends(4); + auto cluster = default_cluster_; + cluster.set_lb_policy(Cluster::RING_HASH); + balancer_->ads_service()->SetCdsResource(cluster); + auto new_route_config = default_route_config_; + auto* route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + auto* hash_policy = route->mutable_route()->add_hash_policy(); + hash_policy->mutable_header()->set_header_name("address_hash"); + SetListenerAndRouteConfiguration(balancer_.get(), default_listener_, + new_route_config); + EdsResourceArgs args( + {{"locality0", + { + CreateEndpoint(0, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"foo\"}"}}), + CreateEndpoint(1, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"bar\"}"}}), + CreateEndpoint(2, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"baz\"}"}}), + CreateEndpoint(3, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"quux\"}"}}), + }}}); + balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); + // Note each type of RPC will contains a header value that will always be + // hashed to a specific backend as the header value matches the value used + // to create the entry in the ring. + std::vector> metadata = { + {"address_hash", "foo_0"}}; + std::vector> metadata1 = { + {"address_hash", "bar_0"}}; + std::vector> metadata2 = { + {"address_hash", "baz_0"}}; + std::vector> metadata3 = { + {"address_hash", "quux_0"}}; + const auto rpc_options = + RpcOptions().set_metadata(std::move(metadata)).set_timeout_ms(5000); + const auto rpc_options1 = + RpcOptions().set_metadata(std::move(metadata1)).set_timeout_ms(5000); + const auto rpc_options2 = + RpcOptions().set_metadata(std::move(metadata2)).set_timeout_ms(5000); + const auto rpc_options3 = + RpcOptions().set_metadata(std::move(metadata3)).set_timeout_ms(5000); + WaitForBackend(DEBUG_LOCATION, 0, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options); + WaitForBackend(DEBUG_LOCATION, 1, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options1); + WaitForBackend(DEBUG_LOCATION, 2, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options2); + WaitForBackend(DEBUG_LOCATION, 3, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options3); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options1); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options2); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options3); + for (size_t i = 0; i < backends_.size(); ++i) { + EXPECT_EQ(100, backends_[i]->backend_service()->request_count()); + } +} + +TEST_P(RingHashTest, HashKeysInEdsNotEnabled) { + CreateAndStartBackends(4); + auto cluster = default_cluster_; + cluster.set_lb_policy(Cluster::RING_HASH); + balancer_->ads_service()->SetCdsResource(cluster); + auto new_route_config = default_route_config_; + auto* route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + auto* hash_policy = route->mutable_route()->add_hash_policy(); + hash_policy->mutable_header()->set_header_name("address_hash"); + SetListenerAndRouteConfiguration(balancer_.get(), default_listener_, + new_route_config); + EdsResourceArgs args( + {{"locality0", + { + CreateEndpoint(0, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"foo\"}"}}), + CreateEndpoint(1, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"bar\"}"}}), + CreateEndpoint(2, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"baz\"}"}}), + CreateEndpoint(3, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"quux\"}"}}), + }}}); + balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); + // Note each type of RPC will contains a header value that will always be + // hashed to a specific backend as the header value matches the value used + // to create the entry in the ring. + std::vector> metadata = { + {"address_hash", CreateMetadataValueThatHashesToBackend(0)}}; + std::vector> metadata1 = { + {"address_hash", CreateMetadataValueThatHashesToBackend(1)}}; + std::vector> metadata2 = { + {"address_hash", CreateMetadataValueThatHashesToBackend(2)}}; + std::vector> metadata3 = { + {"address_hash", CreateMetadataValueThatHashesToBackend(3)}}; + const auto rpc_options = + RpcOptions().set_metadata(std::move(metadata)).set_timeout_ms(5000); + const auto rpc_options1 = + RpcOptions().set_metadata(std::move(metadata1)).set_timeout_ms(5000); + const auto rpc_options2 = + RpcOptions().set_metadata(std::move(metadata2)).set_timeout_ms(5000); + const auto rpc_options3 = + RpcOptions().set_metadata(std::move(metadata3)).set_timeout_ms(5000); + WaitForBackend(DEBUG_LOCATION, 0, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options); + WaitForBackend(DEBUG_LOCATION, 1, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options1); + WaitForBackend(DEBUG_LOCATION, 2, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options2); + WaitForBackend(DEBUG_LOCATION, 3, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options3); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options1); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options2); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options3); + for (size_t i = 0; i < backends_.size(); ++i) { + EXPECT_EQ(100, backends_[i]->backend_service()->request_count()); + } +} + // Tests that ring hash policy that hashes using a random value. TEST_P(RingHashTest, NoHashPolicy) { CreateAndStartBackends(2); @@ -641,7 +796,7 @@ TEST_P(RingHashTest, UnsupportedHashPolicyDefaultToRandomHashing) { } // Tests that ring hash policy that hashes using a random value can spread -// RPCs across all the backends according to locality weight. +// RPCs across all the backends according to endpoint weight. TEST_P(RingHashTest, RandomHashingDistributionAccordingToEndpointWeight) { CreateAndStartBackends(2); const size_t kWeight1 = 1; @@ -680,7 +835,7 @@ TEST_P(RingHashTest, RandomHashingDistributionAccordingToEndpointWeight) { } // Tests that ring hash policy that hashes using a random value can spread -// RPCs across all the backends according to locality weight. +// RPCs across all the backends according to locality and endpoint weight. TEST_P(RingHashTest, RandomHashingDistributionAccordingToLocalityAndEndpointWeight) { CreateAndStartBackends(2); diff --git a/test/cpp/end2end/xds/xds_utils.cc b/test/cpp/end2end/xds/xds_utils.cc index ad8f7a0c02abb..1608099a9dd76 100644 --- a/test/cpp/end2end/xds/xds_utils.cc +++ b/test/cpp/end2end/xds/xds_utils.cc @@ -26,6 +26,7 @@ #include #include "absl/memory/memory.h" +#include "absl/strings/numbers.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" @@ -370,6 +371,16 @@ ClusterLoadAssignment XdsResourceUtils::BuildEdsResource( if (!endpoint.hostname.empty()) { endpoint_proto->set_hostname(endpoint.hostname); } + if (!endpoint.metadata.empty()) { + auto& filter_map = + *lb_endpoints->mutable_metadata()->mutable_filter_metadata(); + for (const auto& p : endpoint.metadata) { + absl::Status status = grpc::protobuf::json::JsonStringToMessage( + p.second, &filter_map[p.first], + grpc::protobuf::json::JsonParseOptions()); + CHECK(status.ok()) << status; + } + } } } if (!args.drop_categories.empty()) { diff --git a/test/cpp/end2end/xds/xds_utils.h b/test/cpp/end2end/xds/xds_utils.h index 194827664562c..b8d13ee436cce 100644 --- a/test/cpp/end2end/xds/xds_utils.h +++ b/test/cpp/end2end/xds/xds_utils.h @@ -214,23 +214,26 @@ class XdsResourceUtils { struct EdsResourceArgs { // An individual endpoint for a backend running on a specified port. struct Endpoint { - explicit Endpoint(int port, - ::envoy::config::core::v3::HealthStatus health_status = - ::envoy::config::core::v3::HealthStatus::UNKNOWN, - int lb_weight = 1, - std::vector additional_ports = {}, - absl::string_view hostname = "") + explicit Endpoint( + int port, + ::envoy::config::core::v3::HealthStatus health_status = + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + int lb_weight = 1, std::vector additional_ports = {}, + absl::string_view hostname = "", + const std::map& metadata = {}) : port(port), health_status(health_status), lb_weight(lb_weight), additional_ports(std::move(additional_ports)), - hostname(hostname) {} + hostname(hostname), + metadata(metadata) {} int port; ::envoy::config::core::v3::HealthStatus health_status; int lb_weight; std::vector additional_ports; std::string hostname; + std::map metadata; }; // A locality. From b53f4055a93fb98601c75dcefaa8f3665167e6cf Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Fri, 20 Dec 2024 08:52:53 -0800 Subject: [PATCH 21/26] Automated rollback of commit 6fa8043bf9befb070b846993b59a3348248e6566. PiperOrigin-RevId: 708336431 --- BUILD | 2 +- CMakeLists.txt | 1 - build_autogenerated.yaml | 6 - src/core/BUILD | 4 - src/core/load_balancing/lb_policy.h | 8 + .../load_balancing/ring_hash/ring_hash.cc | 207 ++++++------------ src/core/load_balancing/ring_hash/ring_hash.h | 15 +- .../plugin_registry/grpc_plugin_registry.cc | 2 - .../grpc_plugin_registry_extra.cc | 2 + src/core/xds/grpc/xds_endpoint_parser.cc | 77 ++----- src/core/xds/grpc/xds_metadata.h | 8 - test/core/load_balancing/BUILD | 1 - test/core/load_balancing/lb_policy_test_lib.h | 20 +- .../load_balancing/outlier_detection_test.cc | 2 +- test/core/load_balancing/ring_hash_test.cc | 145 +----------- .../load_balancing/xds_override_host_test.cc | 9 +- test/cpp/end2end/xds/BUILD | 1 - test/cpp/end2end/xds/xds_end2end_test_lib.h | 5 +- .../end2end/xds/xds_ring_hash_end2end_test.cc | 159 +------------- test/cpp/end2end/xds/xds_utils.cc | 11 - test/cpp/end2end/xds/xds_utils.h | 17 +- 21 files changed, 138 insertions(+), 564 deletions(-) diff --git a/BUILD b/BUILD index 310d4d53f57c1..b3f5d3e2e4295 100644 --- a/BUILD +++ b/BUILD @@ -605,6 +605,7 @@ GRPC_XDS_TARGETS = [ "//src/core:grpc_lb_policy_xds_cluster_manager", "//src/core:grpc_lb_policy_xds_override_host", "//src/core:grpc_lb_policy_xds_wrr_locality", + "//src/core:grpc_lb_policy_ring_hash", "//src/core:grpc_resolver_xds", "//src/core:grpc_resolver_c2p", "//src/core:grpc_xds_server_config_fetcher", @@ -837,7 +838,6 @@ grpc_cc_library( "//src/core:grpc_lb_policy_outlier_detection", "//src/core:grpc_lb_policy_pick_first", "//src/core:grpc_lb_policy_priority", - "//src/core:grpc_lb_policy_ring_hash", "//src/core:grpc_lb_policy_round_robin", "//src/core:grpc_lb_policy_weighted_round_robin", "//src/core:grpc_lb_policy_weighted_target", diff --git a/CMakeLists.txt b/CMakeLists.txt index 00003281ac66a..5aa53b28b9257 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3671,7 +3671,6 @@ add_library(grpc_unsecure src/core/load_balancing/outlier_detection/outlier_detection.cc src/core/load_balancing/pick_first/pick_first.cc src/core/load_balancing/priority/priority.cc - src/core/load_balancing/ring_hash/ring_hash.cc src/core/load_balancing/rls/rls.cc src/core/load_balancing/round_robin/round_robin.cc src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 9e0e3020e6810..45df9d5128eab 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -2673,7 +2673,6 @@ libs: - src/core/load_balancing/oob_backend_metric_internal.h - src/core/load_balancing/outlier_detection/outlier_detection.h - src/core/load_balancing/pick_first/pick_first.h - - src/core/load_balancing/ring_hash/ring_hash.h - src/core/load_balancing/rls/rls.h - src/core/load_balancing/subchannel_interface.h - src/core/load_balancing/weighted_round_robin/static_stride_scheduler.h @@ -2763,9 +2762,7 @@ libs: - src/core/util/uuid_v4.h - src/core/util/validation_errors.h - src/core/util/work_serializer.h - - src/core/util/xxhash_inline.h - third_party/upb/upb/generated_code_support.h - - third_party/xxhash/xxhash.h src: - src/core/call/request_buffer.cc - src/core/channelz/channel_trace.cc @@ -3100,7 +3097,6 @@ libs: - src/core/load_balancing/outlier_detection/outlier_detection.cc - src/core/load_balancing/pick_first/pick_first.cc - src/core/load_balancing/priority/priority.cc - - src/core/load_balancing/ring_hash/ring_hash.cc - src/core/load_balancing/rls/rls.cc - src/core/load_balancing/round_robin/round_robin.cc - src/core/load_balancing/weighted_round_robin/static_stride_scheduler.cc @@ -20439,7 +20435,6 @@ targets: - test/core/event_engine/event_engine_test_utils.h - test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h - test/core/load_balancing/lb_policy_test_lib.h - - test/core/test_util/scoped_env_var.h src: - test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.proto - test/core/event_engine/event_engine_test_utils.cc @@ -26830,7 +26825,6 @@ targets: run: false language: c++ headers: - - test/core/test_util/scoped_env_var.h - test/cpp/end2end/connection_attempt_injector.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/test_service_impl.h diff --git a/src/core/BUILD b/src/core/BUILD index 27bc4d6d9e0f6..9335eb1f22889 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -6011,7 +6011,6 @@ grpc_cc_library( "grpc_fake_credentials", "grpc_fault_injection_filter", "grpc_lb_policy_pick_first", - "grpc_lb_policy_ring_hash", "grpc_lb_xds_channel_args", "grpc_matchers", "grpc_outlier_detection_header", @@ -6668,7 +6667,6 @@ grpc_cc_library( "absl/container:inlined_vector", "absl/log:check", "absl/log:log", - "absl/random", "absl/status", "absl/status:statusor", "absl/strings", @@ -6681,7 +6679,6 @@ grpc_cc_library( "closure", "connectivity_state", "delegating_helper", - "env", "error", "grpc_lb_policy_pick_first", "grpc_service_config", @@ -6693,7 +6690,6 @@ grpc_cc_library( "lb_policy_registry", "pollset_set", "ref_counted", - "ref_counted_string", "resolved_address", "unique_type_name", "validation_errors", diff --git a/src/core/load_balancing/lb_policy.h b/src/core/load_balancing/lb_policy.h index e7ff9d56939ca..1bf499bce447c 100644 --- a/src/core/load_balancing/lb_policy.h +++ b/src/core/load_balancing/lb_policy.h @@ -152,6 +152,14 @@ class LoadBalancingPolicy : public InternallyRefCounted { /// The LB policy may use the existing metadata to influence its routing /// decision, and it may add new metadata elements to be sent with the /// call to the chosen backend. + // TODO(roth): Before making the LB policy API public, consider + // whether this is the right way to expose metadata to the picker. + // This approach means that if a pick modifies metadata but then we + // discard the pick because the subchannel is not connected, the + // metadata change will still have been made. Maybe we actually + // want to somehow provide metadata changes in PickResult::Complete + // instead? Or maybe we use a CallTracer that can add metadata when + // the call actually starts on the subchannel? MetadataInterface* initial_metadata; /// An interface for accessing call state. Can be used to allocate /// memory associated with the call in an efficient way. diff --git a/src/core/load_balancing/ring_hash/ring_hash.cc b/src/core/load_balancing/ring_hash/ring_hash.cc index f8f2c052ca0cb..2409a40e425b1 100644 --- a/src/core/load_balancing/ring_hash/ring_hash.cc +++ b/src/core/load_balancing/ring_hash/ring_hash.cc @@ -35,7 +35,6 @@ #include "absl/container/inlined_vector.h" #include "absl/log/check.h" #include "absl/log/log.h" -#include "absl/random/random.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/str_cat.h" @@ -60,12 +59,10 @@ #include "src/core/resolver/endpoint_addresses.h" #include "src/core/util/crash.h" #include "src/core/util/debug_location.h" -#include "src/core/util/env.h" #include "src/core/util/json/json.h" #include "src/core/util/orphanable.h" #include "src/core/util/ref_counted.h" #include "src/core/util/ref_counted_ptr.h" -#include "src/core/util/ref_counted_string.h" #include "src/core/util/unique_type_name.h" #include "src/core/util/work_serializer.h" #include "src/core/util/xxhash_inline.h" @@ -77,79 +74,53 @@ UniqueTypeName RequestHashAttribute::TypeName() { return kFactory.Create(); } -namespace { - -constexpr absl::string_view kRingHash = "ring_hash_experimental"; +// Helper Parser method -bool XdsRingHashSetRequestHashKeyEnabled() { - auto value = GetEnv("GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY"); - if (!value.has_value()) return false; - bool parsed_value; - bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value); - return parse_succeeded && parsed_value; +const JsonLoaderInterface* RingHashConfig::JsonLoader(const JsonArgs&) { + static const auto* loader = + JsonObjectLoader() + .OptionalField("minRingSize", &RingHashConfig::min_ring_size) + .OptionalField("maxRingSize", &RingHashConfig::max_ring_size) + .Finish(); + return loader; } -class RingHashJsonArgs final : public JsonArgs { - public: - bool IsEnabled(absl::string_view key) const override { - if (key == "request_hash_header") { - return XdsRingHashSetRequestHashKeyEnabled(); +void RingHashConfig::JsonPostLoad(const Json&, const JsonArgs&, + ValidationErrors* errors) { + { + ValidationErrors::ScopedField field(errors, ".minRingSize"); + if (!errors->FieldHasErrors() && + (min_ring_size == 0 || min_ring_size > 8388608)) { + errors->AddError("must be in the range [1, 8388608]"); } - return true; } -}; - -class RingHashLbConfig final : public LoadBalancingPolicy::Config { - public: - RingHashLbConfig() = default; + { + ValidationErrors::ScopedField field(errors, ".maxRingSize"); + if (!errors->FieldHasErrors() && + (max_ring_size == 0 || max_ring_size > 8388608)) { + errors->AddError("must be in the range [1, 8388608]"); + } + } + if (min_ring_size > max_ring_size) { + errors->AddError("max_ring_size cannot be smaller than min_ring_size"); + } +} - RingHashLbConfig(const RingHashLbConfig&) = delete; - RingHashLbConfig& operator=(const RingHashLbConfig&) = delete; +namespace { - RingHashLbConfig(RingHashLbConfig&& other) = delete; - RingHashLbConfig& operator=(RingHashLbConfig&& other) = delete; +constexpr absl::string_view kRingHash = "ring_hash_experimental"; +class RingHashLbConfig final : public LoadBalancingPolicy::Config { + public: + RingHashLbConfig(size_t min_ring_size, size_t max_ring_size) + : min_ring_size_(min_ring_size), max_ring_size_(max_ring_size) {} absl::string_view name() const override { return kRingHash; } size_t min_ring_size() const { return min_ring_size_; } size_t max_ring_size() const { return max_ring_size_; } - absl::string_view request_hash_header() const { return request_hash_header_; } - - static const JsonLoaderInterface* JsonLoader(const JsonArgs&) { - static const auto* loader = - JsonObjectLoader() - .OptionalField("minRingSize", &RingHashLbConfig::min_ring_size_) - .OptionalField("maxRingSize", &RingHashLbConfig::max_ring_size_) - .OptionalField("requestHashHeader", - &RingHashLbConfig::request_hash_header_, - "request_hash_header") - .Finish(); - return loader; - } - - void JsonPostLoad(const Json&, const JsonArgs&, ValidationErrors* errors) { - { - ValidationErrors::ScopedField field(errors, ".minRingSize"); - if (!errors->FieldHasErrors() && - (min_ring_size_ == 0 || min_ring_size_ > 8388608)) { - errors->AddError("must be in the range [1, 8388608]"); - } - } - { - ValidationErrors::ScopedField field(errors, ".maxRingSize"); - if (!errors->FieldHasErrors() && - (max_ring_size_ == 0 || max_ring_size_ > 8388608)) { - errors->AddError("must be in the range [1, 8388608]"); - } - } - if (min_ring_size_ > max_ring_size_) { - errors->AddError("maxRingSize cannot be smaller than minRingSize"); - } - } private: - uint64_t min_ring_size_ = 1024; - uint64_t max_ring_size_ = 4096; - std::string request_hash_header_; + size_t min_ring_size_; + size_t max_ring_size_; }; // @@ -246,13 +217,9 @@ class RingHash final : public LoadBalancingPolicy { explicit Picker(RefCountedPtr ring_hash) : ring_hash_(std::move(ring_hash)), ring_(ring_hash_->ring_), - endpoints_(ring_hash_->endpoints_.size()), - request_hash_header_(ring_hash_->request_hash_header_) { + endpoints_(ring_hash_->endpoints_.size()) { for (const auto& p : ring_hash_->endpoint_map_) { endpoints_[p.second->index()] = p.second->GetInfoForPicker(); - if (endpoints_[p.second->index()].state == GRPC_CHANNEL_CONNECTING) { - has_endpoint_in_connecting_state_ = true; - } } } @@ -293,8 +260,6 @@ class RingHash final : public LoadBalancingPolicy { RefCountedPtr ring_hash_; RefCountedPtr ring_; std::vector endpoints_; - bool has_endpoint_in_connecting_state_ = false; - RefCountedStringValue request_hash_header_; }; ~RingHash() override; @@ -313,7 +278,6 @@ class RingHash final : public LoadBalancingPolicy { // Current endpoint list, channel args, and ring. EndpointAddressesList endpoints_; ChannelArgs args_; - RefCountedStringValue request_hash_header_; RefCountedPtr ring_; std::map> endpoint_map_; @@ -333,34 +297,17 @@ class RingHash final : public LoadBalancingPolicy { // RingHash::PickResult RingHash::Picker::Pick(PickArgs args) { - // Determine request hash. - bool using_random_hash = false; - uint64_t request_hash; - if (request_hash_header_.as_string_view().empty()) { - // Being used in xDS. Request hash is passed in via an attribute. - auto* call_state = static_cast(args.call_state); - auto* hash_attribute = call_state->GetCallAttribute(); - if (hash_attribute == nullptr) { - return PickResult::Fail( - absl::InternalError("hash attribute not present")); - } - request_hash = hash_attribute->request_hash(); - } else { - std::string buffer; - auto header_value = args.initial_metadata->Lookup( - request_hash_header_.as_string_view(), &buffer); - if (header_value.has_value()) { - request_hash = XXH64(header_value->data(), header_value->size(), 0); - } else { - request_hash = absl::Uniform(absl::BitGen()); - using_random_hash = true; - } + auto* call_state = static_cast(args.call_state); + auto* hash_attribute = call_state->GetCallAttribute(); + if (hash_attribute == nullptr) { + return PickResult::Fail(absl::InternalError("hash attribute not present")); } + uint64_t request_hash = hash_attribute->request_hash(); + const auto& ring = ring_->ring(); // Find the index in the ring to use for this RPC. // Ported from https://github.com/RJ/ketama/blob/master/libketama/ketama.c // (ketama_get_server) NOTE: The algorithm depends on using signed integers // for lowp, highp, and index. Do not change them! - const auto& ring = ring_->ring(); int64_t lowp = 0; int64_t highp = ring.size(); int64_t index = 0; @@ -386,42 +333,22 @@ RingHash::PickResult RingHash::Picker::Pick(PickArgs args) { } } // Find the first endpoint we can use from the selected index. - if (!using_random_hash) { - for (size_t i = 0; i < ring.size(); ++i) { - const auto& entry = ring[(index + i) % ring.size()]; - const auto& endpoint_info = endpoints_[entry.endpoint_index]; - switch (endpoint_info.state) { - case GRPC_CHANNEL_READY: - return endpoint_info.picker->Pick(args); - case GRPC_CHANNEL_IDLE: - new EndpointConnectionAttempter( - ring_hash_.Ref(DEBUG_LOCATION, "EndpointConnectionAttempter"), - endpoint_info.endpoint); - ABSL_FALLTHROUGH_INTENDED; - case GRPC_CHANNEL_CONNECTING: - return PickResult::Queue(); - default: - break; - } - } - } else { - // Using a random hash. We will use the first READY endpoint we - // find, triggering at most one endpoint to attempt connecting. - bool requested_connection = has_endpoint_in_connecting_state_; - for (size_t i = 0; i < ring.size(); ++i) { - const auto& entry = ring[(index + i) % ring.size()]; - const auto& endpoint_info = endpoints_[entry.endpoint_index]; - if (endpoint_info.state == GRPC_CHANNEL_READY) { + for (size_t i = 0; i < ring.size(); ++i) { + const auto& entry = ring[(index + i) % ring.size()]; + const auto& endpoint_info = endpoints_[entry.endpoint_index]; + switch (endpoint_info.state) { + case GRPC_CHANNEL_READY: return endpoint_info.picker->Pick(args); - } - if (!requested_connection && endpoint_info.state == GRPC_CHANNEL_IDLE) { + case GRPC_CHANNEL_IDLE: new EndpointConnectionAttempter( ring_hash_.Ref(DEBUG_LOCATION, "EndpointConnectionAttempter"), endpoint_info.endpoint); - requested_connection = true; - } + ABSL_FALLTHROUGH_INTENDED; + case GRPC_CHANNEL_CONNECTING: + return PickResult::Queue(); + default: + break; } - if (requested_connection) return PickResult::Queue(); } return PickResult::Fail(absl::UnavailableError(absl::StrCat( "ring hash cannot find a connected endpoint; first failure: ", @@ -435,7 +362,7 @@ RingHash::PickResult RingHash::Picker::Pick(PickArgs args) { RingHash::Ring::Ring(RingHash* ring_hash, RingHashLbConfig* config) { // Store the weights while finding the sum. struct EndpointWeight { - std::string hash_key; // By default, endpoint's first address. + std::string address; // Key by endpoint's first address. // Default weight is 1 for the cases where a weight is not provided, // each occurrence of the address will be counted a weight value of 1. uint32_t weight = 1; @@ -447,14 +374,8 @@ RingHash::Ring::Ring(RingHash* ring_hash, RingHashLbConfig* config) { endpoint_weights.reserve(endpoints.size()); for (const auto& endpoint : endpoints) { EndpointWeight endpoint_weight; - auto hash_key = - endpoint.args().GetString(GRPC_ARG_RING_HASH_ENDPOINT_HASH_KEY); - if (hash_key.has_value()) { - endpoint_weight.hash_key = std::string(*hash_key); - } else { - endpoint_weight.hash_key = - grpc_sockaddr_to_string(&endpoint.addresses().front(), false).value(); - } + endpoint_weight.address = + grpc_sockaddr_to_string(&endpoint.addresses().front(), false).value(); // Weight should never be zero, but ignore it just in case, since // that value would screw up the ring-building algorithm. auto weight_arg = endpoint.args().GetInt(GRPC_ARG_ADDRESS_WEIGHT); @@ -504,8 +425,8 @@ RingHash::Ring::Ring(RingHash* ring_hash, RingHashLbConfig* config) { uint64_t min_hashes_per_host = ring_size; uint64_t max_hashes_per_host = 0; for (size_t i = 0; i < endpoints.size(); ++i) { - const std::string& hash_key = endpoint_weights[i].hash_key; - hash_key_buffer.assign(hash_key.begin(), hash_key.end()); + const std::string& address_string = endpoint_weights[i].address; + hash_key_buffer.assign(address_string.begin(), address_string.end()); hash_key_buffer.emplace_back('_'); auto offset_start = hash_key_buffer.end(); target_hashes += scale * endpoint_weights[i].normalized_weight; @@ -731,11 +652,9 @@ absl::Status RingHash::UpdateLocked(UpdateArgs args) { } // Save channel args. args_ = std::move(args.args); - // Save config. - auto* config = DownCast(args.config.get()); - request_hash_header_ = RefCountedStringValue(config->request_hash_header()); // Build new ring. - ring_ = MakeRefCounted(this, config); + ring_ = MakeRefCounted( + this, static_cast(args.config.get())); // Update endpoint map. std::map> endpoint_map; std::vector errors; @@ -934,9 +853,11 @@ class RingHashFactory final : public LoadBalancingPolicyFactory { absl::StatusOr> ParseLoadBalancingConfig(const Json& json) const override { - return LoadFromJson>( - json, RingHashJsonArgs(), - "errors validating ring_hash LB policy config"); + auto config = LoadFromJson( + json, JsonArgs(), "errors validating ring_hash LB policy config"); + if (!config.ok()) return config.status(); + return MakeRefCounted(config->min_ring_size, + config->max_ring_size); } }; diff --git a/src/core/load_balancing/ring_hash/ring_hash.h b/src/core/load_balancing/ring_hash/ring_hash.h index b3e9886202ce7..95f17cbe81dfd 100644 --- a/src/core/load_balancing/ring_hash/ring_hash.h +++ b/src/core/load_balancing/ring_hash/ring_hash.h @@ -27,10 +27,6 @@ #include "src/core/util/unique_type_name.h" #include "src/core/util/validation_errors.h" -// Optional endpoint attribute specifying the hash key. -#define GRPC_ARG_RING_HASH_ENDPOINT_HASH_KEY \ - GRPC_ARG_NO_SUBCHANNEL_PREFIX "hash_key" - namespace grpc_core { class RequestHashAttribute final @@ -49,6 +45,17 @@ class RequestHashAttribute final uint64_t request_hash_; }; +// Helper Parsing method to parse ring hash policy configs; for example, ring +// hash size validity. +struct RingHashConfig { + uint64_t min_ring_size = 1024; + uint64_t max_ring_size = 4096; + + static const JsonLoaderInterface* JsonLoader(const JsonArgs&); + void JsonPostLoad(const Json& json, const JsonArgs&, + ValidationErrors* errors); +}; + } // namespace grpc_core #endif // GRPC_SRC_CORE_LOAD_BALANCING_RING_HASH_RING_HASH_H diff --git a/src/core/plugin_registry/grpc_plugin_registry.cc b/src/core/plugin_registry/grpc_plugin_registry.cc index a276ea9222355..4970e2a012747 100644 --- a/src/core/plugin_registry/grpc_plugin_registry.cc +++ b/src/core/plugin_registry/grpc_plugin_registry.cc @@ -62,7 +62,6 @@ extern void RegisterOutlierDetectionLbPolicy( CoreConfiguration::Builder* builder); extern void RegisterWeightedTargetLbPolicy(CoreConfiguration::Builder* builder); extern void RegisterPickFirstLbPolicy(CoreConfiguration::Builder* builder); -extern void RegisterRingHashLbPolicy(CoreConfiguration::Builder* builder); extern void RegisterRoundRobinLbPolicy(CoreConfiguration::Builder* builder); extern void RegisterWeightedRoundRobinLbPolicy( CoreConfiguration::Builder* builder); @@ -103,7 +102,6 @@ void BuildCoreConfiguration(CoreConfiguration::Builder* builder) { RegisterWeightedTargetLbPolicy(builder); RegisterPickFirstLbPolicy(builder); RegisterRoundRobinLbPolicy(builder); - RegisterRingHashLbPolicy(builder); RegisterWeightedRoundRobinLbPolicy(builder); BuildClientChannelConfiguration(builder); SecurityRegisterHandshakerFactories(builder); diff --git a/src/core/plugin_registry/grpc_plugin_registry_extra.cc b/src/core/plugin_registry/grpc_plugin_registry_extra.cc index 7854b5154ab59..aa91cba241788 100644 --- a/src/core/plugin_registry/grpc_plugin_registry_extra.cc +++ b/src/core/plugin_registry/grpc_plugin_registry_extra.cc @@ -37,6 +37,7 @@ extern void RegisterCdsLbPolicy(CoreConfiguration::Builder* builder); extern void RegisterXdsOverrideHostLbPolicy( CoreConfiguration::Builder* builder); extern void RegisterXdsWrrLocalityLbPolicy(CoreConfiguration::Builder* builder); +extern void RegisterRingHashLbPolicy(CoreConfiguration::Builder* builder); extern void RegisterFileWatcherCertificateProvider( CoreConfiguration::Builder* builder); extern void RegisterXdsHttpProxyMapper(CoreConfiguration::Builder* builder); @@ -59,6 +60,7 @@ void RegisterExtraFilters(CoreConfiguration::Builder* builder) { RegisterCdsLbPolicy(builder); RegisterXdsOverrideHostLbPolicy(builder); RegisterXdsWrrLocalityLbPolicy(builder); + RegisterRingHashLbPolicy(builder); RegisterFileWatcherCertificateProvider(builder); RegisterXdsHttpProxyMapper(builder); #endif diff --git a/src/core/xds/grpc/xds_endpoint_parser.cc b/src/core/xds/grpc/xds_endpoint_parser.cc index 92a17c6743ad6..2bf1f44386365 100644 --- a/src/core/xds/grpc/xds_endpoint_parser.cc +++ b/src/core/xds/grpc/xds_endpoint_parser.cc @@ -45,11 +45,8 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/debug/trace.h" #include "src/core/lib/iomgr/resolved_address.h" -#include "src/core/load_balancing/ring_hash/ring_hash.h" #include "src/core/util/down_cast.h" #include "src/core/util/env.h" -#include "src/core/util/json/json_args.h" -#include "src/core/util/json/json_object_loader.h" #include "src/core/util/string.h" #include "src/core/util/upb_utils.h" #include "src/core/util/validation_errors.h" @@ -75,16 +72,6 @@ bool XdsDualstackEndpointsEnabled() { return parse_succeeded && parsed_value; } -// TODO(roth): Flip the default to false once this proves stable, then -// remove it entirely at some point in the future. -bool XdsEndpointHashKeyBackwardCompatEnabled() { - auto value = GetEnv("GRPC_XDS_ENDPOINT_HASH_KEY_BACKWARD_COMPAT"); - if (!value.has_value()) return true; - bool parsed_value; - bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value); - return parse_succeeded && parsed_value; -} - void MaybeLogClusterLoadAssignment( const XdsResourceType::DecodeContext& context, const envoy_config_endpoint_v3_ClusterLoadAssignment* cla) { @@ -100,22 +87,21 @@ void MaybeLogClusterLoadAssignment( } } -std::string GetProxyAddressFromMetadata(const XdsMetadataMap& metadata_map) { - auto* proxy_address_entry = metadata_map.FindType( - "envoy.http11_proxy_transport_socket.proxy_address"); - if (proxy_address_entry == nullptr) return ""; - return proxy_address_entry->address(); -} - -std::string GetHashKeyFromMetadata(const XdsMetadataMap& metadata_map) { - auto* hash_key_entry = - metadata_map.FindType("envoy.lb"); - if (hash_key_entry == nullptr) return ""; - ValidationErrors unused_errors; - return LoadJsonObjectField(hash_key_entry->json().object(), - JsonArgs(), "hash_key", - &unused_errors) - .value_or(""); +std::string GetProxyAddressFromMetadata( + const XdsResourceType::DecodeContext& context, + const envoy_config_core_v3_Metadata* metadata, ValidationErrors* errors) { + if (XdsHttpConnectEnabled() && metadata != nullptr) { + XdsMetadataMap metadata_map = + ParseXdsMetadataMap(context, metadata, errors); + auto* proxy_address_entry = + metadata_map.Find("envoy.http11_proxy_transport_socket.proxy_address"); + if (proxy_address_entry != nullptr && + proxy_address_entry->type() == XdsAddressMetadataValue::Type()) { + return DownCast(proxy_address_entry) + ->address(); + } + } + return ""; } absl::optional EndpointAddressesParse( @@ -140,19 +126,9 @@ absl::optional EndpointAddressesParse( } } // metadata - std::string proxy_address; - std::string hash_key; - if (XdsHttpConnectEnabled() || !XdsEndpointHashKeyBackwardCompatEnabled()) { - XdsMetadataMap metadata_map = ParseXdsMetadataMap( - context, envoy_config_endpoint_v3_LbEndpoint_metadata(lb_endpoint), - errors); - if (XdsHttpConnectEnabled()) { - proxy_address = GetProxyAddressFromMetadata(metadata_map); - } - if (!XdsEndpointHashKeyBackwardCompatEnabled()) { - hash_key = GetHashKeyFromMetadata(metadata_map); - } - } + std::string proxy_address = GetProxyAddressFromMetadata( + context, envoy_config_endpoint_v3_LbEndpoint_metadata(lb_endpoint), + errors); // endpoint std::vector addresses; absl::string_view hostname; @@ -201,9 +177,6 @@ absl::optional EndpointAddressesParse( } else if (!locality_proxy_address.empty()) { args = args.Set(GRPC_ARG_XDS_HTTP_PROXY, locality_proxy_address); } - if (!hash_key.empty()) { - args = args.Set(GRPC_ARG_RING_HASH_ENDPOINT_HASH_KEY, hash_key); - } return EndpointAddresses(addresses, args); } @@ -258,15 +231,11 @@ absl::optional LocalityParse( parsed_locality.locality.name = MakeRefCounted( std::move(region), std::move(zone), std::move(sub_zone)); // metadata - std::string proxy_address; - if (XdsHttpConnectEnabled()) { - XdsMetadataMap metadata_map = ParseXdsMetadataMap( - context, - envoy_config_endpoint_v3_LocalityLbEndpoints_metadata( - locality_lb_endpoints), - errors); - proxy_address = GetProxyAddressFromMetadata(metadata_map); - } + std::string proxy_address = GetProxyAddressFromMetadata( + context, + envoy_config_endpoint_v3_LocalityLbEndpoints_metadata( + locality_lb_endpoints), + errors); // lb_endpoints size_t size; const envoy_config_endpoint_v3_LbEndpoint* const* lb_endpoints = diff --git a/src/core/xds/grpc/xds_metadata.h b/src/core/xds/grpc/xds_metadata.h index 419540cb3631b..3e8fa4f214b79 100644 --- a/src/core/xds/grpc/xds_metadata.h +++ b/src/core/xds/grpc/xds_metadata.h @@ -60,14 +60,6 @@ class XdsMetadataMap { const XdsMetadataValue* Find(absl::string_view key) const; - template - const T* FindType(absl::string_view key) const { - auto it = map_.find(key); - if (it == map_.end()) return nullptr; - if (it->second->type() != T::Type()) return nullptr; - return DownCast(it->second.get()); - } - bool empty() const { return map_.empty(); } size_t size() const { return map_.size(); } diff --git a/test/core/load_balancing/BUILD b/test/core/load_balancing/BUILD index 2c89018f7d56e..022d2ca07691d 100644 --- a/test/core/load_balancing/BUILD +++ b/test/core/load_balancing/BUILD @@ -265,7 +265,6 @@ grpc_cc_test( "//src/core:channel_args", "//src/core:grpc_lb_policy_ring_hash", "//test/core/test_util:grpc_test_util", - "//test/core/test_util:scoped_env_var", ], ) diff --git a/test/core/load_balancing/lb_policy_test_lib.h b/test/core/load_balancing/lb_policy_test_lib.h index 1194b02e2d548..f784f925a6cbe 100644 --- a/test/core/load_balancing/lb_policy_test_lib.h +++ b/test/core/load_balancing/lb_policy_test_lib.h @@ -948,7 +948,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { EXPECT_TRUE(update.status.ok()) << update.status << " at " << location.file() << ":" << location.line(); - ExpectPickQueued(update.picker.get(), {}, {}, location); + ExpectPickQueued(update.picker.get(), {}, location); return true; // Keep going. } EXPECT_EQ(update.state, GRPC_CHANNEL_READY) @@ -992,7 +992,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { EXPECT_TRUE(update.status.ok()) << update.status << " at " << location.file() << ":" << location.line(); - ExpectPickQueued(update.picker.get(), {}, {}, location); + ExpectPickQueued(update.picker.get(), {}, location); return true; // Keep going. } EXPECT_EQ(update.state, GRPC_CHANNEL_TRANSIENT_FAILURE) @@ -1059,7 +1059,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { absl::Status expected_status = absl::OkStatus(), SourceLocation location = SourceLocation()) { auto picker = ExpectState(expected_state, expected_status, location); - return ExpectPickQueued(picker.get(), {}, {}, location); + return ExpectPickQueued(picker.get(), {}, location); } // Convenient frontend to ExpectStateAndQueuingPicker() for CONNECTING. @@ -1076,22 +1076,20 @@ class LoadBalancingPolicyTest : public ::testing::Test { // Does a pick and returns the result. LoadBalancingPolicy::PickResult DoPick( LoadBalancingPolicy::SubchannelPicker* picker, - const CallAttributes& call_attributes = {}, - const std::map& metadata = {}) { + const CallAttributes& call_attributes = {}) { ExecCtx exec_ctx; - FakeMetadata md(metadata); + FakeMetadata metadata({}); FakeCallState call_state(call_attributes); - return picker->Pick({"/service/method", &md, &call_state}); + return picker->Pick({"/service/method", &metadata, &call_state}); } // Requests a pick on picker and expects a Queue result. bool ExpectPickQueued(LoadBalancingPolicy::SubchannelPicker* picker, const CallAttributes call_attributes = {}, - const std::map& metadata = {}, SourceLocation location = SourceLocation()) { EXPECT_NE(picker, nullptr) << location.file() << ":" << location.line(); if (picker == nullptr) return false; - auto pick_result = DoPick(picker, call_attributes, metadata); + auto pick_result = DoPick(picker, call_attributes); EXPECT_TRUE(absl::holds_alternative( pick_result.result)) << PickResultString(pick_result) << "\nat " << location.file() << ":" @@ -1110,7 +1108,6 @@ class LoadBalancingPolicyTest : public ::testing::Test { absl::optional ExpectPickComplete( LoadBalancingPolicy::SubchannelPicker* picker, const CallAttributes& call_attributes = {}, - const std::map& metadata = {}, std::unique_ptr* subchannel_call_tracker = nullptr, SubchannelState::FakeSubchannel** picked_subchannel = nullptr, @@ -1119,7 +1116,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { if (picker == nullptr) { return absl::nullopt; } - auto pick_result = DoPick(picker, call_attributes, metadata); + auto pick_result = DoPick(picker, call_attributes); auto* complete = absl::get_if( &pick_result.result); EXPECT_NE(complete, nullptr) << PickResultString(pick_result) << " at " @@ -1170,7 +1167,6 @@ class LoadBalancingPolicyTest : public ::testing::Test { std::unique_ptr subchannel_call_tracker; auto address = ExpectPickComplete(picker, call_attributes, - /*metadata=*/{}, subchannel_call_trackers == nullptr ? nullptr : &subchannel_call_tracker, diff --git a/test/core/load_balancing/outlier_detection_test.cc b/test/core/load_balancing/outlier_detection_test.cc index 40a8cfc280ff3..d73a4ed54bf0d 100644 --- a/test/core/load_balancing/outlier_detection_test.cc +++ b/test/core/load_balancing/outlier_detection_test.cc @@ -154,7 +154,7 @@ class OutlierDetectionTest : public LoadBalancingPolicyTest { LoadBalancingPolicy::SubchannelPicker* picker) { std::unique_ptr subchannel_call_tracker; - auto address = ExpectPickComplete(picker, {}, {}, &subchannel_call_tracker); + auto address = ExpectPickComplete(picker, {}, &subchannel_call_tracker); if (address.has_value()) { subchannel_call_tracker->Start(); FakeMetadata metadata({}); diff --git a/test/core/load_balancing/ring_hash_test.cc b/test/core/load_balancing/ring_hash_test.cc index c0b8dcaa3747a..522f5794921dc 100644 --- a/test/core/load_balancing/ring_hash_test.cc +++ b/test/core/load_balancing/ring_hash_test.cc @@ -38,7 +38,6 @@ #include "src/core/util/ref_counted_ptr.h" #include "src/core/util/xxhash_inline.h" #include "test/core/load_balancing/lb_policy_test_lib.h" -#include "test/core/test_util/scoped_env_var.h" #include "test/core/test_util/test_config.h" namespace grpc_core { @@ -54,8 +53,7 @@ class RingHashTest : public LoadBalancingPolicyTest { RingHashTest() : LoadBalancingPolicyTest("ring_hash_experimental") {} static RefCountedPtr MakeRingHashConfig( - int min_ring_size = 0, int max_ring_size = 0, - const std::string& request_hash_header = "") { + int min_ring_size = 0, int max_ring_size = 0) { Json::Object fields; if (min_ring_size > 0) { fields["minRingSize"] = Json::FromString(absl::StrCat(min_ring_size)); @@ -63,25 +61,19 @@ class RingHashTest : public LoadBalancingPolicyTest { if (max_ring_size > 0) { fields["maxRingSize"] = Json::FromString(absl::StrCat(max_ring_size)); } - if (!request_hash_header.empty()) { - fields["requestHashHeader"] = Json::FromString(request_hash_header); - } return MakeConfig(Json::FromArray({Json::FromObject( {{"ring_hash_experimental", Json::FromObject(fields)}})})); } - RequestHashAttribute* MakeHashAttributeForString(absl::string_view key) { - std::string key_str = absl::StrCat(key, "_0"); - uint64_t hash = XXH64(key_str.data(), key_str.size(), 0); + RequestHashAttribute* MakeHashAttribute(absl::string_view address) { + std::string hash_input = + absl::StrCat(absl::StripPrefix(address, "ipv4:"), "_0"); + uint64_t hash = XXH64(hash_input.data(), hash_input.size(), 0); attribute_storage_.emplace_back( std::make_unique(hash)); return attribute_storage_.back().get(); } - RequestHashAttribute* MakeHashAttribute(absl::string_view address) { - return MakeHashAttributeForString(absl::StripPrefix(address, "ipv4:")); - } - std::vector> attribute_storage_; }; @@ -102,8 +94,6 @@ TEST_F(RingHashTest, Basic) { subchannel->SetConnectivityState(GRPC_CHANNEL_CONNECTING); picker = ExpectState(GRPC_CHANNEL_CONNECTING); ExpectPickQueued(picker.get(), {address0_attribute}); - EXPECT_EQ(nullptr, FindSubchannel(kAddresses[1])); - EXPECT_EQ(nullptr, FindSubchannel(kAddresses[2])); subchannel->SetConnectivityState(GRPC_CHANNEL_READY); picker = ExpectState(GRPC_CHANNEL_READY); auto address = ExpectPickComplete(picker.get(), {address0_attribute}); @@ -192,131 +182,6 @@ TEST_F(RingHashTest, MultipleAddressesPerEndpoint) { EXPECT_EQ(address, kEndpoint1Addresses[1]); } -TEST_F(RingHashTest, EndpointHashKeys) { - const std::array kAddresses = { - "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; - const std::array kHashKeys = {"foo", "bar", "baz"}; - std::vector endpoints; - for (size_t i = 0; i < 3; ++i) { - endpoints.push_back(MakeEndpointAddresses( - {kAddresses[i]}, - ChannelArgs().Set(GRPC_ARG_RING_HASH_ENDPOINT_HASH_KEY, kHashKeys[i]))); - }; - EXPECT_EQ( - ApplyUpdate(BuildUpdate(endpoints, MakeRingHashConfig()), lb_policy()), - absl::OkStatus()); - auto picker = ExpectState(GRPC_CHANNEL_IDLE); - auto* hash_attribute = MakeHashAttributeForString(kHashKeys[1]); - ExpectPickQueued(picker.get(), {hash_attribute}); - WaitForWorkSerializerToFlush(); - WaitForWorkSerializerToFlush(); - auto* subchannel = FindSubchannel(kAddresses[1]); - ASSERT_NE(subchannel, nullptr); - EXPECT_TRUE(subchannel->ConnectionRequested()); - subchannel->SetConnectivityState(GRPC_CHANNEL_CONNECTING); - picker = ExpectState(GRPC_CHANNEL_CONNECTING); - ExpectPickQueued(picker.get(), {hash_attribute}); - EXPECT_EQ(nullptr, FindSubchannel(kAddresses[0])); - EXPECT_EQ(nullptr, FindSubchannel(kAddresses[2])); - subchannel->SetConnectivityState(GRPC_CHANNEL_READY); - picker = ExpectState(GRPC_CHANNEL_READY); - auto address = ExpectPickComplete(picker.get(), {hash_attribute}); - EXPECT_EQ(address, kAddresses[1]); -} - -TEST_F(RingHashTest, PickFailsWithoutRequestHashAttribute) { - const std::array kAddresses = { - "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; - EXPECT_EQ( - ApplyUpdate(BuildUpdate(kAddresses, MakeRingHashConfig()), lb_policy()), - absl::OkStatus()); - auto picker = ExpectState(GRPC_CHANNEL_IDLE); - ExpectPickFail(picker.get(), [&](const absl::Status& status) { - EXPECT_EQ(status, absl::InternalError("hash attribute not present")); - }); -} - -TEST_F(RingHashTest, RequestHashHeaderNotEnabled) { - const std::array kAddresses = { - "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; - EXPECT_EQ( - ApplyUpdate(BuildUpdate(kAddresses, MakeRingHashConfig(0, 0, "foo")), - lb_policy()), - absl::OkStatus()); - auto picker = ExpectState(GRPC_CHANNEL_IDLE); - ExpectPickFail(picker.get(), [&](const absl::Status& status) { - EXPECT_EQ(status, absl::InternalError("hash attribute not present")); - }); -} - -TEST_F(RingHashTest, RequestHashHeader) { - ScopedExperimentalEnvVar env( - "GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY"); - const std::array kAddresses = { - "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; - EXPECT_EQ( - ApplyUpdate(BuildUpdate(kAddresses, MakeRingHashConfig(0, 0, "foo")), - lb_policy()), - absl::OkStatus()); - auto picker = ExpectState(GRPC_CHANNEL_IDLE); - std::string hash_key = - absl::StrCat(absl::StripPrefix(kAddresses[0], "ipv4:"), "_0"); - std::map metadata = {{"foo", hash_key}}; - ExpectPickQueued(picker.get(), /*call_attributes=*/{}, metadata); - WaitForWorkSerializerToFlush(); - WaitForWorkSerializerToFlush(); - auto* subchannel = FindSubchannel(kAddresses[0]); - ASSERT_NE(subchannel, nullptr); - EXPECT_TRUE(subchannel->ConnectionRequested()); - subchannel->SetConnectivityState(GRPC_CHANNEL_CONNECTING); - picker = ExpectState(GRPC_CHANNEL_CONNECTING); - ExpectPickQueued(picker.get(), {}, metadata); - EXPECT_EQ(nullptr, FindSubchannel(kAddresses[1])); - EXPECT_EQ(nullptr, FindSubchannel(kAddresses[2])); - subchannel->SetConnectivityState(GRPC_CHANNEL_READY); - picker = ExpectState(GRPC_CHANNEL_READY); - auto address = ExpectPickComplete(picker.get(), {}, metadata); - EXPECT_EQ(address, kAddresses[0]); -} - -TEST_F(RingHashTest, RequestHashHeaderNotPresent) { - ScopedExperimentalEnvVar env( - "GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY"); - const std::array kAddresses = { - "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; - EXPECT_EQ( - ApplyUpdate(BuildUpdate(kAddresses, MakeRingHashConfig(0, 0, "foo")), - lb_policy()), - absl::OkStatus()); - auto picker = ExpectState(GRPC_CHANNEL_IDLE); - ExpectPickQueued(picker.get()); - WaitForWorkSerializerToFlush(); - WaitForWorkSerializerToFlush(); - // It will randomly pick one. - size_t index = 0; - SubchannelState* subchannel = nullptr; - for (; index < kAddresses.size(); ++index) { - subchannel = FindSubchannel(kAddresses[index]); - if (subchannel != nullptr) { - LOG(INFO) << "Randomly picked subchannel index " << index; - break; - } - } - ASSERT_NE(subchannel, nullptr); - EXPECT_TRUE(subchannel->ConnectionRequested()); - subchannel->SetConnectivityState(GRPC_CHANNEL_CONNECTING); - picker = ExpectState(GRPC_CHANNEL_CONNECTING); - ExpectPickQueued(picker.get()); - // No other subchannels should have been created yet. - for (size_t i = 0; i < kAddresses.size(); ++i) { - if (i != index) EXPECT_EQ(nullptr, FindSubchannel(kAddresses[i])); - } - subchannel->SetConnectivityState(GRPC_CHANNEL_READY); - picker = ExpectState(GRPC_CHANNEL_READY); - auto address = ExpectPickComplete(picker.get()); - EXPECT_EQ(address, kAddresses[index]); -} - } // namespace } // namespace testing } // namespace grpc_core diff --git a/test/core/load_balancing/xds_override_host_test.cc b/test/core/load_balancing/xds_override_host_test.cc index 7f65f5a222196..e487b6ab32366 100644 --- a/test/core/load_balancing/xds_override_host_test.cc +++ b/test/core/load_balancing/xds_override_host_test.cc @@ -183,7 +183,7 @@ class XdsOverrideHostTest : public LoadBalancingPolicyTest { } std::string expected_addresses_str = absl::StrJoin(expected_addresses, ","); for (size_t i = 0; i < 3; ++i) { - EXPECT_EQ(ExpectPickComplete(picker, {attribute}, /*metadata=*/{}, + EXPECT_EQ(ExpectPickComplete(picker, {attribute}, /*subchannel_call_tracker=*/nullptr, /*picked_subchannel=*/nullptr, location), expected) @@ -202,10 +202,9 @@ class XdsOverrideHostTest : public LoadBalancingPolicyTest { SourceLocation location = SourceLocation()) { std::vector actual_picks; for (size_t i = 0; i < expected.size(); ++i) { - auto address = - ExpectPickComplete(picker, {attribute}, /*metadata=*/{}, - /*subchannel_call_tracker=*/nullptr, - /*picked_subchannel=*/nullptr, location); + auto address = ExpectPickComplete( + picker, {attribute}, /*subchannel_call_tracker=*/nullptr, + /*picked_subchannel=*/nullptr, location); ASSERT_TRUE(address.has_value()) << location.file() << ":" << location.line(); EXPECT_THAT(*address, ::testing::AnyOfArray(expected)) diff --git a/test/cpp/end2end/xds/BUILD b/test/cpp/end2end/xds/BUILD index 77e8e4f99fa90..22e9441ac6a12 100644 --- a/test/cpp/end2end/xds/BUILD +++ b/test/cpp/end2end/xds/BUILD @@ -414,7 +414,6 @@ grpc_cc_test( "//:grpc++", "//:grpc_resolver_fake", "//test/core/test_util:grpc_test_util", - "//test/core/test_util:scoped_env_var", "//test/cpp/end2end:connection_attempt_injector", "@envoy_api//envoy/config/cluster/v3:pkg_cc_proto", "@envoy_api//envoy/config/endpoint/v3:pkg_cc_proto", diff --git a/test/cpp/end2end/xds/xds_end2end_test_lib.h b/test/cpp/end2end/xds/xds_end2end_test_lib.h index 5a91d4554e03c..bfed1231aa664 100644 --- a/test/cpp/end2end/xds/xds_end2end_test_lib.h +++ b/test/cpp/end2end/xds/xds_end2end_test_lib.h @@ -487,8 +487,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam, ::envoy::config::core::v3::HealthStatus health_status = ::envoy::config::core::v3::HealthStatus::UNKNOWN, int lb_weight = 1, std::vector additional_backend_indexes = {}, - absl::string_view hostname = "", - const std::map& metadata = {}) { + absl::string_view hostname = "") { std::vector additional_ports; additional_ports.reserve(additional_backend_indexes.size()); for (size_t idx : additional_backend_indexes) { @@ -496,7 +495,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam, } return EdsResourceArgs::Endpoint(backends_[backend_idx]->port(), health_status, lb_weight, additional_ports, - hostname, metadata); + hostname); } // Creates a vector of endpoints for a specified range of backends, diff --git a/test/cpp/end2end/xds/xds_ring_hash_end2end_test.cc b/test/cpp/end2end/xds/xds_ring_hash_end2end_test.cc index 4755ac0349aea..75afa6c12bfb3 100644 --- a/test/cpp/end2end/xds/xds_ring_hash_end2end_test.cc +++ b/test/cpp/end2end/xds/xds_ring_hash_end2end_test.cc @@ -33,7 +33,6 @@ #include "src/core/resolver/fake/fake_resolver.h" #include "src/core/util/env.h" #include "test/core/test_util/resolve_localhost_ip46.h" -#include "test/core/test_util/scoped_env_var.h" #include "test/cpp/end2end/connection_attempt_injector.h" #include "test/cpp/end2end/xds/xds_end2end_test_lib.h" @@ -456,160 +455,6 @@ TEST_P(RingHashTest, HeaderHashingWithRegexRewrite) { EXPECT_TRUE(found); } -TEST_P(RingHashTest, HashKeysInEds) { - grpc_core::testing::ScopedEnvVar env( - "GRPC_XDS_ENDPOINT_HASH_KEY_BACKWARD_COMPAT", "false"); - CreateAndStartBackends(4); - auto cluster = default_cluster_; - cluster.set_lb_policy(Cluster::RING_HASH); - balancer_->ads_service()->SetCdsResource(cluster); - auto new_route_config = default_route_config_; - auto* route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); - auto* hash_policy = route->mutable_route()->add_hash_policy(); - hash_policy->mutable_header()->set_header_name("address_hash"); - SetListenerAndRouteConfiguration(balancer_.get(), default_listener_, - new_route_config); - EdsResourceArgs args( - {{"locality0", - { - CreateEndpoint(0, - /*health_status=*/ - ::envoy::config::core::v3::HealthStatus::UNKNOWN, - /*lb_weight=*/1, /*additional_backend_indexes=*/{}, - /*hostname=*/"", - {{"envoy.lb", "{\"hash_key\":\"foo\"}"}}), - CreateEndpoint(1, - /*health_status=*/ - ::envoy::config::core::v3::HealthStatus::UNKNOWN, - /*lb_weight=*/1, /*additional_backend_indexes=*/{}, - /*hostname=*/"", - {{"envoy.lb", "{\"hash_key\":\"bar\"}"}}), - CreateEndpoint(2, - /*health_status=*/ - ::envoy::config::core::v3::HealthStatus::UNKNOWN, - /*lb_weight=*/1, /*additional_backend_indexes=*/{}, - /*hostname=*/"", - {{"envoy.lb", "{\"hash_key\":\"baz\"}"}}), - CreateEndpoint(3, - /*health_status=*/ - ::envoy::config::core::v3::HealthStatus::UNKNOWN, - /*lb_weight=*/1, /*additional_backend_indexes=*/{}, - /*hostname=*/"", - {{"envoy.lb", "{\"hash_key\":\"quux\"}"}}), - }}}); - balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); - // Note each type of RPC will contains a header value that will always be - // hashed to a specific backend as the header value matches the value used - // to create the entry in the ring. - std::vector> metadata = { - {"address_hash", "foo_0"}}; - std::vector> metadata1 = { - {"address_hash", "bar_0"}}; - std::vector> metadata2 = { - {"address_hash", "baz_0"}}; - std::vector> metadata3 = { - {"address_hash", "quux_0"}}; - const auto rpc_options = - RpcOptions().set_metadata(std::move(metadata)).set_timeout_ms(5000); - const auto rpc_options1 = - RpcOptions().set_metadata(std::move(metadata1)).set_timeout_ms(5000); - const auto rpc_options2 = - RpcOptions().set_metadata(std::move(metadata2)).set_timeout_ms(5000); - const auto rpc_options3 = - RpcOptions().set_metadata(std::move(metadata3)).set_timeout_ms(5000); - WaitForBackend(DEBUG_LOCATION, 0, /*check_status=*/nullptr, - WaitForBackendOptions(), rpc_options); - WaitForBackend(DEBUG_LOCATION, 1, /*check_status=*/nullptr, - WaitForBackendOptions(), rpc_options1); - WaitForBackend(DEBUG_LOCATION, 2, /*check_status=*/nullptr, - WaitForBackendOptions(), rpc_options2); - WaitForBackend(DEBUG_LOCATION, 3, /*check_status=*/nullptr, - WaitForBackendOptions(), rpc_options3); - CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options); - CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options1); - CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options2); - CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options3); - for (size_t i = 0; i < backends_.size(); ++i) { - EXPECT_EQ(100, backends_[i]->backend_service()->request_count()); - } -} - -TEST_P(RingHashTest, HashKeysInEdsNotEnabled) { - CreateAndStartBackends(4); - auto cluster = default_cluster_; - cluster.set_lb_policy(Cluster::RING_HASH); - balancer_->ads_service()->SetCdsResource(cluster); - auto new_route_config = default_route_config_; - auto* route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); - auto* hash_policy = route->mutable_route()->add_hash_policy(); - hash_policy->mutable_header()->set_header_name("address_hash"); - SetListenerAndRouteConfiguration(balancer_.get(), default_listener_, - new_route_config); - EdsResourceArgs args( - {{"locality0", - { - CreateEndpoint(0, - /*health_status=*/ - ::envoy::config::core::v3::HealthStatus::UNKNOWN, - /*lb_weight=*/1, /*additional_backend_indexes=*/{}, - /*hostname=*/"", - {{"envoy.lb", "{\"hash_key\":\"foo\"}"}}), - CreateEndpoint(1, - /*health_status=*/ - ::envoy::config::core::v3::HealthStatus::UNKNOWN, - /*lb_weight=*/1, /*additional_backend_indexes=*/{}, - /*hostname=*/"", - {{"envoy.lb", "{\"hash_key\":\"bar\"}"}}), - CreateEndpoint(2, - /*health_status=*/ - ::envoy::config::core::v3::HealthStatus::UNKNOWN, - /*lb_weight=*/1, /*additional_backend_indexes=*/{}, - /*hostname=*/"", - {{"envoy.lb", "{\"hash_key\":\"baz\"}"}}), - CreateEndpoint(3, - /*health_status=*/ - ::envoy::config::core::v3::HealthStatus::UNKNOWN, - /*lb_weight=*/1, /*additional_backend_indexes=*/{}, - /*hostname=*/"", - {{"envoy.lb", "{\"hash_key\":\"quux\"}"}}), - }}}); - balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); - // Note each type of RPC will contains a header value that will always be - // hashed to a specific backend as the header value matches the value used - // to create the entry in the ring. - std::vector> metadata = { - {"address_hash", CreateMetadataValueThatHashesToBackend(0)}}; - std::vector> metadata1 = { - {"address_hash", CreateMetadataValueThatHashesToBackend(1)}}; - std::vector> metadata2 = { - {"address_hash", CreateMetadataValueThatHashesToBackend(2)}}; - std::vector> metadata3 = { - {"address_hash", CreateMetadataValueThatHashesToBackend(3)}}; - const auto rpc_options = - RpcOptions().set_metadata(std::move(metadata)).set_timeout_ms(5000); - const auto rpc_options1 = - RpcOptions().set_metadata(std::move(metadata1)).set_timeout_ms(5000); - const auto rpc_options2 = - RpcOptions().set_metadata(std::move(metadata2)).set_timeout_ms(5000); - const auto rpc_options3 = - RpcOptions().set_metadata(std::move(metadata3)).set_timeout_ms(5000); - WaitForBackend(DEBUG_LOCATION, 0, /*check_status=*/nullptr, - WaitForBackendOptions(), rpc_options); - WaitForBackend(DEBUG_LOCATION, 1, /*check_status=*/nullptr, - WaitForBackendOptions(), rpc_options1); - WaitForBackend(DEBUG_LOCATION, 2, /*check_status=*/nullptr, - WaitForBackendOptions(), rpc_options2); - WaitForBackend(DEBUG_LOCATION, 3, /*check_status=*/nullptr, - WaitForBackendOptions(), rpc_options3); - CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options); - CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options1); - CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options2); - CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options3); - for (size_t i = 0; i < backends_.size(); ++i) { - EXPECT_EQ(100, backends_[i]->backend_service()->request_count()); - } -} - // Tests that ring hash policy that hashes using a random value. TEST_P(RingHashTest, NoHashPolicy) { CreateAndStartBackends(2); @@ -796,7 +641,7 @@ TEST_P(RingHashTest, UnsupportedHashPolicyDefaultToRandomHashing) { } // Tests that ring hash policy that hashes using a random value can spread -// RPCs across all the backends according to endpoint weight. +// RPCs across all the backends according to locality weight. TEST_P(RingHashTest, RandomHashingDistributionAccordingToEndpointWeight) { CreateAndStartBackends(2); const size_t kWeight1 = 1; @@ -835,7 +680,7 @@ TEST_P(RingHashTest, RandomHashingDistributionAccordingToEndpointWeight) { } // Tests that ring hash policy that hashes using a random value can spread -// RPCs across all the backends according to locality and endpoint weight. +// RPCs across all the backends according to locality weight. TEST_P(RingHashTest, RandomHashingDistributionAccordingToLocalityAndEndpointWeight) { CreateAndStartBackends(2); diff --git a/test/cpp/end2end/xds/xds_utils.cc b/test/cpp/end2end/xds/xds_utils.cc index 1608099a9dd76..ad8f7a0c02abb 100644 --- a/test/cpp/end2end/xds/xds_utils.cc +++ b/test/cpp/end2end/xds/xds_utils.cc @@ -26,7 +26,6 @@ #include #include "absl/memory/memory.h" -#include "absl/strings/numbers.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" @@ -371,16 +370,6 @@ ClusterLoadAssignment XdsResourceUtils::BuildEdsResource( if (!endpoint.hostname.empty()) { endpoint_proto->set_hostname(endpoint.hostname); } - if (!endpoint.metadata.empty()) { - auto& filter_map = - *lb_endpoints->mutable_metadata()->mutable_filter_metadata(); - for (const auto& p : endpoint.metadata) { - absl::Status status = grpc::protobuf::json::JsonStringToMessage( - p.second, &filter_map[p.first], - grpc::protobuf::json::JsonParseOptions()); - CHECK(status.ok()) << status; - } - } } } if (!args.drop_categories.empty()) { diff --git a/test/cpp/end2end/xds/xds_utils.h b/test/cpp/end2end/xds/xds_utils.h index b8d13ee436cce..194827664562c 100644 --- a/test/cpp/end2end/xds/xds_utils.h +++ b/test/cpp/end2end/xds/xds_utils.h @@ -214,26 +214,23 @@ class XdsResourceUtils { struct EdsResourceArgs { // An individual endpoint for a backend running on a specified port. struct Endpoint { - explicit Endpoint( - int port, - ::envoy::config::core::v3::HealthStatus health_status = - ::envoy::config::core::v3::HealthStatus::UNKNOWN, - int lb_weight = 1, std::vector additional_ports = {}, - absl::string_view hostname = "", - const std::map& metadata = {}) + explicit Endpoint(int port, + ::envoy::config::core::v3::HealthStatus health_status = + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + int lb_weight = 1, + std::vector additional_ports = {}, + absl::string_view hostname = "") : port(port), health_status(health_status), lb_weight(lb_weight), additional_ports(std::move(additional_ports)), - hostname(hostname), - metadata(metadata) {} + hostname(hostname) {} int port; ::envoy::config::core::v3::HealthStatus health_status; int lb_weight; std::vector additional_ports; std::string hostname; - std::map metadata; }; // A locality. From 82501153837bac7ee6d1b69a20a81a573d8cd857 Mon Sep 17 00:00:00 2001 From: alto-ruby Date: Sat, 21 Dec 2024 12:33:58 -0800 Subject: [PATCH 22/26] [Ruby] do not use static thread local member in scoped activity (#34563) This is to fix #34297 PR #34103 removed the use of `static threada_local` as class member (not supported on windows) in ExecCtx, now it crashes at a later time in ScopedActivity accessing another static thread_local class memeber. This PR made a similar change by moving it into a function, with this PR, script in the original issue stopped crashing. ``` $ ruby test.rb Never gets here ``` There are still static threada_local class member usages in the following classes: [Context](https://github.com/grpc/grpc/blob/v1.59.0/src/core/lib/promise/context.h#L48) [ScopedSource](https://github.com/grpc/grpc/blob/v1.59.0/src/core/lib/gprpp/time.h#L175) [PerCpuShardingHelper](https://github.com/grpc/grpc/blob/v1.59.0/src/core/lib/gprpp/per_cpu.h#L79) [WorkSerializer::DispatchingWorkSerializer](https://github.com/grpc/grpc/blob/v1.59.0/src/core/lib/gprpp/work_serializer.cc#L387), DEBUG only I'll run more tests to see if they cause crashes as well. -- New crashes with the ExecCtx fix (#34103 ): ``` (gdb) s grpc_core::Activity::ScopedActivity::ScopedActivity (activity=0x1c01d0c7280, this=) at ./src/core/lib/promise/activity.h:241 241 static thread_local Activity* g_current_activity_; (gdb) s 0xffffffff93d10000 in ?? () (gdb) bt #0 0xffffffff93d10000 in ?? () Backtrace stopped: previous frame identical to this frame (corrupt stack?) ``` crash log: ``` -- C level backtrace information ------------------------------------------- C:\Windows\SYSTEM32\ntdll.dll(ZwWaitForSingleObject+0x14) [0x00007ff9dc0a00c4] C:\Windows\System32\KERNELBASE.dll(WaitForSingleObjectEx+0x8e) [0x00007ff9d9a5d77e] C:\Ruby31-x64\bin\x64-ucrt-ruby310.dll(rb_vm_bugreport+0x2b6) [0x00007ff9c184d086] C:\Ruby31-x64\bin\x64-ucrt-ruby310.dll(rb_bug_for_fatal_signal+0x84) [0x00007ff9c163f354] C:\Ruby31-x64\bin\x64-ucrt-ruby310.dll(rb_fiber_scheduler_address_resolve+0x68b) [0x00007ff9c179e7fb] [0x00007ff6d3671e22] C:\Windows\System32\ucrtbase.dll(_C_specific_handler+0xa0) [0x00007ff9d99555f0] C:\Windows\SYSTEM32\ntdll.dll(_chkstk+0x12f) [0x00007ff9dc0a4faf] C:\Windows\SYSTEM32\ntdll.dll(RtlVirtualUnwind2+0x35e) [0x00007ff9dc0318fe] C:\Windows\SYSTEM32\ntdll.dll(KiUserExceptionDispatcher+0x2e) [0x00007ff9dc0a3f9e] [0xffffffff944c0000] C:\Users\hannahshisfb\.local\share\gem\ruby\3.1.0\gems\grpc-1.60.0.dev-x64-mingw-ucrt\grpc_c.64-ucrt.ruby(ZN9grpc_core16BasicMemoryQuota5StartEv+0x6f0) [0x0000000000d280f0] C:\Users\hannahshisfb\.local\share\gem\ruby\3.1.0\gems\grpc-1.60.0.dev-x64-mingw-ucrt\grpc_c.64-ucrt.ruby(ZN9grpc_core13ResourceQuotaC2ENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE+0x1a2) [0 x0000000000d2b612] C:\Users\hannahshisfb\.local\share\gem\ruby\3.1.0\gems\grpc-1.60.0.dev-x64-mingw-ucrt\grpc_c.64-ucrt.ruby(ZN9grpc_core13ResourceQuota7DefaultEv+0x121) [0x0000000000d2b801] C:\Users\hannahshisfb\.local\share\gem\ruby\3.1.0\gems\grpc-1.60.0.dev-x64-mingw-ucrt\grpc_c.64-ucrt.ruby(ZN9grpc_core32EnsureResourceQuotaInChannelArgsERKNS_11ChannelArgsE+0x6a) [0x0000000000d2408a ] C:\Users\hannahshisfb\.local\share\gem\ruby\3.1.0\gems\grpc-1.60.0.dev-x64-mingw-ucrt\grpc_c.64-ucrt.ruby(ZNSt17_Function_handlerIFN9grpc_core11ChannelArgsES1_EPFS1_RKS1_EE9_M_invokeERKSt9_Any_dataO S1_+0x12) [0x0000000001092302] C:\Users\hannahshisfb\.local\share\gem\ruby\3.1.0\gems\grpc-1.60.0.dev-x64-mingw-ucrt\grpc_c.64-ucrt.ruby(ZNK9grpc_core26ChannelArgsPreconditioning23PreconditionChannelArgsEPK17grpc_channel_args+0x4 e) [0x0000000000c9680e] C:\Users\hannahshisfb\.local\share\gem\ruby\3.1.0\gems\grpc-1.60.0.dev-x64-mingw-ucrt\grpc_c.64-ucrt.ruby(grpc_channel_create+0x16f) [0x0000000000bd7d5f] [0x0000000071046591] ``` Closes #34563 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/34563 from alto-ruby:no-static-thread-local-member-in-scoped-activity 6fc5419a1d639d5118e884b40c645d5910df6b2d PiperOrigin-RevId: 708645478 --- src/core/lib/promise/activity.cc | 2 ++ src/core/lib/promise/activity.h | 25 ++++++++++++++++++------- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/core/lib/promise/activity.cc b/src/core/lib/promise/activity.cc index 1a0a52d7b647b..5c067f46c7933 100644 --- a/src/core/lib/promise/activity.cc +++ b/src/core/lib/promise/activity.cc @@ -30,7 +30,9 @@ namespace grpc_core { /////////////////////////////////////////////////////////////////////////////// // GLOBALS +#if !defined(_WIN32) || !defined(_DLL) thread_local Activity* Activity::g_current_activity_{nullptr}; +#endif namespace promise_detail { diff --git a/src/core/lib/promise/activity.h b/src/core/lib/promise/activity.h index b635286cbb56c..37cfc8dc8c5fd 100644 --- a/src/core/lib/promise/activity.h +++ b/src/core/lib/promise/activity.h @@ -215,7 +215,7 @@ class Activity : public Orphanable { // locked // - back up that assertion with a runtime check in debug builds (it's // prohibitively expensive in non-debug builds) - static Activity* current() { return g_current_activity_; } + static Activity* current() { return current_ref(); } // Produce an activity-owning Waker. The produced waker will keep the activity // alive until it's awoken or dropped. @@ -232,17 +232,16 @@ class Activity : public Orphanable { protected: // Check if this activity is the current activity executing on the current // thread. - bool is_current() const { return this == g_current_activity_; } + bool is_current() const { return this == current(); } // Check if there is an activity executing on the current thread. - static bool have_current() { return g_current_activity_ != nullptr; } + static bool have_current() { return current() != nullptr; } // Set the current activity at construction, clean it up at destruction. class ScopedActivity { public: - explicit ScopedActivity(Activity* activity) - : prior_activity_(g_current_activity_) { - g_current_activity_ = activity; + explicit ScopedActivity(Activity* activity) : prior_activity_(current()) { + current_ref() = activity; } - ~ScopedActivity() { g_current_activity_ = prior_activity_; } + ~ScopedActivity() { current_ref() = prior_activity_; } ScopedActivity(const ScopedActivity&) = delete; ScopedActivity& operator=(const ScopedActivity&) = delete; @@ -251,9 +250,21 @@ class Activity : public Orphanable { }; private: + static Activity*& current_ref() { +#if !defined(_WIN32) || !defined(_DLL) + return g_current_activity_; +#else + // Set during RunLoop to the Activity that's executing. + // Being set implies that mu_ is held. + static thread_local Activity* current_activity; + return current_activity; +#endif + } +#if !defined(_WIN32) || !defined(_DLL) // Set during RunLoop to the Activity that's executing. // Being set implies that mu_ is held. static thread_local Activity* g_current_activity_; +#endif }; // Owned pointer to one Activity. From 93b29607ccaa2545e2b3a5a8016f765333f1b38f Mon Sep 17 00:00:00 2001 From: Esun Kim Date: Mon, 23 Dec 2024 08:51:27 -0800 Subject: [PATCH 23/26] [C++] Transition to C++17 (#37919) This bumps the minimum version of C++ to 17 from 14 per https://github.com/grpc/proposal/blob/master/L120-requiring-cpp17.md Changes: - Used C++17 instead of C++14 when building gRPC. - Disabled `modernize-unary-static-assert` clang-tidy rule for the smooth transition. This rule will be re-enabled in a future update, along with a fix to address any identified issues. - Added a post-install script for XCode/Cocoapod examples to enforce the use of C++17 across all projects, preventing build errors. (I'd like to have a better solution here but couldn't find it) Closes #37919 PiperOrigin-RevId: 709073401 --- .clang-tidy | 1 - CMakeLists.txt | 6 +- Makefile | 2 +- Rakefile | 2 +- bazel/grpc_build_system.bzl | 2 +- config.m4 | 2 +- examples/android/helloworld/app/build.gradle | 2 +- examples/cpp/compression/Makefile | 2 +- examples/cpp/helloworld/Makefile | 2 +- .../HelloWorldCpp.xcodeproj/project.pbxproj | 4 +- examples/cpp/load_balancing/Makefile | 2 +- examples/cpp/metadata/Makefile | 2 +- examples/cpp/route_guide/Makefile | 2 +- .../AuthSample.xcodeproj/project.pbxproj | 4 +- .../HelloWorld.xcodeproj/project.pbxproj | 4 +- .../HelloWorld.xcodeproj/project.pbxproj | 4 +- .../project.pbxproj | 4 +- gRPC-C++.podspec | 2 +- gRPC-Core.podspec | 2 +- gRPC-ProtoRPC.podspec | 2 +- gRPC-RxLibrary.podspec | 2 +- gRPC.podspec | 2 +- setup.py | 8 +-- src/android/test/interop/app/build.gradle | 2 +- .../project.pbxproj | 4 +- src/objective-c/examples/Sample/Podfile | 8 +++ .../Sample/Sample.xcodeproj/project.pbxproj | 4 +- src/objective-c/examples/SwiftSample/Podfile | 8 +++ .../SwiftSample.xcodeproj/project.pbxproj | 4 +- .../examples/SwiftUseFrameworks/Podfile | 8 +++ .../tvOS-sample.xcodeproj/project.pbxproj | 4 +- .../watchOS-sample.xcodeproj/project.pbxproj | 4 +- .../GrpcIosTest.xcodeproj/project.pbxproj | 4 +- .../project.pbxproj | 4 +- .../tests/Tests.xcodeproj/project.pbxproj | 56 +++++++++---------- src/python/grpcio/commands.py | 2 +- src/python/grpcio_observability/setup.py | 6 +- templates/CMakeLists.txt.template | 6 +- templates/Makefile.template | 2 +- templates/config.m4.template | 2 +- templates/gRPC-C++.podspec.template | 2 +- templates/gRPC-Core.podspec.template | 2 +- templates/gRPC-ProtoRPC.podspec.template | 2 +- templates/gRPC-RxLibrary.podspec.template | 2 +- templates/gRPC.podspec.template | 2 +- .../CFStreamTests.xcodeproj/project.pbxproj | 4 +- .../GRPCCppTests.xcodeproj/project.pbxproj | 4 +- test/distrib/bazel/cpp/.bazelrc | 4 +- test/distrib/bazel/python/.bazelrc | 4 +- .../bazel/python_second_test_repo/.bazelrc | 4 +- tools/bazel.rc | 16 +++--- tools/distrib/gen_compilation_database.py | 2 +- tools/distrib/python/grpcio_tools/setup.py | 8 +-- tools/run_tests/artifacts/artifact_targets.py | 2 +- 54 files changed, 137 insertions(+), 114 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 8746003136a66..eb6f3b4c7b84c 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -129,7 +129,6 @@ Checks: '-*, modernize-replace-auto-ptr, modernize-replace-random-shuffle, modernize-shrink-to-fit, - modernize-unary-static-assert, modernize-use-bool-literals, modernize-use-noexcept, modernize-use-nullptr, diff --git a/CMakeLists.txt b/CMakeLists.txt index 5aa53b28b9257..17971518afc20 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -287,9 +287,9 @@ if(WIN32) endif() if (APPLE AND NOT DEFINED CMAKE_CXX_STANDARD) - # AppleClang defaults to C++98, so we bump it to C++14. - message("CMAKE_CXX_STANDARD was undefined, defaulting to C++14.") - set(CMAKE_CXX_STANDARD 14) + # AppleClang defaults to C++98, so we bump it to C++17. + message("CMAKE_CXX_STANDARD was undefined, defaulting to C++17.") + set(CMAKE_CXX_STANDARD 17) endif () if (NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE) diff --git a/Makefile b/Makefile index b36e2d8328248..fc2d63d07cd3e 100644 --- a/Makefile +++ b/Makefile @@ -279,7 +279,7 @@ HOST_LD ?= $(LD) HOST_LDXX ?= $(LDXX) CFLAGS += -std=c11 -CXXFLAGS += -std=c++14 +CXXFLAGS += -std=c++17 ifeq ($(SYSTEM),Darwin) CXXFLAGS += -stdlib=libc++ LDFLAGS += -framework CoreFoundation diff --git a/Rakefile b/Rakefile index 05b92b457be3b..aaea0a9092b4e 100755 --- a/Rakefile +++ b/Rakefile @@ -104,7 +104,7 @@ task 'dlls', [:plat] do |t, args| env = 'CPPFLAGS="-D_WIN32_WINNT=0x600 -DNTDDI_VERSION=0x06000000 -DUNICODE -D_UNICODE -Wno-unused-variable -Wno-unused-result -DCARES_STATICLIB -Wno-error=conversion -Wno-sign-compare -Wno-parentheses -Wno-format -DWIN32_LEAN_AND_MEAN" ' env += 'CFLAGS="-Wno-incompatible-pointer-types" ' - env += 'CXXFLAGS="-std=c++14 -fno-exceptions" ' + env += 'CXXFLAGS="-std=c++17 -fno-exceptions" ' env += 'LDFLAGS=-static ' env += 'SYSTEM=MINGW32 ' env += 'EMBED_ZLIB=true ' diff --git a/bazel/grpc_build_system.bzl b/bazel/grpc_build_system.bzl index 383c0e9ab6394..16e0185d90ef2 100644 --- a/bazel/grpc_build_system.bzl +++ b/bazel/grpc_build_system.bzl @@ -833,7 +833,7 @@ def grpc_objc_library( srcs = srcs, non_arc_srcs = non_arc_srcs, textual_hdrs = textual_hdrs, - copts = GRPC_DEFAULT_COPTS + ["-ObjC++", "-std=gnu++14"], + copts = GRPC_DEFAULT_COPTS + ["-ObjC++", "-std=gnu++17"], testonly = testonly, data = data, deps = deps, diff --git a/config.m4 b/config.m4 index ef92b98dcf589..b8cfeb179bca2 100644 --- a/config.m4 +++ b/config.m4 @@ -20,7 +20,7 @@ if test "$PHP_GRPC" != "no"; then LIBS="-lpthread $LIBS" CFLAGS="-std=c11 -g -O2" - CXXFLAGS="-std=c++14 -fno-exceptions -fno-rtti -g -O2" + CXXFLAGS="-std=c++17 -fno-exceptions -fno-rtti -g -O2" GRPC_SHARED_LIBADD="-lpthread $GRPC_SHARED_LIBADD" PHP_REQUIRE_CXX() PHP_ADD_LIBRARY(pthread) diff --git a/examples/android/helloworld/app/build.gradle b/examples/android/helloworld/app/build.gradle index b2d546cf6c08d..9d380f152a420 100644 --- a/examples/android/helloworld/app/build.gradle +++ b/examples/android/helloworld/app/build.gradle @@ -20,7 +20,7 @@ android { def grpc_cpp_plugin = project.hasProperty('grpc_cpp_plugin') ? project.property('grpc_cpp_plugin') : '/usr/local/bin/grpc_cpp_plugin' - cppFlags "-std=c++14 -frtti -fexceptions" + cppFlags "-std=c++17 -frtti -fexceptions" arguments '-DANDROID_STL=c++_static' arguments '-DRUN_HAVE_POSIX_REGEX=0' arguments '-DRUN_HAVE_STD_REGEX=0' diff --git a/examples/cpp/compression/Makefile b/examples/cpp/compression/Makefile index 7e9994ccdb69e..025611cf7f348 100644 --- a/examples/cpp/compression/Makefile +++ b/examples/cpp/compression/Makefile @@ -18,7 +18,7 @@ HOST_SYSTEM = $(shell uname | cut -f 1 -d_) SYSTEM ?= $(HOST_SYSTEM) CXX = g++ CPPFLAGS += `pkg-config --cflags protobuf grpc` -CXXFLAGS += -std=c++14 +CXXFLAGS += -std=c++17 ifeq ($(SYSTEM),Darwin) LDFLAGS += -L/usr/local/lib `pkg-config --libs --static protobuf grpc++ grpc`\ -lgrpc++_reflection\ diff --git a/examples/cpp/helloworld/Makefile b/examples/cpp/helloworld/Makefile index 50829c0026b06..e6ae66f8edacd 100644 --- a/examples/cpp/helloworld/Makefile +++ b/examples/cpp/helloworld/Makefile @@ -26,7 +26,7 @@ HOST_SYSTEM = $(shell uname | cut -f 1 -d_) SYSTEM ?= $(HOST_SYSTEM) CXX = g++ CPPFLAGS += `pkg-config --cflags protobuf grpc absl_flags absl_flags_parse` -CXXFLAGS += -std=c++14 +CXXFLAGS += -std=c++17 ifeq ($(SYSTEM),Darwin) LDFLAGS += -L/usr/local/lib `pkg-config --libs --static protobuf grpc++ absl_flags absl_flags_parse $(PROTOBUF_ABSL_DEPS)`\ $(PROTOBUF_UTF8_RANGE_LINK_LIBS) \ diff --git a/examples/cpp/helloworld/cocoapods/HelloWorldCpp.xcodeproj/project.pbxproj b/examples/cpp/helloworld/cocoapods/HelloWorldCpp.xcodeproj/project.pbxproj index e13681565ebdd..e2ed03ea8992a 100644 --- a/examples/cpp/helloworld/cocoapods/HelloWorldCpp.xcodeproj/project.pbxproj +++ b/examples/cpp/helloworld/cocoapods/HelloWorldCpp.xcodeproj/project.pbxproj @@ -254,7 +254,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -309,7 +309,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/examples/cpp/load_balancing/Makefile b/examples/cpp/load_balancing/Makefile index 2da6814b6593a..7b367478bbe9b 100644 --- a/examples/cpp/load_balancing/Makefile +++ b/examples/cpp/load_balancing/Makefile @@ -18,7 +18,7 @@ HOST_SYSTEM = $(shell uname | cut -f 1 -d_) SYSTEM ?= $(HOST_SYSTEM) CXX = g++ CPPFLAGS += `pkg-config --cflags protobuf grpc` -CXXFLAGS += -std=c++14 +CXXFLAGS += -std=c++17 ifeq ($(SYSTEM),Darwin) LDFLAGS += -L/usr/local/lib `pkg-config --libs --static protobuf grpc++ grpc`\ -lgrpc++_reflection\ diff --git a/examples/cpp/metadata/Makefile b/examples/cpp/metadata/Makefile index 0f596aaa0d639..497327fc4d822 100644 --- a/examples/cpp/metadata/Makefile +++ b/examples/cpp/metadata/Makefile @@ -17,7 +17,7 @@ SYSTEM ?= $(HOST_SYSTEM) CXX = g++ CPPFLAGS += `pkg-config --cflags protobuf grpc` -CXXFLAGS += -std=c++14 +CXXFLAGS += -std=c++17 ifeq ($(SYSTEM),Darwin) LDFLAGS += -L/usr/local/lib `pkg-config --libs --static protobuf grpc++ grpc`\ -lgrpc++_reflection\ diff --git a/examples/cpp/route_guide/Makefile b/examples/cpp/route_guide/Makefile index 8e9556ba63811..ae254230f68d6 100644 --- a/examples/cpp/route_guide/Makefile +++ b/examples/cpp/route_guide/Makefile @@ -26,7 +26,7 @@ HOST_SYSTEM = $(shell uname | cut -f 1 -d_) SYSTEM ?= $(HOST_SYSTEM) CXX = g++ CPPFLAGS += `pkg-config --cflags protobuf grpc` -CXXFLAGS += -std=c++14 +CXXFLAGS += -std=c++17 ifeq ($(SYSTEM),Darwin) LDFLAGS += -L/usr/local/lib `pkg-config --libs --static protobuf grpc++ $(PROTOBUF_ABSL_DEPS)`\ $(PROTOBUF_UTF8_RANGE_LINK_LIBS) \ diff --git a/examples/objective-c/auth_sample/AuthSample.xcodeproj/project.pbxproj b/examples/objective-c/auth_sample/AuthSample.xcodeproj/project.pbxproj index c67df015ce20c..a3de2ed9b57b0 100644 --- a/examples/objective-c/auth_sample/AuthSample.xcodeproj/project.pbxproj +++ b/examples/objective-c/auth_sample/AuthSample.xcodeproj/project.pbxproj @@ -255,7 +255,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -299,7 +299,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/examples/objective-c/helloworld/HelloWorld.xcodeproj/project.pbxproj b/examples/objective-c/helloworld/HelloWorld.xcodeproj/project.pbxproj index 113cdf76c4d6d..df067e5ef1b13 100644 --- a/examples/objective-c/helloworld/HelloWorld.xcodeproj/project.pbxproj +++ b/examples/objective-c/helloworld/HelloWorld.xcodeproj/project.pbxproj @@ -244,7 +244,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -286,7 +286,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/examples/objective-c/helloworld_macos/HelloWorld.xcodeproj/project.pbxproj b/examples/objective-c/helloworld_macos/HelloWorld.xcodeproj/project.pbxproj index 8a2139ca65e44..90c0c3011880b 100644 --- a/examples/objective-c/helloworld_macos/HelloWorld.xcodeproj/project.pbxproj +++ b/examples/objective-c/helloworld_macos/HelloWorld.xcodeproj/project.pbxproj @@ -235,7 +235,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -293,7 +293,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/examples/objective-c/route_guide/RouteGuideClient.xcodeproj/project.pbxproj b/examples/objective-c/route_guide/RouteGuideClient.xcodeproj/project.pbxproj index 836871d4dba79..3432c7c9cd528 100644 --- a/examples/objective-c/route_guide/RouteGuideClient.xcodeproj/project.pbxproj +++ b/examples/objective-c/route_guide/RouteGuideClient.xcodeproj/project.pbxproj @@ -255,7 +255,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -299,7 +299,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/gRPC-C++.podspec b/gRPC-C++.podspec index 8b064be3d55f5..332fbb2055c08 100644 --- a/gRPC-C++.podspec +++ b/gRPC-C++.podspec @@ -69,7 +69,7 @@ Pod::Spec.new do |s| # build. 'USE_HEADERMAP' => 'NO', 'ALWAYS_SEARCH_USER_PATHS' => 'NO', - 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++14', + 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', } s.libraries = 'c++' diff --git a/gRPC-Core.podspec b/gRPC-Core.podspec index da8de47e479c1..b26a93e3b0116 100644 --- a/gRPC-Core.podspec +++ b/gRPC-Core.podspec @@ -89,7 +89,7 @@ Pod::Spec.new do |s| 'ALWAYS_SEARCH_USER_PATHS' => 'NO', 'GCC_PREPROCESSOR_DEFINITIONS' => '"$(inherited)" "COCOAPODS=1"', 'CLANG_WARN_STRICT_PROTOTYPES' => 'NO', - 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++14', + 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', } s.default_subspecs = 'Interface', 'Implementation' diff --git a/gRPC-ProtoRPC.podspec b/gRPC-ProtoRPC.podspec index b2907f648c1fb..e0a7269f62e0a 100644 --- a/gRPC-ProtoRPC.podspec +++ b/gRPC-ProtoRPC.podspec @@ -85,6 +85,6 @@ Pod::Spec.new do |s| # This is needed by all pods that depend on gRPC-RxLibrary: 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES', 'CLANG_WARN_STRICT_PROTOTYPES' => 'NO', - 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++14', + 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', } end diff --git a/gRPC-RxLibrary.podspec b/gRPC-RxLibrary.podspec index 2e7cb30d25ec6..431766c0177a8 100644 --- a/gRPC-RxLibrary.podspec +++ b/gRPC-RxLibrary.podspec @@ -67,6 +67,6 @@ Pod::Spec.new do |s| s.pod_target_xcconfig = { 'CLANG_WARN_STRICT_PROTOTYPES' => 'NO', - 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++14', + 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', } end diff --git a/gRPC.podspec b/gRPC.podspec index f4b704b4ad419..f447d0ba01c87 100644 --- a/gRPC.podspec +++ b/gRPC.podspec @@ -42,7 +42,7 @@ Pod::Spec.new do |s| # This is needed by all pods that depend on gRPC-RxLibrary: 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES', 'CLANG_WARN_STRICT_PROTOTYPES' => 'NO', - 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++14', + 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', } s.ios.deployment_target = '11.0' diff --git a/setup.py b/setup.py index 3b6edbe002225..9ae111cdd2918 100644 --- a/setup.py +++ b/setup.py @@ -216,7 +216,7 @@ def check_linker_need_libatomic(): ) cxx = shlex.split(os.environ.get("CXX", "c++")) cpp_test = subprocess.Popen( - cxx + ["-x", "c++", "-std=c++14", "-"], + cxx + ["-x", "c++", "-std=c++17", "-"], stdin=PIPE, stdout=PIPE, stderr=PIPE, @@ -227,7 +227,7 @@ def check_linker_need_libatomic(): # Double-check to see if -latomic actually can solve the problem. # https://github.com/grpc/grpc/issues/22491 cpp_test = subprocess.Popen( - cxx + ["-x", "c++", "-std=c++14", "-", "-latomic"], + cxx + ["-x", "c++", "-std=c++17", "-", "-latomic"], stdin=PIPE, stdout=PIPE, stderr=PIPE, @@ -270,13 +270,13 @@ def check_linker_need_libatomic(): EXTRA_ENV_COMPILE_ARGS += " /MT" elif "linux" in sys.platform: # GCC by defaults uses C17 so only C++14 needs to be specified. - EXTRA_ENV_COMPILE_ARGS += " -std=c++14" + EXTRA_ENV_COMPILE_ARGS += " -std=c++17" EXTRA_ENV_COMPILE_ARGS += ( " -fvisibility=hidden -fno-wrapv -fno-exceptions" ) elif "darwin" in sys.platform: # AppleClang by defaults uses C17 so only C++14 needs to be specified. - EXTRA_ENV_COMPILE_ARGS += " -std=c++14" + EXTRA_ENV_COMPILE_ARGS += " -std=c++17" EXTRA_ENV_COMPILE_ARGS += ( " -stdlib=libc++ -fvisibility=hidden -fno-wrapv -fno-exceptions" " -DHAVE_UNISTD_H" diff --git a/src/android/test/interop/app/build.gradle b/src/android/test/interop/app/build.gradle index 1ea0fdb445d68..2e17ea3294eeb 100644 --- a/src/android/test/interop/app/build.gradle +++ b/src/android/test/interop/app/build.gradle @@ -20,7 +20,7 @@ android { def grpc_cpp_plugin = project.hasProperty('grpc_cpp_plugin') ? project.property('grpc_cpp_plugin') : '/usr/local/bin/grpc_cpp_plugin' - cppFlags "-std=c++14 -frtti -fexceptions" + cppFlags "-std=c++17 -frtti -fexceptions" arguments '-DANDROID_STL=c++_shared' arguments '-DRUN_HAVE_POSIX_REGEX=0' arguments '-DRUN_HAVE_STD_REGEX=0' diff --git a/src/objective-c/examples/InterceptorSample/InterceptorSample.xcodeproj/project.pbxproj b/src/objective-c/examples/InterceptorSample/InterceptorSample.xcodeproj/project.pbxproj index 09a8ae8ffe291..0949a8b6419a6 100644 --- a/src/objective-c/examples/InterceptorSample/InterceptorSample.xcodeproj/project.pbxproj +++ b/src/objective-c/examples/InterceptorSample/InterceptorSample.xcodeproj/project.pbxproj @@ -249,7 +249,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -308,7 +308,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/src/objective-c/examples/Sample/Podfile b/src/objective-c/examples/Sample/Podfile index 141102b2c6f40..0b22496cc4a9b 100644 --- a/src/objective-c/examples/Sample/Podfile +++ b/src/objective-c/examples/Sample/Podfile @@ -24,3 +24,11 @@ target 'Sample' do pod 'gRPC-RxLibrary', :path => GRPC_LOCAL_SRC pod 'gRPC-ProtoRPC', :path => GRPC_LOCAL_SRC end + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['CLANG_CXX_LANGUAGE_STANDARD'] = 'c++17' + end + end +end diff --git a/src/objective-c/examples/Sample/Sample.xcodeproj/project.pbxproj b/src/objective-c/examples/Sample/Sample.xcodeproj/project.pbxproj index f76dd22bcfff3..fa0242a0a5cbb 100644 --- a/src/objective-c/examples/Sample/Sample.xcodeproj/project.pbxproj +++ b/src/objective-c/examples/Sample/Sample.xcodeproj/project.pbxproj @@ -244,7 +244,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -287,7 +287,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/src/objective-c/examples/SwiftSample/Podfile b/src/objective-c/examples/SwiftSample/Podfile index d69350a49f725..84bd701a2734b 100644 --- a/src/objective-c/examples/SwiftSample/Podfile +++ b/src/objective-c/examples/SwiftSample/Podfile @@ -26,3 +26,11 @@ target 'SwiftSample' do pod 'gRPC-RxLibrary', :path => GRPC_LOCAL_SRC pod 'gRPC-ProtoRPC', :path => GRPC_LOCAL_SRC end + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['CLANG_CXX_LANGUAGE_STANDARD'] = 'c++17' + end + end +end diff --git a/src/objective-c/examples/SwiftSample/SwiftSample.xcodeproj/project.pbxproj b/src/objective-c/examples/SwiftSample/SwiftSample.xcodeproj/project.pbxproj index 9aa4feaf2b72e..ec1f95e6a847b 100644 --- a/src/objective-c/examples/SwiftSample/SwiftSample.xcodeproj/project.pbxproj +++ b/src/objective-c/examples/SwiftSample/SwiftSample.xcodeproj/project.pbxproj @@ -255,7 +255,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -302,7 +302,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/src/objective-c/examples/SwiftUseFrameworks/Podfile b/src/objective-c/examples/SwiftUseFrameworks/Podfile index 71c4e6adc5f84..1a6c0ca00d4e8 100644 --- a/src/objective-c/examples/SwiftUseFrameworks/Podfile +++ b/src/objective-c/examples/SwiftUseFrameworks/Podfile @@ -17,3 +17,11 @@ target 'SwiftUseFrameworks' do pod 'gRPC-RxLibrary', :path => GRPC_LOCAL_SRC pod 'BoringSSL-GRPC', :podspec => "#{GRPC_LOCAL_SRC}/src/objective-c" end + +post_install do |installer| + installer.pods_project.targets.each do |target| + target.build_configurations.each do |config| + config.build_settings['CLANG_CXX_LANGUAGE_STANDARD'] = 'c++17' + end + end +end diff --git a/src/objective-c/examples/tvOS-sample/tvOS-sample.xcodeproj/project.pbxproj b/src/objective-c/examples/tvOS-sample/tvOS-sample.xcodeproj/project.pbxproj index b3987f2469375..07473a3645a1e 100644 --- a/src/objective-c/examples/tvOS-sample/tvOS-sample.xcodeproj/project.pbxproj +++ b/src/objective-c/examples/tvOS-sample/tvOS-sample.xcodeproj/project.pbxproj @@ -256,7 +256,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -310,7 +310,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/src/objective-c/examples/watchOS-sample/watchOS-sample.xcodeproj/project.pbxproj b/src/objective-c/examples/watchOS-sample/watchOS-sample.xcodeproj/project.pbxproj index 419ab26b60389..f610b548a344f 100644 --- a/src/objective-c/examples/watchOS-sample/watchOS-sample.xcodeproj/project.pbxproj +++ b/src/objective-c/examples/watchOS-sample/watchOS-sample.xcodeproj/project.pbxproj @@ -540,7 +540,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -595,7 +595,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/src/objective-c/manual_tests/GrpcIosTest.xcodeproj/project.pbxproj b/src/objective-c/manual_tests/GrpcIosTest.xcodeproj/project.pbxproj index 9523b8f9102b0..d8e4741effae7 100644 --- a/src/objective-c/manual_tests/GrpcIosTest.xcodeproj/project.pbxproj +++ b/src/objective-c/manual_tests/GrpcIosTest.xcodeproj/project.pbxproj @@ -287,7 +287,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -345,7 +345,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/src/objective-c/tests/Connectivity/ConnectivityTestingApp.xcodeproj/project.pbxproj b/src/objective-c/tests/Connectivity/ConnectivityTestingApp.xcodeproj/project.pbxproj index 345f5bccd3548..92ea465ca31b7 100644 --- a/src/objective-c/tests/Connectivity/ConnectivityTestingApp.xcodeproj/project.pbxproj +++ b/src/objective-c/tests/Connectivity/ConnectivityTestingApp.xcodeproj/project.pbxproj @@ -233,7 +233,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -288,7 +288,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/src/objective-c/tests/Tests.xcodeproj/project.pbxproj b/src/objective-c/tests/Tests.xcodeproj/project.pbxproj index ad1e7ccf44c4f..78cc21ba765d2 100644 --- a/src/objective-c/tests/Tests.xcodeproj/project.pbxproj +++ b/src/objective-c/tests/Tests.xcodeproj/project.pbxproj @@ -1124,7 +1124,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -1155,7 +1155,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -1184,7 +1184,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -1213,7 +1213,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -1240,7 +1240,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -1285,7 +1285,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -1326,7 +1326,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -1364,7 +1364,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -1409,7 +1409,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -1447,7 +1447,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -1482,7 +1482,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -1514,7 +1514,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -1546,7 +1546,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -1576,7 +1576,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -1623,7 +1623,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -1665,7 +1665,7 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -1703,7 +1703,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -1735,7 +1735,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -1765,7 +1765,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -1795,7 +1795,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; CLANG_WARN_DOCUMENTATION_COMMENTS = YES; @@ -1825,7 +1825,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -1862,7 +1862,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -1902,7 +1902,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -1936,7 +1936,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -1970,7 +1970,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -2005,7 +2005,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -2037,7 +2037,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; @@ -2069,7 +2069,7 @@ buildSettings = { CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_ENABLE_OBJC_WEAK = YES; CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_COMMA = YES; diff --git a/src/python/grpcio/commands.py b/src/python/grpcio/commands.py index 4673157fc9fed..a55b36f6792ca 100644 --- a/src/python/grpcio/commands.py +++ b/src/python/grpcio/commands.py @@ -256,7 +256,7 @@ def compiler_ok_with_extra_std(): # TODO(lidiz) Remove the generated a.out for success tests. cc = os.environ.get("CC", "cc") cc_test = subprocess.Popen( - [cc, "-x", "c", "-std=c++14", "-"], + [cc, "-x", "c", "-std=c++17", "-"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, diff --git a/src/python/grpcio_observability/setup.py b/src/python/grpcio_observability/setup.py index efe4cad8a2290..201efe27bd5b2 100644 --- a/src/python/grpcio_observability/setup.py +++ b/src/python/grpcio_observability/setup.py @@ -100,7 +100,7 @@ def check_linker_need_libatomic(): ) cxx = shlex.split(os.environ.get("CXX", "c++")) cpp_test = subprocess.Popen( - cxx + ["-x", "c++", "-std=c++14", "-"], + cxx + ["-x", "c++", "-std=c++17", "-"], stdin=PIPE, stdout=PIPE, stderr=PIPE, @@ -111,7 +111,7 @@ def check_linker_need_libatomic(): # Double-check to see if -latomic actually can solve the problem. # https://github.com/grpc/grpc/issues/22491 cpp_test = subprocess.Popen( - cxx + ["-x", "c++", "-std=c++14", "-", "-latomic"], + cxx + ["-x", "c++", "-std=c++17", "-", "-latomic"], stdin=PIPE, stdout=PIPE, stderr=PIPE, @@ -163,7 +163,7 @@ def get_ext_filename(self, ext_name): 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++14" + EXTRA_ENV_COMPILE_ARGS = "-std=c++17" if "win32" in sys.platform: # We need to statically link the C++ Runtime, only the C runtime is # available dynamically diff --git a/templates/CMakeLists.txt.template b/templates/CMakeLists.txt.template index 27c0d87d6728f..70fda0808e4bc 100644 --- a/templates/CMakeLists.txt.template +++ b/templates/CMakeLists.txt.template @@ -393,9 +393,9 @@ endif() if (APPLE AND NOT DEFINED CMAKE_CXX_STANDARD) - # AppleClang defaults to C++98, so we bump it to C++14. - message("CMAKE_CXX_STANDARD was undefined, defaulting to C++14.") - set(CMAKE_CXX_STANDARD 14) + # AppleClang defaults to C++98, so we bump it to C++17. + message("CMAKE_CXX_STANDARD was undefined, defaulting to C++17.") + set(CMAKE_CXX_STANDARD 17) endif () ## Some libraries are shared even with BUILD_SHARED_LIBRARIES=OFF diff --git a/templates/Makefile.template b/templates/Makefile.template index 5095da4539464..0ac0ad75ec7a5 100644 --- a/templates/Makefile.template +++ b/templates/Makefile.template @@ -297,7 +297,7 @@ HOST_LDXX ?= $(LDXX) CFLAGS += -std=c11 - CXXFLAGS += -std=c++14 + CXXFLAGS += -std=c++17 ifeq ($(SYSTEM),Darwin) CXXFLAGS += -stdlib=libc++ LDFLAGS += -framework CoreFoundation diff --git a/templates/config.m4.template b/templates/config.m4.template index b87f23a0d567f..484468d61e0d3 100644 --- a/templates/config.m4.template +++ b/templates/config.m4.template @@ -22,7 +22,7 @@ LIBS="-lpthread $LIBS" CFLAGS="-std=c11 -g -O2" - CXXFLAGS="-std=c++14 -fno-exceptions -fno-rtti -g -O2" + CXXFLAGS="-std=c++17 -fno-exceptions -fno-rtti -g -O2" GRPC_SHARED_LIBADD="-lpthread $GRPC_SHARED_LIBADD" PHP_REQUIRE_CXX() PHP_ADD_LIBRARY(pthread) diff --git a/templates/gRPC-C++.podspec.template b/templates/gRPC-C++.podspec.template index 71ee869b8ed74..e7e1a7a6c5547 100644 --- a/templates/gRPC-C++.podspec.template +++ b/templates/gRPC-C++.podspec.template @@ -153,7 +153,7 @@ # build. 'USE_HEADERMAP' => 'NO', 'ALWAYS_SEARCH_USER_PATHS' => 'NO', - 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++14', + 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', } s.libraries = 'c++' diff --git a/templates/gRPC-Core.podspec.template b/templates/gRPC-Core.podspec.template index 981df6c6efd61..f1e52cbb4e5f4 100644 --- a/templates/gRPC-Core.podspec.template +++ b/templates/gRPC-Core.podspec.template @@ -165,7 +165,7 @@ 'ALWAYS_SEARCH_USER_PATHS' => 'NO', 'GCC_PREPROCESSOR_DEFINITIONS' => '"$(inherited)" "COCOAPODS=1"', 'CLANG_WARN_STRICT_PROTOTYPES' => 'NO', - 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++14', + 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', } s.default_subspecs = 'Interface', 'Implementation' diff --git a/templates/gRPC-ProtoRPC.podspec.template b/templates/gRPC-ProtoRPC.podspec.template index 5cb152c69d043..145fddac7a96f 100644 --- a/templates/gRPC-ProtoRPC.podspec.template +++ b/templates/gRPC-ProtoRPC.podspec.template @@ -87,6 +87,6 @@ # This is needed by all pods that depend on gRPC-RxLibrary: 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES', 'CLANG_WARN_STRICT_PROTOTYPES' => 'NO', - 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++14', + 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', } end diff --git a/templates/gRPC-RxLibrary.podspec.template b/templates/gRPC-RxLibrary.podspec.template index e40f4a881520b..bc36528db569b 100644 --- a/templates/gRPC-RxLibrary.podspec.template +++ b/templates/gRPC-RxLibrary.podspec.template @@ -69,6 +69,6 @@ s.pod_target_xcconfig = { 'CLANG_WARN_STRICT_PROTOTYPES' => 'NO', - 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++14', + 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', } end diff --git a/templates/gRPC.podspec.template b/templates/gRPC.podspec.template index a8b1d37eb5526..fb2db4da021e1 100644 --- a/templates/gRPC.podspec.template +++ b/templates/gRPC.podspec.template @@ -44,7 +44,7 @@ # This is needed by all pods that depend on gRPC-RxLibrary: 'CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES' => 'YES', 'CLANG_WARN_STRICT_PROTOTYPES' => 'NO', - 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++14', + 'CLANG_CXX_LANGUAGE_STANDARD' => 'c++17', } s.ios.deployment_target = '11.0' diff --git a/test/core/iomgr/ios/CFStreamTests/CFStreamTests.xcodeproj/project.pbxproj b/test/core/iomgr/ios/CFStreamTests/CFStreamTests.xcodeproj/project.pbxproj index a8cede81a642c..acf07e88b668f 100644 --- a/test/core/iomgr/ios/CFStreamTests/CFStreamTests.xcodeproj/project.pbxproj +++ b/test/core/iomgr/ios/CFStreamTests/CFStreamTests.xcodeproj/project.pbxproj @@ -164,7 +164,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -218,7 +218,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/test/cpp/cocoapods/GRPCCppTests.xcodeproj/project.pbxproj b/test/cpp/cocoapods/GRPCCppTests.xcodeproj/project.pbxproj index acde2861fc0dd..5521d8727f45d 100644 --- a/test/cpp/cocoapods/GRPCCppTests.xcodeproj/project.pbxproj +++ b/test/cpp/cocoapods/GRPCCppTests.xcodeproj/project.pbxproj @@ -321,7 +321,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; @@ -377,7 +377,7 @@ ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; diff --git a/test/distrib/bazel/cpp/.bazelrc b/test/distrib/bazel/cpp/.bazelrc index 405e510b4258f..d02f22bdc5556 100644 --- a/test/distrib/bazel/cpp/.bazelrc +++ b/test/distrib/bazel/cpp/.bazelrc @@ -4,5 +4,5 @@ # Therefore, this option is disabled until gRPC works with bzlmod. common --enable_bzlmod=false -build --cxxopt='-std=c++14' -build --host_cxxopt='-std=c++14' +build --cxxopt='-std=c++17' +build --host_cxxopt='-std=c++17' diff --git a/test/distrib/bazel/python/.bazelrc b/test/distrib/bazel/python/.bazelrc index 405e510b4258f..d02f22bdc5556 100644 --- a/test/distrib/bazel/python/.bazelrc +++ b/test/distrib/bazel/python/.bazelrc @@ -4,5 +4,5 @@ # Therefore, this option is disabled until gRPC works with bzlmod. common --enable_bzlmod=false -build --cxxopt='-std=c++14' -build --host_cxxopt='-std=c++14' +build --cxxopt='-std=c++17' +build --host_cxxopt='-std=c++17' diff --git a/test/distrib/bazel/python_second_test_repo/.bazelrc b/test/distrib/bazel/python_second_test_repo/.bazelrc index 405e510b4258f..d02f22bdc5556 100644 --- a/test/distrib/bazel/python_second_test_repo/.bazelrc +++ b/test/distrib/bazel/python_second_test_repo/.bazelrc @@ -4,5 +4,5 @@ # Therefore, this option is disabled until gRPC works with bzlmod. common --enable_bzlmod=false -build --cxxopt='-std=c++14' -build --host_cxxopt='-std=c++14' +build --cxxopt='-std=c++17' +build --host_cxxopt='-std=c++17' diff --git a/tools/bazel.rc b/tools/bazel.rc index 8cd69bd9b7f8c..e2ceff7e4d7f3 100644 --- a/tools/bazel.rc +++ b/tools/bazel.rc @@ -7,14 +7,14 @@ common --enable_bzlmod=false # for platform-appropriate cxxopts common --enable_platform_specific_config -build:windows --cxxopt='/std:c++14' -build:windows --host_cxxopt='/std:c++14' -build:linux --cxxopt='-std=c++14' -build:linux --host_cxxopt='-std=c++14' -build:macos --cxxopt='-std=c++14' -build:macos --host_cxxopt='-std=c++14' -build:freebsd --cxxopt='-std=c++14' -build:freebsd --host_cxxopt='-std=c++14' +build:windows --cxxopt='/std:c++17' +build:windows --host_cxxopt='/std:c++17' +build:linux --cxxopt='-std=c++17' +build:linux --host_cxxopt='-std=c++17' +build:macos --cxxopt='-std=c++17' +build:macos --host_cxxopt='-std=c++17' +build:freebsd --cxxopt='-std=c++17' +build:freebsd --host_cxxopt='-std=c++17' # TODO(veblush): Remove these once upb is upgraded to 25.x or later build:linux --copt=-Wno-typedef-redefinition diff --git a/tools/distrib/gen_compilation_database.py b/tools/distrib/gen_compilation_database.py index 15e5e3a84cfb6..9408fee15c402 100755 --- a/tools/distrib/gen_compilation_database.py +++ b/tools/distrib/gen_compilation_database.py @@ -119,7 +119,7 @@ def modifyCompileCommand(target, args): options += " -Wno-unused-function" if not target["file"].startswith("external/"): # *.h file is treated as C header by default while our headers files are all C++14. - options = "-x c++ -std=c++14 -fexceptions " + options + options = "-x c++ -std=c++17 -fexceptions " + options target["command"] = " ".join([cc, options]) return target diff --git a/tools/distrib/python/grpcio_tools/setup.py b/tools/distrib/python/grpcio_tools/setup.py index f40c6d738e361..fe26703c0cb62 100644 --- a/tools/distrib/python/grpcio_tools/setup.py +++ b/tools/distrib/python/grpcio_tools/setup.py @@ -92,7 +92,7 @@ def check_linker_need_libatomic(): ) cxx = os.environ.get("CXX", "c++") cpp_test = subprocess.Popen( - [cxx, "-x", "c++", "-std=c++14", "-"], + [cxx, "-x", "c++", "-std=c++17", "-"], stdin=PIPE, stdout=PIPE, stderr=PIPE, @@ -103,7 +103,7 @@ def check_linker_need_libatomic(): # Double-check to see if -latomic actually can solve the problem. # https://github.com/grpc/grpc/issues/22491 cpp_test = subprocess.Popen( - [cxx, "-x", "c++", "-std=c++14", "-", "-latomic"], + [cxx, "-x", "c++", "-std=c++17", "-", "-latomic"], stdin=PIPE, stdout=PIPE, stderr=PIPE, @@ -191,14 +191,14 @@ def new_compile(obj, src, ext, cc_args, extra_postargs, pp_opts): EXTRA_ENV_COMPILE_ARGS += " /MT" elif "linux" in sys.platform: # GCC by defaults uses C17 so only C++14 needs to be specified. - EXTRA_ENV_COMPILE_ARGS += " -std=c++14" + EXTRA_ENV_COMPILE_ARGS += " -std=c++17" EXTRA_ENV_COMPILE_ARGS += " -fno-wrapv -frtti" # Reduce the optimization level from O3 (in many cases) to O1 to # workaround gcc misalignment bug with MOVAPS (internal b/329134877) EXTRA_ENV_COMPILE_ARGS += " -O1" elif "darwin" in sys.platform: # AppleClang by defaults uses C17 so only C++14 needs to be specified. - EXTRA_ENV_COMPILE_ARGS += " -std=c++14" + EXTRA_ENV_COMPILE_ARGS += " -std=c++17" EXTRA_ENV_COMPILE_ARGS += " -fno-wrapv -frtti" EXTRA_ENV_COMPILE_ARGS += " -stdlib=libc++ -DHAVE_UNISTD_H" if EXTRA_ENV_LINK_ARGS is None: diff --git a/tools/run_tests/artifacts/artifact_targets.py b/tools/run_tests/artifacts/artifact_targets.py index 50b22256a95b5..5af5904073458 100644 --- a/tools/run_tests/artifacts/artifact_targets.py +++ b/tools/run_tests/artifacts/artifact_targets.py @@ -354,7 +354,7 @@ def build_jobspec(self, inner_jobs=None): ) else: environ["CXXFLAGS"] += ( - " -std=c++14 -stdlib=libc++ %s" % _MACOS_COMPAT_FLAG + " -std=c++17 -stdlib=libc++ %s" % _MACOS_COMPAT_FLAG ) return create_jobspec( self.name, From 54cab7a488e7d08f488969b78aa2f48ee5d9c43b Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Mon, 23 Dec 2024 11:29:57 -0800 Subject: [PATCH 24/26] [ring_hash] second attempt: allow use without xDS, and allow setting endpoint hash key in EDS (#38328) As per gRFC A76 (https://github.com/grpc/proposal/pull/412). This is a second attempt at #38312, which was reverted in #38323. I have temporarily changed back to building ring_hash only in xDS builds to avoid the internal problem that caused the rollback. I still plan to make the change to build ring_hash without xDS, but I will make that change separately once the internal blocker has been resolved. Closes #38328 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38328 from markdroth:ring_hash_changes 2cb77fc24b9d1b6a152f9aa9948cd512b4f488d9 PiperOrigin-RevId: 709110527 --- build_autogenerated.yaml | 2 + src/core/BUILD | 4 + src/core/load_balancing/lb_policy.h | 8 - .../load_balancing/ring_hash/ring_hash.cc | 207 ++++++++++++------ src/core/load_balancing/ring_hash/ring_hash.h | 15 +- src/core/xds/grpc/xds_endpoint_parser.cc | 77 +++++-- src/core/xds/grpc/xds_metadata.h | 8 + test/core/load_balancing/BUILD | 1 + test/core/load_balancing/lb_policy_test_lib.h | 20 +- .../load_balancing/outlier_detection_test.cc | 2 +- test/core/load_balancing/ring_hash_test.cc | 145 +++++++++++- .../load_balancing/xds_override_host_test.cc | 9 +- test/cpp/end2end/xds/BUILD | 1 + test/cpp/end2end/xds/xds_end2end_test_lib.h | 5 +- .../end2end/xds/xds_ring_hash_end2end_test.cc | 159 +++++++++++++- test/cpp/end2end/xds/xds_utils.cc | 11 + test/cpp/end2end/xds/xds_utils.h | 17 +- 17 files changed, 556 insertions(+), 135 deletions(-) diff --git a/build_autogenerated.yaml b/build_autogenerated.yaml index 45df9d5128eab..64b2b8576291a 100644 --- a/build_autogenerated.yaml +++ b/build_autogenerated.yaml @@ -20435,6 +20435,7 @@ targets: - test/core/event_engine/event_engine_test_utils.h - test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.h - test/core/load_balancing/lb_policy_test_lib.h + - test/core/test_util/scoped_env_var.h src: - test/core/event_engine/fuzzing_event_engine/fuzzing_event_engine.proto - test/core/event_engine/event_engine_test_utils.cc @@ -26825,6 +26826,7 @@ targets: run: false language: c++ headers: + - test/core/test_util/scoped_env_var.h - test/cpp/end2end/connection_attempt_injector.h - test/cpp/end2end/counted_service.h - test/cpp/end2end/test_service_impl.h diff --git a/src/core/BUILD b/src/core/BUILD index 9335eb1f22889..27bc4d6d9e0f6 100644 --- a/src/core/BUILD +++ b/src/core/BUILD @@ -6011,6 +6011,7 @@ grpc_cc_library( "grpc_fake_credentials", "grpc_fault_injection_filter", "grpc_lb_policy_pick_first", + "grpc_lb_policy_ring_hash", "grpc_lb_xds_channel_args", "grpc_matchers", "grpc_outlier_detection_header", @@ -6667,6 +6668,7 @@ grpc_cc_library( "absl/container:inlined_vector", "absl/log:check", "absl/log:log", + "absl/random", "absl/status", "absl/status:statusor", "absl/strings", @@ -6679,6 +6681,7 @@ grpc_cc_library( "closure", "connectivity_state", "delegating_helper", + "env", "error", "grpc_lb_policy_pick_first", "grpc_service_config", @@ -6690,6 +6693,7 @@ grpc_cc_library( "lb_policy_registry", "pollset_set", "ref_counted", + "ref_counted_string", "resolved_address", "unique_type_name", "validation_errors", diff --git a/src/core/load_balancing/lb_policy.h b/src/core/load_balancing/lb_policy.h index 1bf499bce447c..e7ff9d56939ca 100644 --- a/src/core/load_balancing/lb_policy.h +++ b/src/core/load_balancing/lb_policy.h @@ -152,14 +152,6 @@ class LoadBalancingPolicy : public InternallyRefCounted { /// The LB policy may use the existing metadata to influence its routing /// decision, and it may add new metadata elements to be sent with the /// call to the chosen backend. - // TODO(roth): Before making the LB policy API public, consider - // whether this is the right way to expose metadata to the picker. - // This approach means that if a pick modifies metadata but then we - // discard the pick because the subchannel is not connected, the - // metadata change will still have been made. Maybe we actually - // want to somehow provide metadata changes in PickResult::Complete - // instead? Or maybe we use a CallTracer that can add metadata when - // the call actually starts on the subchannel? MetadataInterface* initial_metadata; /// An interface for accessing call state. Can be used to allocate /// memory associated with the call in an efficient way. diff --git a/src/core/load_balancing/ring_hash/ring_hash.cc b/src/core/load_balancing/ring_hash/ring_hash.cc index 2409a40e425b1..f8f2c052ca0cb 100644 --- a/src/core/load_balancing/ring_hash/ring_hash.cc +++ b/src/core/load_balancing/ring_hash/ring_hash.cc @@ -35,6 +35,7 @@ #include "absl/container/inlined_vector.h" #include "absl/log/check.h" #include "absl/log/log.h" +#include "absl/random/random.h" #include "absl/status/status.h" #include "absl/status/statusor.h" #include "absl/strings/str_cat.h" @@ -59,10 +60,12 @@ #include "src/core/resolver/endpoint_addresses.h" #include "src/core/util/crash.h" #include "src/core/util/debug_location.h" +#include "src/core/util/env.h" #include "src/core/util/json/json.h" #include "src/core/util/orphanable.h" #include "src/core/util/ref_counted.h" #include "src/core/util/ref_counted_ptr.h" +#include "src/core/util/ref_counted_string.h" #include "src/core/util/unique_type_name.h" #include "src/core/util/work_serializer.h" #include "src/core/util/xxhash_inline.h" @@ -74,53 +77,79 @@ UniqueTypeName RequestHashAttribute::TypeName() { return kFactory.Create(); } -// Helper Parser method +namespace { + +constexpr absl::string_view kRingHash = "ring_hash_experimental"; -const JsonLoaderInterface* RingHashConfig::JsonLoader(const JsonArgs&) { - static const auto* loader = - JsonObjectLoader() - .OptionalField("minRingSize", &RingHashConfig::min_ring_size) - .OptionalField("maxRingSize", &RingHashConfig::max_ring_size) - .Finish(); - return loader; +bool XdsRingHashSetRequestHashKeyEnabled() { + auto value = GetEnv("GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY"); + if (!value.has_value()) return false; + bool parsed_value; + bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value); + return parse_succeeded && parsed_value; } -void RingHashConfig::JsonPostLoad(const Json&, const JsonArgs&, - ValidationErrors* errors) { - { - ValidationErrors::ScopedField field(errors, ".minRingSize"); - if (!errors->FieldHasErrors() && - (min_ring_size == 0 || min_ring_size > 8388608)) { - errors->AddError("must be in the range [1, 8388608]"); - } - } - { - ValidationErrors::ScopedField field(errors, ".maxRingSize"); - if (!errors->FieldHasErrors() && - (max_ring_size == 0 || max_ring_size > 8388608)) { - errors->AddError("must be in the range [1, 8388608]"); +class RingHashJsonArgs final : public JsonArgs { + public: + bool IsEnabled(absl::string_view key) const override { + if (key == "request_hash_header") { + return XdsRingHashSetRequestHashKeyEnabled(); } + return true; } - if (min_ring_size > max_ring_size) { - errors->AddError("max_ring_size cannot be smaller than min_ring_size"); - } -} - -namespace { - -constexpr absl::string_view kRingHash = "ring_hash_experimental"; +}; class RingHashLbConfig final : public LoadBalancingPolicy::Config { public: - RingHashLbConfig(size_t min_ring_size, size_t max_ring_size) - : min_ring_size_(min_ring_size), max_ring_size_(max_ring_size) {} + RingHashLbConfig() = default; + + RingHashLbConfig(const RingHashLbConfig&) = delete; + RingHashLbConfig& operator=(const RingHashLbConfig&) = delete; + + RingHashLbConfig(RingHashLbConfig&& other) = delete; + RingHashLbConfig& operator=(RingHashLbConfig&& other) = delete; + absl::string_view name() const override { return kRingHash; } size_t min_ring_size() const { return min_ring_size_; } size_t max_ring_size() const { return max_ring_size_; } + absl::string_view request_hash_header() const { return request_hash_header_; } + + static const JsonLoaderInterface* JsonLoader(const JsonArgs&) { + static const auto* loader = + JsonObjectLoader() + .OptionalField("minRingSize", &RingHashLbConfig::min_ring_size_) + .OptionalField("maxRingSize", &RingHashLbConfig::max_ring_size_) + .OptionalField("requestHashHeader", + &RingHashLbConfig::request_hash_header_, + "request_hash_header") + .Finish(); + return loader; + } + + void JsonPostLoad(const Json&, const JsonArgs&, ValidationErrors* errors) { + { + ValidationErrors::ScopedField field(errors, ".minRingSize"); + if (!errors->FieldHasErrors() && + (min_ring_size_ == 0 || min_ring_size_ > 8388608)) { + errors->AddError("must be in the range [1, 8388608]"); + } + } + { + ValidationErrors::ScopedField field(errors, ".maxRingSize"); + if (!errors->FieldHasErrors() && + (max_ring_size_ == 0 || max_ring_size_ > 8388608)) { + errors->AddError("must be in the range [1, 8388608]"); + } + } + if (min_ring_size_ > max_ring_size_) { + errors->AddError("maxRingSize cannot be smaller than minRingSize"); + } + } private: - size_t min_ring_size_; - size_t max_ring_size_; + uint64_t min_ring_size_ = 1024; + uint64_t max_ring_size_ = 4096; + std::string request_hash_header_; }; // @@ -217,9 +246,13 @@ class RingHash final : public LoadBalancingPolicy { explicit Picker(RefCountedPtr ring_hash) : ring_hash_(std::move(ring_hash)), ring_(ring_hash_->ring_), - endpoints_(ring_hash_->endpoints_.size()) { + endpoints_(ring_hash_->endpoints_.size()), + request_hash_header_(ring_hash_->request_hash_header_) { for (const auto& p : ring_hash_->endpoint_map_) { endpoints_[p.second->index()] = p.second->GetInfoForPicker(); + if (endpoints_[p.second->index()].state == GRPC_CHANNEL_CONNECTING) { + has_endpoint_in_connecting_state_ = true; + } } } @@ -260,6 +293,8 @@ class RingHash final : public LoadBalancingPolicy { RefCountedPtr ring_hash_; RefCountedPtr ring_; std::vector endpoints_; + bool has_endpoint_in_connecting_state_ = false; + RefCountedStringValue request_hash_header_; }; ~RingHash() override; @@ -278,6 +313,7 @@ class RingHash final : public LoadBalancingPolicy { // Current endpoint list, channel args, and ring. EndpointAddressesList endpoints_; ChannelArgs args_; + RefCountedStringValue request_hash_header_; RefCountedPtr ring_; std::map> endpoint_map_; @@ -297,17 +333,34 @@ class RingHash final : public LoadBalancingPolicy { // RingHash::PickResult RingHash::Picker::Pick(PickArgs args) { - auto* call_state = static_cast(args.call_state); - auto* hash_attribute = call_state->GetCallAttribute(); - if (hash_attribute == nullptr) { - return PickResult::Fail(absl::InternalError("hash attribute not present")); + // Determine request hash. + bool using_random_hash = false; + uint64_t request_hash; + if (request_hash_header_.as_string_view().empty()) { + // Being used in xDS. Request hash is passed in via an attribute. + auto* call_state = static_cast(args.call_state); + auto* hash_attribute = call_state->GetCallAttribute(); + if (hash_attribute == nullptr) { + return PickResult::Fail( + absl::InternalError("hash attribute not present")); + } + request_hash = hash_attribute->request_hash(); + } else { + std::string buffer; + auto header_value = args.initial_metadata->Lookup( + request_hash_header_.as_string_view(), &buffer); + if (header_value.has_value()) { + request_hash = XXH64(header_value->data(), header_value->size(), 0); + } else { + request_hash = absl::Uniform(absl::BitGen()); + using_random_hash = true; + } } - uint64_t request_hash = hash_attribute->request_hash(); - const auto& ring = ring_->ring(); // Find the index in the ring to use for this RPC. // Ported from https://github.com/RJ/ketama/blob/master/libketama/ketama.c // (ketama_get_server) NOTE: The algorithm depends on using signed integers // for lowp, highp, and index. Do not change them! + const auto& ring = ring_->ring(); int64_t lowp = 0; int64_t highp = ring.size(); int64_t index = 0; @@ -333,22 +386,42 @@ RingHash::PickResult RingHash::Picker::Pick(PickArgs args) { } } // Find the first endpoint we can use from the selected index. - for (size_t i = 0; i < ring.size(); ++i) { - const auto& entry = ring[(index + i) % ring.size()]; - const auto& endpoint_info = endpoints_[entry.endpoint_index]; - switch (endpoint_info.state) { - case GRPC_CHANNEL_READY: + if (!using_random_hash) { + for (size_t i = 0; i < ring.size(); ++i) { + const auto& entry = ring[(index + i) % ring.size()]; + const auto& endpoint_info = endpoints_[entry.endpoint_index]; + switch (endpoint_info.state) { + case GRPC_CHANNEL_READY: + return endpoint_info.picker->Pick(args); + case GRPC_CHANNEL_IDLE: + new EndpointConnectionAttempter( + ring_hash_.Ref(DEBUG_LOCATION, "EndpointConnectionAttempter"), + endpoint_info.endpoint); + ABSL_FALLTHROUGH_INTENDED; + case GRPC_CHANNEL_CONNECTING: + return PickResult::Queue(); + default: + break; + } + } + } else { + // Using a random hash. We will use the first READY endpoint we + // find, triggering at most one endpoint to attempt connecting. + bool requested_connection = has_endpoint_in_connecting_state_; + for (size_t i = 0; i < ring.size(); ++i) { + const auto& entry = ring[(index + i) % ring.size()]; + const auto& endpoint_info = endpoints_[entry.endpoint_index]; + if (endpoint_info.state == GRPC_CHANNEL_READY) { return endpoint_info.picker->Pick(args); - case GRPC_CHANNEL_IDLE: + } + if (!requested_connection && endpoint_info.state == GRPC_CHANNEL_IDLE) { new EndpointConnectionAttempter( ring_hash_.Ref(DEBUG_LOCATION, "EndpointConnectionAttempter"), endpoint_info.endpoint); - ABSL_FALLTHROUGH_INTENDED; - case GRPC_CHANNEL_CONNECTING: - return PickResult::Queue(); - default: - break; + requested_connection = true; + } } + if (requested_connection) return PickResult::Queue(); } return PickResult::Fail(absl::UnavailableError(absl::StrCat( "ring hash cannot find a connected endpoint; first failure: ", @@ -362,7 +435,7 @@ RingHash::PickResult RingHash::Picker::Pick(PickArgs args) { RingHash::Ring::Ring(RingHash* ring_hash, RingHashLbConfig* config) { // Store the weights while finding the sum. struct EndpointWeight { - std::string address; // Key by endpoint's first address. + std::string hash_key; // By default, endpoint's first address. // Default weight is 1 for the cases where a weight is not provided, // each occurrence of the address will be counted a weight value of 1. uint32_t weight = 1; @@ -374,8 +447,14 @@ RingHash::Ring::Ring(RingHash* ring_hash, RingHashLbConfig* config) { endpoint_weights.reserve(endpoints.size()); for (const auto& endpoint : endpoints) { EndpointWeight endpoint_weight; - endpoint_weight.address = - grpc_sockaddr_to_string(&endpoint.addresses().front(), false).value(); + auto hash_key = + endpoint.args().GetString(GRPC_ARG_RING_HASH_ENDPOINT_HASH_KEY); + if (hash_key.has_value()) { + endpoint_weight.hash_key = std::string(*hash_key); + } else { + endpoint_weight.hash_key = + grpc_sockaddr_to_string(&endpoint.addresses().front(), false).value(); + } // Weight should never be zero, but ignore it just in case, since // that value would screw up the ring-building algorithm. auto weight_arg = endpoint.args().GetInt(GRPC_ARG_ADDRESS_WEIGHT); @@ -425,8 +504,8 @@ RingHash::Ring::Ring(RingHash* ring_hash, RingHashLbConfig* config) { uint64_t min_hashes_per_host = ring_size; uint64_t max_hashes_per_host = 0; for (size_t i = 0; i < endpoints.size(); ++i) { - const std::string& address_string = endpoint_weights[i].address; - hash_key_buffer.assign(address_string.begin(), address_string.end()); + const std::string& hash_key = endpoint_weights[i].hash_key; + hash_key_buffer.assign(hash_key.begin(), hash_key.end()); hash_key_buffer.emplace_back('_'); auto offset_start = hash_key_buffer.end(); target_hashes += scale * endpoint_weights[i].normalized_weight; @@ -652,9 +731,11 @@ absl::Status RingHash::UpdateLocked(UpdateArgs args) { } // Save channel args. args_ = std::move(args.args); + // Save config. + auto* config = DownCast(args.config.get()); + request_hash_header_ = RefCountedStringValue(config->request_hash_header()); // Build new ring. - ring_ = MakeRefCounted( - this, static_cast(args.config.get())); + ring_ = MakeRefCounted(this, config); // Update endpoint map. std::map> endpoint_map; std::vector errors; @@ -853,11 +934,9 @@ class RingHashFactory final : public LoadBalancingPolicyFactory { absl::StatusOr> ParseLoadBalancingConfig(const Json& json) const override { - auto config = LoadFromJson( - json, JsonArgs(), "errors validating ring_hash LB policy config"); - if (!config.ok()) return config.status(); - return MakeRefCounted(config->min_ring_size, - config->max_ring_size); + return LoadFromJson>( + json, RingHashJsonArgs(), + "errors validating ring_hash LB policy config"); } }; diff --git a/src/core/load_balancing/ring_hash/ring_hash.h b/src/core/load_balancing/ring_hash/ring_hash.h index 95f17cbe81dfd..b3e9886202ce7 100644 --- a/src/core/load_balancing/ring_hash/ring_hash.h +++ b/src/core/load_balancing/ring_hash/ring_hash.h @@ -27,6 +27,10 @@ #include "src/core/util/unique_type_name.h" #include "src/core/util/validation_errors.h" +// Optional endpoint attribute specifying the hash key. +#define GRPC_ARG_RING_HASH_ENDPOINT_HASH_KEY \ + GRPC_ARG_NO_SUBCHANNEL_PREFIX "hash_key" + namespace grpc_core { class RequestHashAttribute final @@ -45,17 +49,6 @@ class RequestHashAttribute final uint64_t request_hash_; }; -// Helper Parsing method to parse ring hash policy configs; for example, ring -// hash size validity. -struct RingHashConfig { - uint64_t min_ring_size = 1024; - uint64_t max_ring_size = 4096; - - static const JsonLoaderInterface* JsonLoader(const JsonArgs&); - void JsonPostLoad(const Json& json, const JsonArgs&, - ValidationErrors* errors); -}; - } // namespace grpc_core #endif // GRPC_SRC_CORE_LOAD_BALANCING_RING_HASH_RING_HASH_H diff --git a/src/core/xds/grpc/xds_endpoint_parser.cc b/src/core/xds/grpc/xds_endpoint_parser.cc index 2bf1f44386365..92a17c6743ad6 100644 --- a/src/core/xds/grpc/xds_endpoint_parser.cc +++ b/src/core/xds/grpc/xds_endpoint_parser.cc @@ -45,8 +45,11 @@ #include "src/core/lib/channel/channel_args.h" #include "src/core/lib/debug/trace.h" #include "src/core/lib/iomgr/resolved_address.h" +#include "src/core/load_balancing/ring_hash/ring_hash.h" #include "src/core/util/down_cast.h" #include "src/core/util/env.h" +#include "src/core/util/json/json_args.h" +#include "src/core/util/json/json_object_loader.h" #include "src/core/util/string.h" #include "src/core/util/upb_utils.h" #include "src/core/util/validation_errors.h" @@ -72,6 +75,16 @@ bool XdsDualstackEndpointsEnabled() { return parse_succeeded && parsed_value; } +// TODO(roth): Flip the default to false once this proves stable, then +// remove it entirely at some point in the future. +bool XdsEndpointHashKeyBackwardCompatEnabled() { + auto value = GetEnv("GRPC_XDS_ENDPOINT_HASH_KEY_BACKWARD_COMPAT"); + if (!value.has_value()) return true; + bool parsed_value; + bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value); + return parse_succeeded && parsed_value; +} + void MaybeLogClusterLoadAssignment( const XdsResourceType::DecodeContext& context, const envoy_config_endpoint_v3_ClusterLoadAssignment* cla) { @@ -87,21 +100,22 @@ void MaybeLogClusterLoadAssignment( } } -std::string GetProxyAddressFromMetadata( - const XdsResourceType::DecodeContext& context, - const envoy_config_core_v3_Metadata* metadata, ValidationErrors* errors) { - if (XdsHttpConnectEnabled() && metadata != nullptr) { - XdsMetadataMap metadata_map = - ParseXdsMetadataMap(context, metadata, errors); - auto* proxy_address_entry = - metadata_map.Find("envoy.http11_proxy_transport_socket.proxy_address"); - if (proxy_address_entry != nullptr && - proxy_address_entry->type() == XdsAddressMetadataValue::Type()) { - return DownCast(proxy_address_entry) - ->address(); - } - } - return ""; +std::string GetProxyAddressFromMetadata(const XdsMetadataMap& metadata_map) { + auto* proxy_address_entry = metadata_map.FindType( + "envoy.http11_proxy_transport_socket.proxy_address"); + if (proxy_address_entry == nullptr) return ""; + return proxy_address_entry->address(); +} + +std::string GetHashKeyFromMetadata(const XdsMetadataMap& metadata_map) { + auto* hash_key_entry = + metadata_map.FindType("envoy.lb"); + if (hash_key_entry == nullptr) return ""; + ValidationErrors unused_errors; + return LoadJsonObjectField(hash_key_entry->json().object(), + JsonArgs(), "hash_key", + &unused_errors) + .value_or(""); } absl::optional EndpointAddressesParse( @@ -126,9 +140,19 @@ absl::optional EndpointAddressesParse( } } // metadata - std::string proxy_address = GetProxyAddressFromMetadata( - context, envoy_config_endpoint_v3_LbEndpoint_metadata(lb_endpoint), - errors); + std::string proxy_address; + std::string hash_key; + if (XdsHttpConnectEnabled() || !XdsEndpointHashKeyBackwardCompatEnabled()) { + XdsMetadataMap metadata_map = ParseXdsMetadataMap( + context, envoy_config_endpoint_v3_LbEndpoint_metadata(lb_endpoint), + errors); + if (XdsHttpConnectEnabled()) { + proxy_address = GetProxyAddressFromMetadata(metadata_map); + } + if (!XdsEndpointHashKeyBackwardCompatEnabled()) { + hash_key = GetHashKeyFromMetadata(metadata_map); + } + } // endpoint std::vector addresses; absl::string_view hostname; @@ -177,6 +201,9 @@ absl::optional EndpointAddressesParse( } else if (!locality_proxy_address.empty()) { args = args.Set(GRPC_ARG_XDS_HTTP_PROXY, locality_proxy_address); } + if (!hash_key.empty()) { + args = args.Set(GRPC_ARG_RING_HASH_ENDPOINT_HASH_KEY, hash_key); + } return EndpointAddresses(addresses, args); } @@ -231,11 +258,15 @@ absl::optional LocalityParse( parsed_locality.locality.name = MakeRefCounted( std::move(region), std::move(zone), std::move(sub_zone)); // metadata - std::string proxy_address = GetProxyAddressFromMetadata( - context, - envoy_config_endpoint_v3_LocalityLbEndpoints_metadata( - locality_lb_endpoints), - errors); + std::string proxy_address; + if (XdsHttpConnectEnabled()) { + XdsMetadataMap metadata_map = ParseXdsMetadataMap( + context, + envoy_config_endpoint_v3_LocalityLbEndpoints_metadata( + locality_lb_endpoints), + errors); + proxy_address = GetProxyAddressFromMetadata(metadata_map); + } // lb_endpoints size_t size; const envoy_config_endpoint_v3_LbEndpoint* const* lb_endpoints = diff --git a/src/core/xds/grpc/xds_metadata.h b/src/core/xds/grpc/xds_metadata.h index 3e8fa4f214b79..419540cb3631b 100644 --- a/src/core/xds/grpc/xds_metadata.h +++ b/src/core/xds/grpc/xds_metadata.h @@ -60,6 +60,14 @@ class XdsMetadataMap { const XdsMetadataValue* Find(absl::string_view key) const; + template + const T* FindType(absl::string_view key) const { + auto it = map_.find(key); + if (it == map_.end()) return nullptr; + if (it->second->type() != T::Type()) return nullptr; + return DownCast(it->second.get()); + } + bool empty() const { return map_.empty(); } size_t size() const { return map_.size(); } diff --git a/test/core/load_balancing/BUILD b/test/core/load_balancing/BUILD index 022d2ca07691d..2c89018f7d56e 100644 --- a/test/core/load_balancing/BUILD +++ b/test/core/load_balancing/BUILD @@ -265,6 +265,7 @@ grpc_cc_test( "//src/core:channel_args", "//src/core:grpc_lb_policy_ring_hash", "//test/core/test_util:grpc_test_util", + "//test/core/test_util:scoped_env_var", ], ) diff --git a/test/core/load_balancing/lb_policy_test_lib.h b/test/core/load_balancing/lb_policy_test_lib.h index f784f925a6cbe..1194b02e2d548 100644 --- a/test/core/load_balancing/lb_policy_test_lib.h +++ b/test/core/load_balancing/lb_policy_test_lib.h @@ -948,7 +948,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { EXPECT_TRUE(update.status.ok()) << update.status << " at " << location.file() << ":" << location.line(); - ExpectPickQueued(update.picker.get(), {}, location); + ExpectPickQueued(update.picker.get(), {}, {}, location); return true; // Keep going. } EXPECT_EQ(update.state, GRPC_CHANNEL_READY) @@ -992,7 +992,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { EXPECT_TRUE(update.status.ok()) << update.status << " at " << location.file() << ":" << location.line(); - ExpectPickQueued(update.picker.get(), {}, location); + ExpectPickQueued(update.picker.get(), {}, {}, location); return true; // Keep going. } EXPECT_EQ(update.state, GRPC_CHANNEL_TRANSIENT_FAILURE) @@ -1059,7 +1059,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { absl::Status expected_status = absl::OkStatus(), SourceLocation location = SourceLocation()) { auto picker = ExpectState(expected_state, expected_status, location); - return ExpectPickQueued(picker.get(), {}, location); + return ExpectPickQueued(picker.get(), {}, {}, location); } // Convenient frontend to ExpectStateAndQueuingPicker() for CONNECTING. @@ -1076,20 +1076,22 @@ class LoadBalancingPolicyTest : public ::testing::Test { // Does a pick and returns the result. LoadBalancingPolicy::PickResult DoPick( LoadBalancingPolicy::SubchannelPicker* picker, - const CallAttributes& call_attributes = {}) { + const CallAttributes& call_attributes = {}, + const std::map& metadata = {}) { ExecCtx exec_ctx; - FakeMetadata metadata({}); + FakeMetadata md(metadata); FakeCallState call_state(call_attributes); - return picker->Pick({"/service/method", &metadata, &call_state}); + return picker->Pick({"/service/method", &md, &call_state}); } // Requests a pick on picker and expects a Queue result. bool ExpectPickQueued(LoadBalancingPolicy::SubchannelPicker* picker, const CallAttributes call_attributes = {}, + const std::map& metadata = {}, SourceLocation location = SourceLocation()) { EXPECT_NE(picker, nullptr) << location.file() << ":" << location.line(); if (picker == nullptr) return false; - auto pick_result = DoPick(picker, call_attributes); + auto pick_result = DoPick(picker, call_attributes, metadata); EXPECT_TRUE(absl::holds_alternative( pick_result.result)) << PickResultString(pick_result) << "\nat " << location.file() << ":" @@ -1108,6 +1110,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { absl::optional ExpectPickComplete( LoadBalancingPolicy::SubchannelPicker* picker, const CallAttributes& call_attributes = {}, + const std::map& metadata = {}, std::unique_ptr* subchannel_call_tracker = nullptr, SubchannelState::FakeSubchannel** picked_subchannel = nullptr, @@ -1116,7 +1119,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { if (picker == nullptr) { return absl::nullopt; } - auto pick_result = DoPick(picker, call_attributes); + auto pick_result = DoPick(picker, call_attributes, metadata); auto* complete = absl::get_if( &pick_result.result); EXPECT_NE(complete, nullptr) << PickResultString(pick_result) << " at " @@ -1167,6 +1170,7 @@ class LoadBalancingPolicyTest : public ::testing::Test { std::unique_ptr subchannel_call_tracker; auto address = ExpectPickComplete(picker, call_attributes, + /*metadata=*/{}, subchannel_call_trackers == nullptr ? nullptr : &subchannel_call_tracker, diff --git a/test/core/load_balancing/outlier_detection_test.cc b/test/core/load_balancing/outlier_detection_test.cc index d73a4ed54bf0d..40a8cfc280ff3 100644 --- a/test/core/load_balancing/outlier_detection_test.cc +++ b/test/core/load_balancing/outlier_detection_test.cc @@ -154,7 +154,7 @@ class OutlierDetectionTest : public LoadBalancingPolicyTest { LoadBalancingPolicy::SubchannelPicker* picker) { std::unique_ptr subchannel_call_tracker; - auto address = ExpectPickComplete(picker, {}, &subchannel_call_tracker); + auto address = ExpectPickComplete(picker, {}, {}, &subchannel_call_tracker); if (address.has_value()) { subchannel_call_tracker->Start(); FakeMetadata metadata({}); diff --git a/test/core/load_balancing/ring_hash_test.cc b/test/core/load_balancing/ring_hash_test.cc index 522f5794921dc..c0b8dcaa3747a 100644 --- a/test/core/load_balancing/ring_hash_test.cc +++ b/test/core/load_balancing/ring_hash_test.cc @@ -38,6 +38,7 @@ #include "src/core/util/ref_counted_ptr.h" #include "src/core/util/xxhash_inline.h" #include "test/core/load_balancing/lb_policy_test_lib.h" +#include "test/core/test_util/scoped_env_var.h" #include "test/core/test_util/test_config.h" namespace grpc_core { @@ -53,7 +54,8 @@ class RingHashTest : public LoadBalancingPolicyTest { RingHashTest() : LoadBalancingPolicyTest("ring_hash_experimental") {} static RefCountedPtr MakeRingHashConfig( - int min_ring_size = 0, int max_ring_size = 0) { + int min_ring_size = 0, int max_ring_size = 0, + const std::string& request_hash_header = "") { Json::Object fields; if (min_ring_size > 0) { fields["minRingSize"] = Json::FromString(absl::StrCat(min_ring_size)); @@ -61,19 +63,25 @@ class RingHashTest : public LoadBalancingPolicyTest { if (max_ring_size > 0) { fields["maxRingSize"] = Json::FromString(absl::StrCat(max_ring_size)); } + if (!request_hash_header.empty()) { + fields["requestHashHeader"] = Json::FromString(request_hash_header); + } return MakeConfig(Json::FromArray({Json::FromObject( {{"ring_hash_experimental", Json::FromObject(fields)}})})); } - RequestHashAttribute* MakeHashAttribute(absl::string_view address) { - std::string hash_input = - absl::StrCat(absl::StripPrefix(address, "ipv4:"), "_0"); - uint64_t hash = XXH64(hash_input.data(), hash_input.size(), 0); + RequestHashAttribute* MakeHashAttributeForString(absl::string_view key) { + std::string key_str = absl::StrCat(key, "_0"); + uint64_t hash = XXH64(key_str.data(), key_str.size(), 0); attribute_storage_.emplace_back( std::make_unique(hash)); return attribute_storage_.back().get(); } + RequestHashAttribute* MakeHashAttribute(absl::string_view address) { + return MakeHashAttributeForString(absl::StripPrefix(address, "ipv4:")); + } + std::vector> attribute_storage_; }; @@ -94,6 +102,8 @@ TEST_F(RingHashTest, Basic) { subchannel->SetConnectivityState(GRPC_CHANNEL_CONNECTING); picker = ExpectState(GRPC_CHANNEL_CONNECTING); ExpectPickQueued(picker.get(), {address0_attribute}); + EXPECT_EQ(nullptr, FindSubchannel(kAddresses[1])); + EXPECT_EQ(nullptr, FindSubchannel(kAddresses[2])); subchannel->SetConnectivityState(GRPC_CHANNEL_READY); picker = ExpectState(GRPC_CHANNEL_READY); auto address = ExpectPickComplete(picker.get(), {address0_attribute}); @@ -182,6 +192,131 @@ TEST_F(RingHashTest, MultipleAddressesPerEndpoint) { EXPECT_EQ(address, kEndpoint1Addresses[1]); } +TEST_F(RingHashTest, EndpointHashKeys) { + const std::array kAddresses = { + "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; + const std::array kHashKeys = {"foo", "bar", "baz"}; + std::vector endpoints; + for (size_t i = 0; i < 3; ++i) { + endpoints.push_back(MakeEndpointAddresses( + {kAddresses[i]}, + ChannelArgs().Set(GRPC_ARG_RING_HASH_ENDPOINT_HASH_KEY, kHashKeys[i]))); + }; + EXPECT_EQ( + ApplyUpdate(BuildUpdate(endpoints, MakeRingHashConfig()), lb_policy()), + absl::OkStatus()); + auto picker = ExpectState(GRPC_CHANNEL_IDLE); + auto* hash_attribute = MakeHashAttributeForString(kHashKeys[1]); + ExpectPickQueued(picker.get(), {hash_attribute}); + WaitForWorkSerializerToFlush(); + WaitForWorkSerializerToFlush(); + auto* subchannel = FindSubchannel(kAddresses[1]); + ASSERT_NE(subchannel, nullptr); + EXPECT_TRUE(subchannel->ConnectionRequested()); + subchannel->SetConnectivityState(GRPC_CHANNEL_CONNECTING); + picker = ExpectState(GRPC_CHANNEL_CONNECTING); + ExpectPickQueued(picker.get(), {hash_attribute}); + EXPECT_EQ(nullptr, FindSubchannel(kAddresses[0])); + EXPECT_EQ(nullptr, FindSubchannel(kAddresses[2])); + subchannel->SetConnectivityState(GRPC_CHANNEL_READY); + picker = ExpectState(GRPC_CHANNEL_READY); + auto address = ExpectPickComplete(picker.get(), {hash_attribute}); + EXPECT_EQ(address, kAddresses[1]); +} + +TEST_F(RingHashTest, PickFailsWithoutRequestHashAttribute) { + const std::array kAddresses = { + "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; + EXPECT_EQ( + ApplyUpdate(BuildUpdate(kAddresses, MakeRingHashConfig()), lb_policy()), + absl::OkStatus()); + auto picker = ExpectState(GRPC_CHANNEL_IDLE); + ExpectPickFail(picker.get(), [&](const absl::Status& status) { + EXPECT_EQ(status, absl::InternalError("hash attribute not present")); + }); +} + +TEST_F(RingHashTest, RequestHashHeaderNotEnabled) { + const std::array kAddresses = { + "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; + EXPECT_EQ( + ApplyUpdate(BuildUpdate(kAddresses, MakeRingHashConfig(0, 0, "foo")), + lb_policy()), + absl::OkStatus()); + auto picker = ExpectState(GRPC_CHANNEL_IDLE); + ExpectPickFail(picker.get(), [&](const absl::Status& status) { + EXPECT_EQ(status, absl::InternalError("hash attribute not present")); + }); +} + +TEST_F(RingHashTest, RequestHashHeader) { + ScopedExperimentalEnvVar env( + "GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY"); + const std::array kAddresses = { + "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; + EXPECT_EQ( + ApplyUpdate(BuildUpdate(kAddresses, MakeRingHashConfig(0, 0, "foo")), + lb_policy()), + absl::OkStatus()); + auto picker = ExpectState(GRPC_CHANNEL_IDLE); + std::string hash_key = + absl::StrCat(absl::StripPrefix(kAddresses[0], "ipv4:"), "_0"); + std::map metadata = {{"foo", hash_key}}; + ExpectPickQueued(picker.get(), /*call_attributes=*/{}, metadata); + WaitForWorkSerializerToFlush(); + WaitForWorkSerializerToFlush(); + auto* subchannel = FindSubchannel(kAddresses[0]); + ASSERT_NE(subchannel, nullptr); + EXPECT_TRUE(subchannel->ConnectionRequested()); + subchannel->SetConnectivityState(GRPC_CHANNEL_CONNECTING); + picker = ExpectState(GRPC_CHANNEL_CONNECTING); + ExpectPickQueued(picker.get(), {}, metadata); + EXPECT_EQ(nullptr, FindSubchannel(kAddresses[1])); + EXPECT_EQ(nullptr, FindSubchannel(kAddresses[2])); + subchannel->SetConnectivityState(GRPC_CHANNEL_READY); + picker = ExpectState(GRPC_CHANNEL_READY); + auto address = ExpectPickComplete(picker.get(), {}, metadata); + EXPECT_EQ(address, kAddresses[0]); +} + +TEST_F(RingHashTest, RequestHashHeaderNotPresent) { + ScopedExperimentalEnvVar env( + "GRPC_EXPERIMENTAL_RING_HASH_SET_REQUEST_HASH_KEY"); + const std::array kAddresses = { + "ipv4:127.0.0.1:441", "ipv4:127.0.0.1:442", "ipv4:127.0.0.1:443"}; + EXPECT_EQ( + ApplyUpdate(BuildUpdate(kAddresses, MakeRingHashConfig(0, 0, "foo")), + lb_policy()), + absl::OkStatus()); + auto picker = ExpectState(GRPC_CHANNEL_IDLE); + ExpectPickQueued(picker.get()); + WaitForWorkSerializerToFlush(); + WaitForWorkSerializerToFlush(); + // It will randomly pick one. + size_t index = 0; + SubchannelState* subchannel = nullptr; + for (; index < kAddresses.size(); ++index) { + subchannel = FindSubchannel(kAddresses[index]); + if (subchannel != nullptr) { + LOG(INFO) << "Randomly picked subchannel index " << index; + break; + } + } + ASSERT_NE(subchannel, nullptr); + EXPECT_TRUE(subchannel->ConnectionRequested()); + subchannel->SetConnectivityState(GRPC_CHANNEL_CONNECTING); + picker = ExpectState(GRPC_CHANNEL_CONNECTING); + ExpectPickQueued(picker.get()); + // No other subchannels should have been created yet. + for (size_t i = 0; i < kAddresses.size(); ++i) { + if (i != index) EXPECT_EQ(nullptr, FindSubchannel(kAddresses[i])); + } + subchannel->SetConnectivityState(GRPC_CHANNEL_READY); + picker = ExpectState(GRPC_CHANNEL_READY); + auto address = ExpectPickComplete(picker.get()); + EXPECT_EQ(address, kAddresses[index]); +} + } // namespace } // namespace testing } // namespace grpc_core diff --git a/test/core/load_balancing/xds_override_host_test.cc b/test/core/load_balancing/xds_override_host_test.cc index e487b6ab32366..7f65f5a222196 100644 --- a/test/core/load_balancing/xds_override_host_test.cc +++ b/test/core/load_balancing/xds_override_host_test.cc @@ -183,7 +183,7 @@ class XdsOverrideHostTest : public LoadBalancingPolicyTest { } std::string expected_addresses_str = absl::StrJoin(expected_addresses, ","); for (size_t i = 0; i < 3; ++i) { - EXPECT_EQ(ExpectPickComplete(picker, {attribute}, + EXPECT_EQ(ExpectPickComplete(picker, {attribute}, /*metadata=*/{}, /*subchannel_call_tracker=*/nullptr, /*picked_subchannel=*/nullptr, location), expected) @@ -202,9 +202,10 @@ class XdsOverrideHostTest : public LoadBalancingPolicyTest { SourceLocation location = SourceLocation()) { std::vector actual_picks; for (size_t i = 0; i < expected.size(); ++i) { - auto address = ExpectPickComplete( - picker, {attribute}, /*subchannel_call_tracker=*/nullptr, - /*picked_subchannel=*/nullptr, location); + auto address = + ExpectPickComplete(picker, {attribute}, /*metadata=*/{}, + /*subchannel_call_tracker=*/nullptr, + /*picked_subchannel=*/nullptr, location); ASSERT_TRUE(address.has_value()) << location.file() << ":" << location.line(); EXPECT_THAT(*address, ::testing::AnyOfArray(expected)) diff --git a/test/cpp/end2end/xds/BUILD b/test/cpp/end2end/xds/BUILD index 22e9441ac6a12..77e8e4f99fa90 100644 --- a/test/cpp/end2end/xds/BUILD +++ b/test/cpp/end2end/xds/BUILD @@ -414,6 +414,7 @@ grpc_cc_test( "//:grpc++", "//:grpc_resolver_fake", "//test/core/test_util:grpc_test_util", + "//test/core/test_util:scoped_env_var", "//test/cpp/end2end:connection_attempt_injector", "@envoy_api//envoy/config/cluster/v3:pkg_cc_proto", "@envoy_api//envoy/config/endpoint/v3:pkg_cc_proto", diff --git a/test/cpp/end2end/xds/xds_end2end_test_lib.h b/test/cpp/end2end/xds/xds_end2end_test_lib.h index bfed1231aa664..5a91d4554e03c 100644 --- a/test/cpp/end2end/xds/xds_end2end_test_lib.h +++ b/test/cpp/end2end/xds/xds_end2end_test_lib.h @@ -487,7 +487,8 @@ class XdsEnd2endTest : public ::testing::TestWithParam, ::envoy::config::core::v3::HealthStatus health_status = ::envoy::config::core::v3::HealthStatus::UNKNOWN, int lb_weight = 1, std::vector additional_backend_indexes = {}, - absl::string_view hostname = "") { + absl::string_view hostname = "", + const std::map& metadata = {}) { std::vector additional_ports; additional_ports.reserve(additional_backend_indexes.size()); for (size_t idx : additional_backend_indexes) { @@ -495,7 +496,7 @@ class XdsEnd2endTest : public ::testing::TestWithParam, } return EdsResourceArgs::Endpoint(backends_[backend_idx]->port(), health_status, lb_weight, additional_ports, - hostname); + hostname, metadata); } // Creates a vector of endpoints for a specified range of backends, diff --git a/test/cpp/end2end/xds/xds_ring_hash_end2end_test.cc b/test/cpp/end2end/xds/xds_ring_hash_end2end_test.cc index 75afa6c12bfb3..4755ac0349aea 100644 --- a/test/cpp/end2end/xds/xds_ring_hash_end2end_test.cc +++ b/test/cpp/end2end/xds/xds_ring_hash_end2end_test.cc @@ -33,6 +33,7 @@ #include "src/core/resolver/fake/fake_resolver.h" #include "src/core/util/env.h" #include "test/core/test_util/resolve_localhost_ip46.h" +#include "test/core/test_util/scoped_env_var.h" #include "test/cpp/end2end/connection_attempt_injector.h" #include "test/cpp/end2end/xds/xds_end2end_test_lib.h" @@ -455,6 +456,160 @@ TEST_P(RingHashTest, HeaderHashingWithRegexRewrite) { EXPECT_TRUE(found); } +TEST_P(RingHashTest, HashKeysInEds) { + grpc_core::testing::ScopedEnvVar env( + "GRPC_XDS_ENDPOINT_HASH_KEY_BACKWARD_COMPAT", "false"); + CreateAndStartBackends(4); + auto cluster = default_cluster_; + cluster.set_lb_policy(Cluster::RING_HASH); + balancer_->ads_service()->SetCdsResource(cluster); + auto new_route_config = default_route_config_; + auto* route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + auto* hash_policy = route->mutable_route()->add_hash_policy(); + hash_policy->mutable_header()->set_header_name("address_hash"); + SetListenerAndRouteConfiguration(balancer_.get(), default_listener_, + new_route_config); + EdsResourceArgs args( + {{"locality0", + { + CreateEndpoint(0, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"foo\"}"}}), + CreateEndpoint(1, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"bar\"}"}}), + CreateEndpoint(2, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"baz\"}"}}), + CreateEndpoint(3, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"quux\"}"}}), + }}}); + balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); + // Note each type of RPC will contains a header value that will always be + // hashed to a specific backend as the header value matches the value used + // to create the entry in the ring. + std::vector> metadata = { + {"address_hash", "foo_0"}}; + std::vector> metadata1 = { + {"address_hash", "bar_0"}}; + std::vector> metadata2 = { + {"address_hash", "baz_0"}}; + std::vector> metadata3 = { + {"address_hash", "quux_0"}}; + const auto rpc_options = + RpcOptions().set_metadata(std::move(metadata)).set_timeout_ms(5000); + const auto rpc_options1 = + RpcOptions().set_metadata(std::move(metadata1)).set_timeout_ms(5000); + const auto rpc_options2 = + RpcOptions().set_metadata(std::move(metadata2)).set_timeout_ms(5000); + const auto rpc_options3 = + RpcOptions().set_metadata(std::move(metadata3)).set_timeout_ms(5000); + WaitForBackend(DEBUG_LOCATION, 0, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options); + WaitForBackend(DEBUG_LOCATION, 1, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options1); + WaitForBackend(DEBUG_LOCATION, 2, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options2); + WaitForBackend(DEBUG_LOCATION, 3, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options3); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options1); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options2); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options3); + for (size_t i = 0; i < backends_.size(); ++i) { + EXPECT_EQ(100, backends_[i]->backend_service()->request_count()); + } +} + +TEST_P(RingHashTest, HashKeysInEdsNotEnabled) { + CreateAndStartBackends(4); + auto cluster = default_cluster_; + cluster.set_lb_policy(Cluster::RING_HASH); + balancer_->ads_service()->SetCdsResource(cluster); + auto new_route_config = default_route_config_; + auto* route = new_route_config.mutable_virtual_hosts(0)->mutable_routes(0); + auto* hash_policy = route->mutable_route()->add_hash_policy(); + hash_policy->mutable_header()->set_header_name("address_hash"); + SetListenerAndRouteConfiguration(balancer_.get(), default_listener_, + new_route_config); + EdsResourceArgs args( + {{"locality0", + { + CreateEndpoint(0, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"foo\"}"}}), + CreateEndpoint(1, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"bar\"}"}}), + CreateEndpoint(2, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"baz\"}"}}), + CreateEndpoint(3, + /*health_status=*/ + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + /*lb_weight=*/1, /*additional_backend_indexes=*/{}, + /*hostname=*/"", + {{"envoy.lb", "{\"hash_key\":\"quux\"}"}}), + }}}); + balancer_->ads_service()->SetEdsResource(BuildEdsResource(args)); + // Note each type of RPC will contains a header value that will always be + // hashed to a specific backend as the header value matches the value used + // to create the entry in the ring. + std::vector> metadata = { + {"address_hash", CreateMetadataValueThatHashesToBackend(0)}}; + std::vector> metadata1 = { + {"address_hash", CreateMetadataValueThatHashesToBackend(1)}}; + std::vector> metadata2 = { + {"address_hash", CreateMetadataValueThatHashesToBackend(2)}}; + std::vector> metadata3 = { + {"address_hash", CreateMetadataValueThatHashesToBackend(3)}}; + const auto rpc_options = + RpcOptions().set_metadata(std::move(metadata)).set_timeout_ms(5000); + const auto rpc_options1 = + RpcOptions().set_metadata(std::move(metadata1)).set_timeout_ms(5000); + const auto rpc_options2 = + RpcOptions().set_metadata(std::move(metadata2)).set_timeout_ms(5000); + const auto rpc_options3 = + RpcOptions().set_metadata(std::move(metadata3)).set_timeout_ms(5000); + WaitForBackend(DEBUG_LOCATION, 0, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options); + WaitForBackend(DEBUG_LOCATION, 1, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options1); + WaitForBackend(DEBUG_LOCATION, 2, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options2); + WaitForBackend(DEBUG_LOCATION, 3, /*check_status=*/nullptr, + WaitForBackendOptions(), rpc_options3); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options1); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options2); + CheckRpcSendOk(DEBUG_LOCATION, 100, rpc_options3); + for (size_t i = 0; i < backends_.size(); ++i) { + EXPECT_EQ(100, backends_[i]->backend_service()->request_count()); + } +} + // Tests that ring hash policy that hashes using a random value. TEST_P(RingHashTest, NoHashPolicy) { CreateAndStartBackends(2); @@ -641,7 +796,7 @@ TEST_P(RingHashTest, UnsupportedHashPolicyDefaultToRandomHashing) { } // Tests that ring hash policy that hashes using a random value can spread -// RPCs across all the backends according to locality weight. +// RPCs across all the backends according to endpoint weight. TEST_P(RingHashTest, RandomHashingDistributionAccordingToEndpointWeight) { CreateAndStartBackends(2); const size_t kWeight1 = 1; @@ -680,7 +835,7 @@ TEST_P(RingHashTest, RandomHashingDistributionAccordingToEndpointWeight) { } // Tests that ring hash policy that hashes using a random value can spread -// RPCs across all the backends according to locality weight. +// RPCs across all the backends according to locality and endpoint weight. TEST_P(RingHashTest, RandomHashingDistributionAccordingToLocalityAndEndpointWeight) { CreateAndStartBackends(2); diff --git a/test/cpp/end2end/xds/xds_utils.cc b/test/cpp/end2end/xds/xds_utils.cc index ad8f7a0c02abb..1608099a9dd76 100644 --- a/test/cpp/end2end/xds/xds_utils.cc +++ b/test/cpp/end2end/xds/xds_utils.cc @@ -26,6 +26,7 @@ #include #include "absl/memory/memory.h" +#include "absl/strings/numbers.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_format.h" #include "absl/strings/str_join.h" @@ -370,6 +371,16 @@ ClusterLoadAssignment XdsResourceUtils::BuildEdsResource( if (!endpoint.hostname.empty()) { endpoint_proto->set_hostname(endpoint.hostname); } + if (!endpoint.metadata.empty()) { + auto& filter_map = + *lb_endpoints->mutable_metadata()->mutable_filter_metadata(); + for (const auto& p : endpoint.metadata) { + absl::Status status = grpc::protobuf::json::JsonStringToMessage( + p.second, &filter_map[p.first], + grpc::protobuf::json::JsonParseOptions()); + CHECK(status.ok()) << status; + } + } } } if (!args.drop_categories.empty()) { diff --git a/test/cpp/end2end/xds/xds_utils.h b/test/cpp/end2end/xds/xds_utils.h index 194827664562c..b8d13ee436cce 100644 --- a/test/cpp/end2end/xds/xds_utils.h +++ b/test/cpp/end2end/xds/xds_utils.h @@ -214,23 +214,26 @@ class XdsResourceUtils { struct EdsResourceArgs { // An individual endpoint for a backend running on a specified port. struct Endpoint { - explicit Endpoint(int port, - ::envoy::config::core::v3::HealthStatus health_status = - ::envoy::config::core::v3::HealthStatus::UNKNOWN, - int lb_weight = 1, - std::vector additional_ports = {}, - absl::string_view hostname = "") + explicit Endpoint( + int port, + ::envoy::config::core::v3::HealthStatus health_status = + ::envoy::config::core::v3::HealthStatus::UNKNOWN, + int lb_weight = 1, std::vector additional_ports = {}, + absl::string_view hostname = "", + const std::map& metadata = {}) : port(port), health_status(health_status), lb_weight(lb_weight), additional_ports(std::move(additional_ports)), - hostname(hostname) {} + hostname(hostname), + metadata(metadata) {} int port; ::envoy::config::core::v3::HealthStatus health_status; int lb_weight; std::vector additional_ports; std::string hostname; + std::map metadata; }; // A locality. From 9b77138b71e04bb127ec1fb3ae280bca33c59ae1 Mon Sep 17 00:00:00 2001 From: RomantsovS Date: Mon, 23 Dec 2024 14:39:13 -0800 Subject: [PATCH 25/26] examples/cpp/route_guide add missing command line parsing (#37857) The gRPC basic turorial says to call the following command to run the server `./route_guide_server --db_path=path/to/route_guide_db.json` But the server and client do not parse command line arguments and they always use default value `route_guide_db.json`. Thus the example only works if we run it from `examples/cpp/route_guide` dir. Otherwise we get the following error: `helper.cc:49] Failed to open route_guide_db.json Aborted (core dumped)` Add `absl::ParseCommandLine(argc, argv);` to both server and client `main` similar to `route_guide_callback_server.cc` Closes #37857 PiperOrigin-RevId: 709154601 --- examples/cpp/route_guide/BUILD | 2 ++ examples/cpp/route_guide/Makefile | 4 ++-- examples/cpp/route_guide/route_guide_client.cc | 2 ++ examples/cpp/route_guide/route_guide_server.cc | 2 ++ 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/examples/cpp/route_guide/BUILD b/examples/cpp/route_guide/BUILD index 2ea012ca2ee62..9a19d895a8c92 100644 --- a/examples/cpp/route_guide/BUILD +++ b/examples/cpp/route_guide/BUILD @@ -39,6 +39,7 @@ cc_binary( ":route_guide_helper", "//:grpc++", "//examples/protos:route_guide", + "@com_google_absl//absl/flags:parse", ], ) @@ -53,6 +54,7 @@ cc_binary( ":route_guide_helper", "//:grpc++", "//examples/protos:route_guide", + "@com_google_absl//absl/flags:parse", ], ) diff --git a/examples/cpp/route_guide/Makefile b/examples/cpp/route_guide/Makefile index ae254230f68d6..0b4940dd4c329 100644 --- a/examples/cpp/route_guide/Makefile +++ b/examples/cpp/route_guide/Makefile @@ -25,7 +25,7 @@ PROTOBUF_UTF8_RANGE_LINK_LIBS = -lutf8_validity HOST_SYSTEM = $(shell uname | cut -f 1 -d_) SYSTEM ?= $(HOST_SYSTEM) CXX = g++ -CPPFLAGS += `pkg-config --cflags protobuf grpc` +CPPFLAGS += `pkg-config --cflags protobuf grpc absl_flags absl_flags_parse` CXXFLAGS += -std=c++17 ifeq ($(SYSTEM),Darwin) LDFLAGS += -L/usr/local/lib `pkg-config --libs --static protobuf grpc++ $(PROTOBUF_ABSL_DEPS)`\ @@ -35,7 +35,7 @@ LDFLAGS += -L/usr/local/lib `pkg-config --libs --static protobuf grpc++ $(PROTOB -lgrpc++_reflection\ -ldl else -LDFLAGS += -L/usr/local/lib `pkg-config --libs --static protobuf grpc++ $(PROTOBUF_ABSL_DEPS)`\ +LDFLAGS += -L/usr/local/lib `pkg-config --libs --static protobuf grpc++ absl_flags absl_flags_parse $(PROTOBUF_ABSL_DEPS)`\ $(PROTOBUF_UTF8_RANGE_LINK_LIBS) \ -pthread\ -Wl,--no-as-needed -lgrpc++_reflection -Wl,--as-needed\ diff --git a/examples/cpp/route_guide/route_guide_client.cc b/examples/cpp/route_guide/route_guide_client.cc index 73983f458d934..af9f2fdda3069 100644 --- a/examples/cpp/route_guide/route_guide_client.cc +++ b/examples/cpp/route_guide/route_guide_client.cc @@ -29,6 +29,7 @@ #include #include +#include "absl/flags/parse.h" #include "helper.h" #ifdef BAZEL_BUILD #include "examples/protos/route_guide.grpc.pb.h" @@ -216,6 +217,7 @@ class RouteGuideClient { }; int main(int argc, char** argv) { + absl::ParseCommandLine(argc, argv); // Expect only arg: --db_path=path/to/route_guide_db.json. std::string db = routeguide::GetDbFileContent(argc, argv); RouteGuideClient guide( diff --git a/examples/cpp/route_guide/route_guide_server.cc b/examples/cpp/route_guide/route_guide_server.cc index 7a6a1c8ecaa13..b037ca0815aa9 100644 --- a/examples/cpp/route_guide/route_guide_server.cc +++ b/examples/cpp/route_guide/route_guide_server.cc @@ -29,6 +29,7 @@ #include #include +#include "absl/flags/parse.h" #include "helper.h" #ifdef BAZEL_BUILD #include "examples/protos/route_guide.grpc.pb.h" @@ -182,6 +183,7 @@ void RunServer(const std::string& db_path) { } int main(int argc, char** argv) { + absl::ParseCommandLine(argc, argv); // Expect only arg: --db_path=path/to/route_guide_db.json. std::string db = routeguide::GetDbFileContent(argc, argv); RunServer(db); From 6768331497b8ea3f2f58acb52cce302399013757 Mon Sep 17 00:00:00 2001 From: "Mark D. Roth" Date: Thu, 26 Dec 2024 17:28:28 -0800 Subject: [PATCH 26/26] [xDS e2e tests] refactor some common code into a shared utility method (#38342) Closes #38342 COPYBARA_INTEGRATE_REVIEW=https://github.com/grpc/grpc/pull/38342 from markdroth:xds_e2e_test_refactor e8c55809a6c45c2c6af30291921d8fc615683539 PiperOrigin-RevId: 709914049 --- .../end2end/xds/xds_cluster_end2end_test.cc | 19 +++---------- test/cpp/end2end/xds/xds_core_end2end_test.cc | 27 +++++-------------- test/cpp/end2end/xds/xds_end2end_test.cc | 18 ++++--------- test/cpp/end2end/xds/xds_end2end_test_lib.cc | 20 ++++++++++++++ test/cpp/end2end/xds/xds_end2end_test_lib.h | 8 ++++++ .../end2end/xds/xds_gcp_authn_end2end_test.cc | 14 +++------- .../end2end/xds/xds_routing_end2end_test.cc | 11 +++----- 7 files changed, 51 insertions(+), 66 deletions(-) diff --git a/test/cpp/end2end/xds/xds_cluster_end2end_test.cc b/test/cpp/end2end/xds/xds_cluster_end2end_test.cc index 0bf717ba73095..ef8368e1ccbd9 100644 --- a/test/cpp/end2end/xds/xds_cluster_end2end_test.cc +++ b/test/cpp/end2end/xds/xds_cluster_end2end_test.cc @@ -380,14 +380,9 @@ TEST_P(CdsDeletionTest, ClusterDeleted) { // Unset CDS resource. balancer_->ads_service()->UnsetResource(kCdsTypeUrl, kDefaultClusterName); // Wait for RPCs to start failing. - SendRpcsUntil(DEBUG_LOCATION, [](const RpcResult& result) { - if (result.status.ok()) return true; // Keep going. - EXPECT_EQ(StatusCode::UNAVAILABLE, result.status.error_code()); - EXPECT_EQ( - absl::StrCat("CDS resource ", kDefaultClusterName, " does not exist"), - result.status.error_message()); - return false; - }); + SendRpcsUntilFailure( + DEBUG_LOCATION, StatusCode::UNAVAILABLE, + absl::StrCat("CDS resource ", kDefaultClusterName, " does not exist")); // Make sure we ACK'ed the update. auto response_state = balancer_->ads_service()->cds_response_state(); ASSERT_TRUE(response_state.has_value()); @@ -543,13 +538,7 @@ TEST_P(EdsTest, LocalityBecomesEmptyWithDeactivatedChildStateUpdate) { "EDS resource eds_service_name contains empty localities: " "\\[\\{region=\"xds_default_locality_region\", " "zone=\"xds_default_locality_zone\", sub_zone=\"locality0\"\\}\\]"; - SendRpcsUntil(DEBUG_LOCATION, [&](const RpcResult& result) { - if (result.status.ok()) return true; - EXPECT_EQ(result.status.error_code(), StatusCode::UNAVAILABLE); - EXPECT_THAT(result.status.error_message(), - ::testing::MatchesRegex(kErrorMessage)); - return false; - }); + SendRpcsUntilFailure(DEBUG_LOCATION, StatusCode::UNAVAILABLE, kErrorMessage); // Shut down backend. This triggers a connectivity state update from the // deactivated child of the weighted_target policy. ShutdownAllBackends(); diff --git a/test/cpp/end2end/xds/xds_core_end2end_test.cc b/test/cpp/end2end/xds/xds_core_end2end_test.cc index 036f9e3de832b..ad0422a646c7d 100644 --- a/test/cpp/end2end/xds/xds_core_end2end_test.cc +++ b/test/cpp/end2end/xds/xds_core_end2end_test.cc @@ -502,16 +502,9 @@ TEST_P(TimeoutTest, CdsSecondResourceNotPresentInRequest) { balancer_->ads_service()->SetRdsResource(route_config); // New cluster times out. // May need to wait a bit for the change to propagate to the client. - SendRpcsUntil( - DEBUG_LOCATION, - [&](const RpcResult& result) { - if (result.status.ok()) return true; // Keep going. - EXPECT_EQ(StatusCode::UNAVAILABLE, result.status.error_code()); - EXPECT_EQ( - absl::StrCat("CDS resource ", kNewClusterName, " does not exist"), - result.status.error_message()); - return false; - }, + SendRpcsUntilFailure( + DEBUG_LOCATION, StatusCode::UNAVAILABLE, + absl::StrCat("CDS resource ", kNewClusterName, " does not exist"), /*timeout_ms=*/30000, RpcOptions().set_timeout_ms(4000)); } @@ -555,16 +548,10 @@ TEST_P(TimeoutTest, EdsSecondResourceNotPresentInRequest) { balancer_->ads_service()->SetRdsResource(route_config); // New EDS resource times out. // May need to wait a bit for the RDS change to propagate to the client. - SendRpcsUntil( - DEBUG_LOCATION, - [](const RpcResult& result) { - if (result.status.ok()) return true; // Keep going. - EXPECT_EQ(StatusCode::UNAVAILABLE, result.status.error_code()); - EXPECT_EQ(result.status.error_message(), - "no children in weighted_target policy: EDS resource " - "eds_service_name_does_not_exist does not exist"); - return false; - }, + SendRpcsUntilFailure( + DEBUG_LOCATION, StatusCode::UNAVAILABLE, + "no children in weighted_target policy: EDS resource " + "eds_service_name_does_not_exist does not exist", /*timeout_ms=*/30000, RpcOptions().set_rpc_method(METHOD_ECHO1).set_timeout_ms(4000)); } diff --git a/test/cpp/end2end/xds/xds_end2end_test.cc b/test/cpp/end2end/xds/xds_end2end_test.cc index 577e6bfbb0e13..74729910c977f 100644 --- a/test/cpp/end2end/xds/xds_end2end_test.cc +++ b/test/cpp/end2end/xds/xds_end2end_test.cc @@ -395,19 +395,11 @@ class XdsSecurityTest : public XdsEnd2endTest { balancer_->ads_service()->SetCdsResource(cluster); // The updates might take time to have an effect, so use a retry loop. if (test_expects_failure) { - SendRpcsUntil( - DEBUG_LOCATION, - [&](const RpcResult& result) { - if (result.status.ok()) { - LOG(ERROR) << "RPC succeeded. Failure expected. Trying again."; - return true; - } - EXPECT_EQ(result.status.error_code(), StatusCode::UNAVAILABLE); - // TODO(yashkt): Change individual test cases to expect the exact - // error message here. - return false; - }, - /* timeout_ms= */ 20 * 1000, RpcOptions().set_timeout_ms(5000)); + SendRpcsUntilFailure(DEBUG_LOCATION, StatusCode::UNAVAILABLE, + // TODO(yashkt): Change individual test cases to + // expect the exact error message here. + ".*", /*timeout_ms=*/20 * 1000, + RpcOptions().set_timeout_ms(5000)); } else { backends_[backend_index_]->backend_service()->ResetCounters(); SendRpcsUntil( diff --git a/test/cpp/end2end/xds/xds_end2end_test_lib.cc b/test/cpp/end2end/xds/xds_end2end_test_lib.cc index cf764c8cb6599..ff79f545038d8 100644 --- a/test/cpp/end2end/xds/xds_end2end_test_lib.cc +++ b/test/cpp/end2end/xds/xds_end2end_test_lib.cc @@ -681,6 +681,26 @@ void XdsEnd2endTest::CheckRpcSendFailure( << debug_location.file() << ":" << debug_location.line(); } +void XdsEnd2endTest::SendRpcsUntilFailure( + const grpc_core::DebugLocation& debug_location, StatusCode expected_status, + absl::string_view expected_message_regex, int timeout_ms, + const RpcOptions& rpc_options) { + SendRpcsUntil( + debug_location, + [&](const RpcResult& result) { + // Might still succeed if channel hasn't yet seen the server go down. + if (result.status.ok()) return true; + // RPC failed. Make sure the failure status is as expected and stop. + EXPECT_EQ(result.status.error_code(), expected_status) + << debug_location.file() << ":" << debug_location.line(); + EXPECT_THAT(result.status.error_message(), + ::testing::MatchesRegex(expected_message_regex)) + << debug_location.file() << ":" << debug_location.line(); + return false; + }, + timeout_ms, rpc_options); +} + size_t XdsEnd2endTest::SendRpcsAndCountFailuresWithMessage( const grpc_core::DebugLocation& debug_location, size_t num_rpcs, StatusCode expected_status, absl::string_view expected_message_prefix, diff --git a/test/cpp/end2end/xds/xds_end2end_test_lib.h b/test/cpp/end2end/xds/xds_end2end_test_lib.h index 5a91d4554e03c..e1db9f815f9fe 100644 --- a/test/cpp/end2end/xds/xds_end2end_test_lib.h +++ b/test/cpp/end2end/xds/xds_end2end_test_lib.h @@ -758,6 +758,14 @@ class XdsEnd2endTest : public ::testing::TestWithParam, absl::string_view expected_message_regex, const RpcOptions& rpc_options = RpcOptions()); + // Sends RPCs until either a timeout or an RPC fail, in which case the + // failure must match the specified status and message regex. + void SendRpcsUntilFailure(const grpc_core::DebugLocation& debug_location, + StatusCode expected_status, + absl::string_view expected_message_regex, + int timeout_ms = 15000, + const RpcOptions& rpc_options = RpcOptions()); + // Sends num_rpcs RPCs, counting how many of them fail with a message // matching the specified expected_message_prefix. // Any failure with a non-matching status or message is a test failure. diff --git a/test/cpp/end2end/xds/xds_gcp_authn_end2end_test.cc b/test/cpp/end2end/xds/xds_gcp_authn_end2end_test.cc index 79afe32e64e28..e5e469507d107 100644 --- a/test/cpp/end2end/xds/xds_gcp_authn_end2end_test.cc +++ b/test/cpp/end2end/xds/xds_gcp_authn_end2end_test.cc @@ -234,16 +234,10 @@ TEST_P(XdsGcpAuthnEnd2endTest, CacheRetainedAcrossXdsUpdates) { balancer_.get(), BuildListenerWithGcpAuthnFilter(), route_config); // Send RPCs with the header "foo" and wait for them to start failing. // When they do, we know that the client has seen the update. - SendRpcsUntil( - DEBUG_LOCATION, - [&](const RpcResult& result) { - if (result.status.ok()) return true; - EXPECT_EQ(StatusCode::UNAVAILABLE, result.status.error_code()); - EXPECT_EQ("Matching route has inappropriate action", - result.status.error_message()); - return false; - }, - /*timeout_ms=*/15000, RpcOptions().set_metadata({{"foo", "bar"}})); + SendRpcsUntilFailure(DEBUG_LOCATION, StatusCode::UNAVAILABLE, + "Matching route has inappropriate action", + /*timeout_ms=*/15000, + RpcOptions().set_metadata({{"foo", "bar"}})); // Now send an RPC without the header, which will go through the new // instance of the GCP auth filter. CheckRpcSendOk(DEBUG_LOCATION); diff --git a/test/cpp/end2end/xds/xds_routing_end2end_test.cc b/test/cpp/end2end/xds/xds_routing_end2end_test.cc index 3e970d8e26bf7..bdee96960b08e 100644 --- a/test/cpp/end2end/xds/xds_routing_end2end_test.cc +++ b/test/cpp/end2end/xds/xds_routing_end2end_test.cc @@ -100,14 +100,9 @@ TEST_P(LdsDeletionTest, ListenerDeleted) { // Unset LDS resource. balancer_->ads_service()->UnsetResource(kLdsTypeUrl, kServerName); // Wait for RPCs to start failing. - SendRpcsUntil(DEBUG_LOCATION, [](const RpcResult& result) { - if (result.status.ok()) return true; // Keep going. - EXPECT_EQ(result.status.error_code(), StatusCode::UNAVAILABLE); - EXPECT_EQ(result.status.error_message(), - absl::StrCat("empty address list: ", kServerName, - ": xDS listener resource does not exist")); - return false; - }); + SendRpcsUntilFailure(DEBUG_LOCATION, StatusCode::UNAVAILABLE, + absl::StrCat("empty address list: ", kServerName, + ": xDS listener resource does not exist")); // Make sure we ACK'ed the update. auto response_state = balancer_->ads_service()->lds_response_state(); ASSERT_TRUE(response_state.has_value());