grpc 1.78.0 → 1.80.0.pre1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (431) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +22 -8
  3. data/include/grpc/credentials.h +47 -37
  4. data/include/grpc/credentials_cpp.h +39 -0
  5. data/include/grpc/event_engine/event_engine.h +8 -3
  6. data/include/grpc/grpc.h +4 -0
  7. data/include/grpc/impl/call.h +9 -0
  8. data/include/grpc/impl/channel_arg_names.h +7 -0
  9. data/include/grpc/module.modulemap +2 -0
  10. data/include/grpc/private_key_signer.h +104 -0
  11. data/include/grpc/support/port_platform.h +6 -0
  12. data/src/core/call/call_filters.h +101 -78
  13. data/src/core/call/call_spine.h +91 -68
  14. data/src/core/call/call_state.h +60 -4
  15. data/src/core/call/client_call.cc +9 -9
  16. data/src/core/call/client_call.h +1 -1
  17. data/src/core/call/metadata_batch.cc +2 -0
  18. data/src/core/call/metadata_batch.h +48 -1
  19. data/src/core/call/metadata_info.cc +35 -0
  20. data/src/core/call/metadata_info.h +2 -0
  21. data/src/core/call/simple_slice_based_metadata.h +2 -1
  22. data/src/core/channelz/channelz.cc +9 -6
  23. data/src/core/channelz/channelz.h +7 -4
  24. data/src/core/channelz/property_list.h +5 -0
  25. data/src/core/channelz/v2tov1/convert.cc +1 -1
  26. data/src/core/channelz/v2tov1/legacy_api.cc +164 -307
  27. data/src/core/client_channel/buffered_call.cc +7 -3
  28. data/src/core/client_channel/buffered_call.h +11 -5
  29. data/src/core/client_channel/client_channel.cc +106 -44
  30. data/src/core/client_channel/client_channel.h +3 -6
  31. data/src/core/client_channel/client_channel_filter.cc +90 -64
  32. data/src/core/client_channel/client_channel_filter.h +3 -6
  33. data/src/core/client_channel/client_channel_internal.h +5 -0
  34. data/src/core/client_channel/config_selector.h +17 -12
  35. data/src/core/client_channel/dynamic_filters.cc +8 -7
  36. data/src/core/client_channel/dynamic_filters.h +7 -5
  37. data/src/core/client_channel/retry_filter.cc +1 -1
  38. data/src/core/client_channel/retry_filter.h +2 -2
  39. data/src/core/client_channel/subchannel.cc +1682 -266
  40. data/src/core/client_channel/subchannel.h +411 -134
  41. data/src/core/client_channel/subchannel_stream_client.cc +22 -18
  42. data/src/core/client_channel/subchannel_stream_client.h +8 -9
  43. data/src/core/client_channel/subchannel_stream_limiter.cc +76 -0
  44. data/src/core/client_channel/subchannel_stream_limiter.h +51 -0
  45. data/src/core/config/config_vars.cc +9 -1
  46. data/src/core/config/config_vars.h +6 -0
  47. data/src/core/credentials/call/call_creds_registry.h +51 -22
  48. data/src/core/credentials/call/call_creds_registry_init.cc +86 -2
  49. data/src/core/credentials/call/external/aws_external_account_credentials.cc +2 -2
  50. data/src/core/credentials/call/external/external_account_credentials.cc +11 -4
  51. data/src/core/credentials/call/external/file_external_account_credentials.cc +2 -2
  52. data/src/core/credentials/transport/channel_creds_registry.h +71 -20
  53. data/src/core/credentials/transport/channel_creds_registry_init.cc +338 -29
  54. data/src/core/credentials/transport/ssl/ssl_credentials.cc +43 -24
  55. data/src/core/credentials/transport/ssl/ssl_credentials.h +7 -1
  56. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +2 -8
  57. data/src/core/credentials/transport/ssl/ssl_security_connector.h +4 -3
  58. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +25 -5
  59. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +7 -5
  60. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +181 -109
  61. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +55 -42
  62. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.cc +28 -23
  63. data/src/core/credentials/transport/tls/grpc_tls_credentials_options.h +26 -23
  64. data/src/core/credentials/transport/tls/spiffe_utils.cc +2 -2
  65. data/src/core/credentials/transport/tls/ssl_utils.cc +18 -18
  66. data/src/core/credentials/transport/tls/ssl_utils.h +12 -10
  67. data/src/core/credentials/transport/tls/tls_security_connector.cc +106 -74
  68. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -8
  69. data/src/core/credentials/transport/xds/xds_credentials.cc +76 -32
  70. data/src/core/credentials/transport/xds/xds_credentials.h +4 -2
  71. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +117 -35
  72. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +42 -4
  73. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +58 -29
  74. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +19 -11
  75. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +82 -25
  76. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +28 -3
  77. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +9 -7
  78. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +1 -1
  79. data/src/core/ext/transport/chttp2/transport/call_tracer_wrapper.h +7 -1
  80. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +117 -67
  81. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +2 -0
  82. data/src/core/ext/transport/chttp2/transport/flow_control.h +11 -1
  83. data/src/core/ext/transport/chttp2/transport/frame.cc +2 -15
  84. data/src/core/ext/transport/chttp2/transport/frame.h +0 -4
  85. data/src/core/ext/transport/chttp2/transport/goaway.cc +17 -2
  86. data/src/core/ext/transport/chttp2/transport/goaway.h +27 -6
  87. data/src/core/ext/transport/chttp2/transport/header_assembler.h +8 -21
  88. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +101 -40
  89. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +95 -0
  90. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +923 -772
  91. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +406 -423
  92. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +1 -0
  93. data/src/core/ext/transport/chttp2/transport/http2_settings.h +8 -1
  94. data/src/core/ext/transport/chttp2/transport/http2_settings_promises.h +25 -13
  95. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +71 -24
  96. data/src/core/ext/transport/chttp2/transport/http2_transport.h +25 -49
  97. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +2 -2
  98. data/src/core/ext/transport/chttp2/transport/incoming_metadata_tracker.h +29 -9
  99. data/src/core/ext/transport/chttp2/transport/internal.h +6 -2
  100. data/src/core/ext/transport/chttp2/transport/keepalive.cc +14 -20
  101. data/src/core/ext/transport/chttp2/transport/keepalive.h +9 -6
  102. data/src/core/ext/transport/chttp2/transport/parsing.cc +11 -0
  103. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +34 -74
  104. data/src/core/ext/transport/chttp2/transport/ping_promise.h +123 -79
  105. data/src/core/ext/transport/chttp2/transport/security_frame.h +233 -3
  106. data/src/core/ext/transport/chttp2/transport/stream.h +152 -73
  107. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +155 -85
  108. data/src/core/ext/transport/chttp2/transport/transport_common.h +0 -5
  109. data/src/core/ext/transport/chttp2/transport/writable_streams.h +8 -7
  110. data/src/core/ext/transport/chttp2/transport/write_cycle.cc +86 -0
  111. data/src/core/ext/transport/chttp2/transport/write_cycle.h +355 -0
  112. data/src/core/ext/transport/chttp2/transport/writing.cc +31 -29
  113. data/src/core/ext/upb-gen/cel/expr/checked.upb.h +1875 -0
  114. data/src/core/ext/upb-gen/cel/expr/checked.upb_minitable.c +409 -0
  115. data/src/core/ext/upb-gen/cel/expr/checked.upb_minitable.h +56 -0
  116. data/src/core/ext/upb-gen/cel/expr/syntax.upb.h +2223 -0
  117. data/src/core/ext/upb-gen/cel/expr/syntax.upb_minitable.c +489 -0
  118. data/src/core/ext/upb-gen/cel/expr/syntax.upb_minitable.h +60 -0
  119. data/src/core/ext/upb-gen/envoy/config/accesslog/v3/accesslog.upb.h +2 -1
  120. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb.h +130 -18
  121. data/src/core/ext/upb-gen/envoy/config/bootstrap/v3/bootstrap.upb_minitable.c +18 -13
  122. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb.h +70 -38
  123. data/src/core/ext/upb-gen/envoy/config/cluster/v3/cluster.upb_minitable.c +20 -17
  124. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb.h +26 -10
  125. data/src/core/ext/upb-gen/envoy/config/common/matcher/v3/matcher.upb_minitable.c +8 -7
  126. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb.h +495 -0
  127. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb_minitable.c +114 -0
  128. data/src/core/ext/upb-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upb_minitable.h +36 -0
  129. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb.h +26 -10
  130. data/src/core/ext/upb-gen/envoy/config/core/v3/address.upb_minitable.c +8 -7
  131. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb.h +121 -0
  132. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb_minitable.c +54 -0
  133. data/src/core/ext/upb-gen/envoy/config/core/v3/cel.upb_minitable.h +32 -0
  134. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb.h +143 -9
  135. data/src/core/ext/upb-gen/envoy/config/core/v3/grpc_service.upb_minitable.c +18 -6
  136. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb.h +112 -11
  137. data/src/core/ext/upb-gen/envoy/config/core/v3/protocol.upb_minitable.c +22 -9
  138. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb.h +276 -0
  139. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb_minitable.c +60 -5
  140. data/src/core/ext/upb-gen/envoy/config/core/v3/proxy_protocol.upb_minitable.h +4 -0
  141. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb.h +72 -0
  142. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb_minitable.c +23 -2
  143. data/src/core/ext/upb-gen/envoy/config/endpoint/v3/endpoint_components.upb_minitable.h +2 -0
  144. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb.h +129 -13
  145. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb_minitable.c +36 -10
  146. data/src/core/ext/upb-gen/envoy/config/listener/v3/listener.upb_minitable.h +2 -0
  147. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb.h +30 -0
  148. data/src/core/ext/upb-gen/envoy/config/listener/v3/quic_config.upb_minitable.c +5 -3
  149. data/src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb.h +16 -0
  150. data/src/core/ext/upb-gen/envoy/config/metrics/v3/metrics_service.upb_minitable.c +4 -3
  151. data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb.h +31 -0
  152. data/src/core/ext/upb-gen/envoy/config/metrics/v3/stats.upb_minitable.c +5 -3
  153. data/src/core/ext/upb-gen/envoy/config/overload/v3/overload.upb.h +2 -1
  154. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb.h +63 -0
  155. data/src/core/ext/upb-gen/envoy/config/rbac/v3/rbac.upb_minitable.c +12 -7
  156. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb.h +97 -81
  157. data/src/core/ext/upb-gen/envoy/config/route/v3/route.upb_minitable.c +40 -23
  158. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb.h +604 -228
  159. data/src/core/ext/upb-gen/envoy/config/route/v3/route_components.upb_minitable.c +146 -100
  160. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb.h +30 -0
  161. data/src/core/ext/upb-gen/envoy/config/tap/v3/common.upb_minitable.c +5 -3
  162. data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb.h +35 -3
  163. data/src/core/ext/upb-gen/envoy/config/trace/v3/opentelemetry.upb_minitable.c +7 -4
  164. data/src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb.h +66 -14
  165. data/src/core/ext/upb-gen/envoy/config/trace/v3/zipkin.upb_minitable.c +22 -11
  166. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +87 -0
  167. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb_minitable.c +29 -2
  168. data/src/core/ext/upb-gen/envoy/extensions/clusters/aggregate/v3/cluster.upb_minitable.h +2 -0
  169. data/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +0 -1
  170. data/src/core/ext/upb-gen/envoy/extensions/filters/http/rbac/v3/rbac.upb_minitable.c +0 -1
  171. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +20 -4
  172. data/src/core/ext/upb-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb_minitable.c +5 -4
  173. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +239 -60
  174. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.c +59 -28
  175. data/src/core/ext/upb-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb_minitable.h +2 -0
  176. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb.h +89 -0
  177. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb_minitable.c +50 -0
  178. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/call_credentials/access_token/v3/access_token_credentials.upb_minitable.h +32 -0
  179. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb.h +135 -0
  180. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb_minitable.c +53 -0
  181. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/tls/v3/tls_credentials.upb_minitable.h +32 -0
  182. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb.h +105 -0
  183. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb_minitable.c +51 -0
  184. data/src/core/ext/upb-gen/envoy/extensions/grpc_service/channel_credentials/xds/v3/xds_credentials.upb_minitable.h +32 -0
  185. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb.h +32 -0
  186. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/client_side_weighted_round_robin/v3/client_side_weighted_round_robin.upb_minitable.c +6 -3
  187. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb.h +206 -0
  188. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb_minitable.c +41 -8
  189. data/src/core/ext/upb-gen/envoy/extensions/load_balancing_policies/common/v3/common.upb_minitable.h +2 -0
  190. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb.h +64 -0
  191. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/common.upb_minitable.c +4 -3
  192. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +64 -0
  193. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb_minitable.c +31 -5
  194. data/src/core/ext/upb-gen/envoy/extensions/transport_sockets/tls/v3/secret.upb_minitable.h +2 -0
  195. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb.h +283 -14
  196. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.c +48 -11
  197. data/src/core/ext/upb-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upb_minitable.h +2 -0
  198. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb.h +144 -6
  199. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb_minitable.c +35 -7
  200. data/src/core/ext/upb-gen/envoy/type/http/v3/cookie.upb_minitable.h +2 -0
  201. data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb.h +42 -21
  202. data/src/core/ext/upb-gen/envoy/type/tracing/v3/custom_tag.upb_minitable.c +9 -8
  203. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +164 -1
  204. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +37 -6
  205. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +2 -0
  206. data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb.h +0 -1
  207. data/src/core/ext/upb-gen/xds/type/matcher/v3/cel.upb_minitable.c +0 -1
  208. data/src/core/ext/upb-gen/xds/type/matcher/v3/http_inputs.upb.h +0 -1
  209. data/src/core/ext/upb-gen/xds/type/matcher/v3/http_inputs.upb_minitable.c +0 -1
  210. data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb.h +26 -11
  211. data/src/core/ext/upb-gen/xds/type/matcher/v3/matcher.upb_minitable.c +8 -8
  212. data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb.h +33 -0
  213. data/src/core/ext/upb-gen/xds/type/matcher/v3/string.upb_minitable.c +14 -3
  214. data/src/core/ext/upb-gen/xds/type/v3/cel.upb.h +90 -10
  215. data/src/core/ext/upb-gen/xds/type/v3/cel.upb_minitable.c +18 -7
  216. data/src/core/ext/upbdefs-gen/cel/expr/checked.upbdefs.c +248 -0
  217. data/src/core/ext/upbdefs-gen/cel/expr/checked.upbdefs.h +97 -0
  218. data/src/core/ext/upbdefs-gen/cel/expr/syntax.upbdefs.c +283 -0
  219. data/src/core/ext/upbdefs-gen/cel/expr/syntax.upbdefs.h +107 -0
  220. data/src/core/ext/upbdefs-gen/envoy/config/accesslog/v3/accesslog.upbdefs.c +213 -211
  221. data/src/core/ext/upbdefs-gen/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +635 -614
  222. data/src/core/ext/upbdefs-gen/envoy/config/cluster/v3/cluster.upbdefs.c +1012 -1000
  223. data/src/core/ext/upbdefs-gen/envoy/config/common/matcher/v3/matcher.upbdefs.c +276 -273
  224. data/src/core/ext/upbdefs-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upbdefs.c +152 -0
  225. data/src/core/ext/upbdefs-gen/envoy/config/common/mutation_rules/v3/mutation_rules.upbdefs.h +47 -0
  226. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/address.upbdefs.c +149 -144
  227. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/base.upbdefs.c +367 -370
  228. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/cel.upbdefs.c +63 -0
  229. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/cel.upbdefs.h +37 -0
  230. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/grpc_service.upbdefs.c +297 -284
  231. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/protocol.upbdefs.c +492 -469
  232. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.c +74 -43
  233. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/proxy_protocol.upbdefs.h +10 -0
  234. data/src/core/ext/upbdefs-gen/envoy/config/core/v3/substitution_format_string.upbdefs.c +60 -59
  235. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +202 -184
  236. data/src/core/ext/upbdefs-gen/envoy/config/endpoint/v3/endpoint_components.upbdefs.h +5 -0
  237. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.c +354 -339
  238. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  239. data/src/core/ext/upbdefs-gen/envoy/config/listener/v3/quic_config.upbdefs.c +28 -19
  240. data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/metrics_service.upbdefs.c +30 -27
  241. data/src/core/ext/upbdefs-gen/envoy/config/metrics/v3/stats.upbdefs.c +71 -66
  242. data/src/core/ext/upbdefs-gen/envoy/config/overload/v3/overload.upbdefs.c +94 -91
  243. data/src/core/ext/upbdefs-gen/envoy/config/rbac/v3/rbac.upbdefs.c +386 -369
  244. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route.upbdefs.c +60 -57
  245. data/src/core/ext/upbdefs-gen/envoy/config/route/v3/route_components.upbdefs.c +1974 -1884
  246. data/src/core/ext/upbdefs-gen/envoy/config/tap/v3/common.upbdefs.c +119 -112
  247. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/opentelemetry.upbdefs.c +62 -51
  248. data/src/core/ext/upbdefs-gen/envoy/config/trace/v3/zipkin.upbdefs.c +109 -88
  249. data/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +54 -36
  250. data/src/core/ext/upbdefs-gen/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.h +5 -0
  251. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +78 -84
  252. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +48 -46
  253. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +1041 -984
  254. data/src/core/ext/upbdefs-gen/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +5 -0
  255. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +304 -290
  256. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +94 -77
  257. data/src/core/ext/upbdefs-gen/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.h +5 -0
  258. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.c +246 -193
  259. data/src/core/ext/upbdefs-gen/envoy/extensions/upstreams/http/v3/http_protocol_options.upbdefs.h +5 -0
  260. data/src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.c +37 -23
  261. data/src/core/ext/upbdefs-gen/envoy/type/http/v3/cookie.upbdefs.h +5 -0
  262. data/src/core/ext/upbdefs-gen/envoy/type/tracing/v3/custom_tag.upbdefs.c +5 -3
  263. data/src/core/ext/upbdefs-gen/google/api/http.upbdefs.c +4 -4
  264. data/src/core/ext/upbdefs-gen/google/api/httpbody.upbdefs.c +4 -5
  265. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +113 -87
  266. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +5 -0
  267. data/src/core/ext/upbdefs-gen/udpa/annotations/migrate.upbdefs.c +5 -5
  268. data/src/core/ext/upbdefs-gen/udpa/annotations/security.upbdefs.c +6 -5
  269. data/src/core/ext/upbdefs-gen/udpa/annotations/sensitive.upbdefs.c +5 -5
  270. data/src/core/ext/upbdefs-gen/udpa/annotations/status.upbdefs.c +5 -5
  271. data/src/core/ext/upbdefs-gen/udpa/annotations/versioning.upbdefs.c +5 -5
  272. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/cel.upbdefs.c +25 -30
  273. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/http_inputs.upbdefs.c +14 -20
  274. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/matcher.upbdefs.c +180 -183
  275. data/src/core/ext/upbdefs-gen/xds/type/matcher/v3/string.upbdefs.c +56 -47
  276. data/src/core/ext/upbdefs-gen/xds/type/v3/cel.upbdefs.c +69 -47
  277. data/src/core/filter/filter_chain.h +95 -0
  278. data/src/core/handshaker/http_connect/{http_connect_handshaker.cc → http_connect_client_handshaker.cc} +32 -31
  279. data/src/core/handshaker/http_connect/{http_connect_handshaker.h → http_connect_client_handshaker.h} +4 -4
  280. data/src/core/handshaker/http_connect/http_proxy_mapper.cc +1 -1
  281. data/src/core/handshaker/http_connect/xds_http_proxy_mapper.cc +1 -1
  282. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +14 -13
  283. data/src/core/handshaker/security/secure_endpoint.cc +282 -68
  284. data/src/core/handshaker/security/secure_endpoint.h +0 -7
  285. data/src/core/lib/channel/channel_args.h +1 -1
  286. data/src/core/lib/channel/promise_based_filter.cc +17 -4
  287. data/src/core/lib/channel/promise_based_filter.h +3 -2
  288. data/src/core/lib/debug/trace_flags.cc +2 -0
  289. data/src/core/lib/debug/trace_flags.h +1 -0
  290. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +35 -8
  291. data/src/core/lib/event_engine/cf_engine/dns_service_resolver.h +1 -2
  292. data/src/core/lib/event_engine/event_engine.cc +9 -0
  293. data/src/core/lib/event_engine/extensions/tcp_trace.h +0 -3
  294. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +2 -2
  295. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +1 -1
  296. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +34 -9
  297. data/src/core/lib/event_engine/posix_engine/posix_engine.h +24 -2
  298. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -3
  299. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +141 -14
  300. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +19 -2
  301. data/src/core/lib/event_engine/posix_engine/posix_interface.h +7 -0
  302. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +21 -3
  303. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +16 -0
  304. data/src/core/lib/experiments/experiments.cc +309 -201
  305. data/src/core/lib/experiments/experiments.h +141 -80
  306. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +2 -2
  307. data/src/core/lib/iomgr/resolve_address.h +0 -2
  308. data/src/core/lib/iomgr/resolved_address.h +0 -2
  309. data/src/core/lib/iomgr/tcp_posix.cc +13 -5
  310. data/src/core/lib/iomgr/tcp_server.cc +0 -5
  311. data/src/core/lib/iomgr/tcp_server.h +0 -7
  312. data/src/core/lib/iomgr/tcp_server_posix.cc +0 -17
  313. data/src/core/lib/iomgr/tcp_server_utils_posix.h +0 -3
  314. data/src/core/lib/iomgr/tcp_server_windows.cc +12 -51
  315. data/src/core/lib/promise/all_ok.h +17 -12
  316. data/src/core/lib/promise/cancel_callback.h +12 -13
  317. data/src/core/lib/promise/detail/join_state.h +626 -0
  318. data/src/core/lib/promise/detail/promise_factory.h +14 -14
  319. data/src/core/lib/promise/for_each.h +32 -8
  320. data/src/core/lib/promise/if.h +9 -7
  321. data/src/core/lib/promise/loop.h +18 -16
  322. data/src/core/lib/promise/map.h +54 -47
  323. data/src/core/lib/promise/mpsc.h +11 -10
  324. data/src/core/lib/promise/observable.h +6 -6
  325. data/src/core/lib/promise/party.h +25 -19
  326. data/src/core/lib/promise/poll.h +5 -5
  327. data/src/core/lib/promise/prioritized_race.h +10 -7
  328. data/src/core/lib/promise/promise.h +16 -11
  329. data/src/core/lib/promise/race.h +6 -5
  330. data/src/core/lib/promise/seq.h +109 -74
  331. data/src/core/lib/promise/try_join.h +14 -6
  332. data/src/core/lib/promise/try_seq.h +76 -60
  333. data/src/core/lib/resource_quota/api.cc +7 -0
  334. data/src/core/lib/resource_quota/arena.h +1 -1
  335. data/src/core/lib/resource_quota/memory_quota.cc +4 -1
  336. data/src/core/lib/resource_quota/resource_quota.cc +2 -1
  337. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  338. data/src/core/lib/resource_quota/stream_quota.cc +77 -1
  339. data/src/core/lib/resource_quota/stream_quota.h +64 -1
  340. data/src/core/lib/resource_quota/telemetry.h +1 -1
  341. data/src/core/lib/surface/call.cc +13 -0
  342. data/src/core/lib/surface/call_utils.h +58 -43
  343. data/src/core/lib/surface/channel.h +1 -4
  344. data/src/core/lib/surface/completion_queue.cc +13 -6
  345. data/src/core/lib/surface/validate_metadata.cc +20 -15
  346. data/src/core/lib/surface/validate_metadata.h +3 -1
  347. data/src/core/lib/surface/version.cc +2 -2
  348. data/src/core/lib/transport/promise_endpoint.cc +1 -1
  349. data/src/core/lib/transport/promise_endpoint.h +1 -1
  350. data/src/core/lib/transport/transport.h +5 -0
  351. data/src/core/load_balancing/health_check_client.cc +1 -15
  352. data/src/core/load_balancing/health_check_client_internal.h +0 -2
  353. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  354. data/src/core/load_balancing/oob_backend_metric_internal.h +0 -1
  355. data/src/core/load_balancing/xds/xds_cluster_impl.cc +12 -9
  356. data/src/core/plugin_registry/grpc_plugin_registry.cc +3 -2
  357. data/src/core/resolver/xds/xds_resolver.cc +162 -116
  358. data/src/core/server/server.cc +18 -1
  359. data/src/core/server/server.h +2 -0
  360. data/src/core/server/xds_server_config_fetcher.cc +4 -4
  361. data/src/core/telemetry/call_tracer.cc +87 -2
  362. data/src/core/telemetry/call_tracer.h +46 -8
  363. data/src/core/telemetry/instrument.cc +102 -40
  364. data/src/core/telemetry/instrument.h +246 -65
  365. data/src/core/tsi/fake_transport_security.cc +3 -1
  366. data/src/core/tsi/ssl_transport_security.cc +516 -137
  367. data/src/core/tsi/ssl_transport_security.h +28 -22
  368. data/src/core/tsi/ssl_transport_security_utils.cc +2 -2
  369. data/src/core/tsi/ssl_transport_security_utils.h +2 -2
  370. data/src/core/util/bitset.h +6 -0
  371. data/src/core/util/function_signature.h +3 -1
  372. data/src/core/util/http_client/httpcli_security_connector.cc +2 -1
  373. data/src/core/util/json/json_reader.cc +0 -4
  374. data/src/core/xds/grpc/certificate_provider_store.cc +2 -1
  375. data/src/core/xds/grpc/certificate_provider_store.h +3 -17
  376. data/src/core/xds/grpc/certificate_provider_store_interface.h +61 -0
  377. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +48 -0
  378. data/src/core/xds/grpc/xds_bootstrap_grpc.h +18 -0
  379. data/src/core/xds/grpc/xds_certificate_provider.cc +7 -2
  380. data/src/core/xds/grpc/xds_certificate_provider.h +13 -2
  381. data/src/core/xds/grpc/xds_client_grpc.cc +13 -6
  382. data/src/core/xds/grpc/xds_client_grpc.h +10 -7
  383. data/src/core/xds/grpc/xds_cluster.cc +18 -4
  384. data/src/core/xds/grpc/xds_cluster.h +17 -2
  385. data/src/core/xds/grpc/xds_cluster_parser.cc +36 -11
  386. data/src/core/xds/grpc/xds_common_types.cc +45 -0
  387. data/src/core/xds/grpc/xds_common_types.h +31 -0
  388. data/src/core/xds/grpc/xds_common_types_parser.cc +274 -16
  389. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  390. data/src/core/xds/grpc/xds_http_fault_filter.cc +128 -24
  391. data/src/core/xds/grpc/xds_http_fault_filter.h +19 -10
  392. data/src/core/xds/grpc/xds_http_filter.cc +38 -0
  393. data/src/core/xds/grpc/xds_http_filter.h +70 -47
  394. data/src/core/xds/grpc/xds_http_filter_registry.cc +48 -14
  395. data/src/core/xds/grpc/xds_http_filter_registry.h +29 -15
  396. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +88 -22
  397. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +22 -11
  398. data/src/core/xds/grpc/xds_http_rbac_filter.cc +36 -20
  399. data/src/core/xds/grpc/xds_http_rbac_filter.h +19 -10
  400. data/src/core/xds/grpc/xds_http_stateful_session_filter.cc +143 -26
  401. data/src/core/xds/grpc/xds_http_stateful_session_filter.h +19 -10
  402. data/src/core/xds/grpc/xds_listener.cc +4 -1
  403. data/src/core/xds/grpc/xds_listener.h +10 -2
  404. data/src/core/xds/grpc/xds_listener_parser.cc +23 -18
  405. data/src/core/xds/grpc/xds_matcher.cc +40 -5
  406. data/src/core/xds/grpc/xds_matcher.h +13 -0
  407. data/src/core/xds/grpc/xds_matcher_action.h +1 -1
  408. data/src/core/xds/grpc/xds_matcher_parse.cc +60 -40
  409. data/src/core/xds/grpc/xds_matcher_parse.h +2 -1
  410. data/src/core/xds/grpc/xds_route_config.cc +12 -1
  411. data/src/core/xds/grpc/xds_route_config.h +15 -2
  412. data/src/core/xds/grpc/xds_route_config_parser.cc +11 -5
  413. data/src/core/xds/grpc/xds_routing.cc +181 -6
  414. data/src/core/xds/grpc/xds_routing.h +57 -0
  415. data/src/core/xds/grpc/xds_server_grpc.cc +55 -43
  416. data/src/core/xds/grpc/xds_server_grpc.h +13 -6
  417. data/src/core/xds/grpc/xds_server_grpc_interface.h +3 -2
  418. data/src/core/xds/grpc/xds_transport_grpc.cc +12 -6
  419. data/src/core/xds/grpc/xds_transport_grpc.h +5 -1
  420. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +12 -8
  421. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +18 -12
  422. data/src/ruby/lib/grpc/grpc.rb +7 -9
  423. data/src/ruby/lib/grpc/version.rb +1 -1
  424. data/src/ruby/pb/generate_proto_ruby.sh +1 -1
  425. data/src/ruby/spec/client_server_spec.rb +1 -1
  426. data/src/ruby/spec/generic/rpc_server_pool_spec.rb +1 -1
  427. data/src/ruby/spec/generic/rpc_server_spec.rb +3 -4
  428. data/src/ruby/spec/spec_helper.rb +1 -1
  429. metadata +64 -14
  430. data/src/core/ext/transport/chttp2/transport/security_frame.cc +0 -31
  431. data/src/core/handshaker/security/legacy_secure_endpoint.cc +0 -597
@@ -99,7 +99,7 @@ class TlsChannelSecurityConnector final
99
99
  return pem_key_cert_pair_list_;
100
100
  }
101
101
 
102
- std::shared_ptr<RootCertInfo> RootCertInfoForTesting() {
102
+ std::shared_ptr<tsi::RootCertInfo> RootCertInfoForTesting() {
103
103
  MutexLock lock(&mu_);
104
104
  return root_cert_info_;
105
105
  }
@@ -115,7 +115,7 @@ class TlsChannelSecurityConnector final
115
115
  TlsChannelSecurityConnector* security_connector)
116
116
  : security_connector_(security_connector) {}
117
117
  void OnCertificatesChanged(
118
- std::shared_ptr<RootCertInfo> root_certs,
118
+ std::shared_ptr<tsi::RootCertInfo> root_certs,
119
119
  std::optional<PemKeyCertPairList> key_cert_pairs) override;
120
120
  void OnError(grpc_error_handle root_cert_error,
121
121
  grpc_error_handle identity_cert_error) override;
@@ -158,7 +158,9 @@ class TlsChannelSecurityConnector final
158
158
  Mutex verifier_request_map_mu_;
159
159
  RefCountedPtr<grpc_tls_credentials_options> options_;
160
160
  grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
161
- certificate_watcher_ = nullptr;
161
+ root_certificate_watcher_ = nullptr;
162
+ grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
163
+ identity_certificate_watcher_ = nullptr;
162
164
  std::string target_name_;
163
165
  std::string overridden_target_name_;
164
166
  tsi_ssl_client_handshaker_factory* client_handshaker_factory_
@@ -167,7 +169,7 @@ class TlsChannelSecurityConnector final
167
169
  RefCountedPtr<TlsSessionKeyLogger> tls_session_key_logger_;
168
170
  std::optional<PemKeyCertPairList> pem_key_cert_pair_list_
169
171
  ABSL_GUARDED_BY(mu_);
170
- std::shared_ptr<RootCertInfo> root_cert_info_ ABSL_GUARDED_BY(mu_);
172
+ std::shared_ptr<tsi::RootCertInfo> root_cert_info_ ABSL_GUARDED_BY(mu_);
171
173
  std::map<grpc_closure* /*on_peer_checked*/, ChannelPendingVerifierRequest*>
172
174
  pending_verifier_requests_ ABSL_GUARDED_BY(verifier_request_map_mu_);
173
175
  };
@@ -209,7 +211,7 @@ class TlsServerSecurityConnector final : public grpc_server_security_connector {
209
211
  return pem_key_cert_pair_list_;
210
212
  }
211
213
 
212
- std::shared_ptr<RootCertInfo> RootCertInfoForTesting() {
214
+ std::shared_ptr<tsi::RootCertInfo> RootCertInfoForTesting() {
213
215
  MutexLock lock(&mu_);
214
216
  return root_cert_info_;
215
217
  }
@@ -225,7 +227,7 @@ class TlsServerSecurityConnector final : public grpc_server_security_connector {
225
227
  TlsServerSecurityConnector* security_connector)
226
228
  : security_connector_(security_connector) {}
227
229
  void OnCertificatesChanged(
228
- std::shared_ptr<RootCertInfo> roots,
230
+ std::shared_ptr<tsi::RootCertInfo> roots,
229
231
  std::optional<PemKeyCertPairList> key_cert_pairs) override;
230
232
 
231
233
  void OnError(grpc_error_handle root_cert_error,
@@ -269,12 +271,14 @@ class TlsServerSecurityConnector final : public grpc_server_security_connector {
269
271
  Mutex verifier_request_map_mu_;
270
272
  RefCountedPtr<grpc_tls_credentials_options> options_;
271
273
  grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
272
- certificate_watcher_ = nullptr;
274
+ root_certificate_watcher_ = nullptr;
275
+ grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface*
276
+ identity_certificate_watcher_ = nullptr;
273
277
  tsi_ssl_server_handshaker_factory* server_handshaker_factory_
274
278
  ABSL_GUARDED_BY(mu_) = nullptr;
275
279
  std::optional<PemKeyCertPairList> pem_key_cert_pair_list_
276
280
  ABSL_GUARDED_BY(mu_);
277
- std::shared_ptr<RootCertInfo> root_cert_info_ ABSL_GUARDED_BY(mu_);
281
+ std::shared_ptr<tsi::RootCertInfo> root_cert_info_ ABSL_GUARDED_BY(mu_);
278
282
  RefCountedPtr<TlsSessionKeyLogger> tls_session_key_logger_;
279
283
  std::map<grpc_closure* /*on_peer_checked*/, ServerPendingVerifierRequest*>
280
284
  pending_verifier_requests_ ABSL_GUARDED_BY(verifier_request_map_mu_);
@@ -30,7 +30,9 @@
30
30
  #include "src/core/credentials/transport/tls/tls_utils.h"
31
31
  #include "src/core/lib/channel/channel_args.h"
32
32
  #include "src/core/load_balancing/xds/xds_channel_args.h"
33
+ #include "src/core/util/env.h"
33
34
  #include "src/core/util/grpc_check.h"
35
+ #include "src/core/util/host_port.h"
34
36
  #include "src/core/util/useful.h"
35
37
  #include "src/core/xds/grpc/xds_certificate_provider.h"
36
38
 
@@ -38,6 +40,15 @@ namespace grpc_core {
38
40
 
39
41
  namespace {
40
42
 
43
+ // TODO(mlumish): Remove this after 1.80
44
+ bool UseChannelAuthorityIfNoSNIApplicable() {
45
+ auto value = GetEnv("GRPC_USE_CHANNEL_AUTHORITY_IF_NO_SNI_APPLICABLE");
46
+ if (!value.has_value()) return false;
47
+ bool parsed_value;
48
+ bool parse_succeeded = gpr_parse_bool_value(value->c_str(), &parsed_value);
49
+ return parse_succeeded && parsed_value;
50
+ }
51
+
41
52
  bool XdsVerifySubjectAlternativeNames(
42
53
  const char* const* subject_alternative_names,
43
54
  size_t subject_alternative_names_size,
@@ -73,28 +84,40 @@ bool XdsVerifySubjectAlternativeNames(
73
84
  //
74
85
 
75
86
  XdsCertificateVerifier::XdsCertificateVerifier(
76
- RefCountedPtr<XdsCertificateProvider> xds_certificate_provider)
77
- : xds_certificate_provider_(std::move(xds_certificate_provider)) {}
87
+ RefCountedPtr<XdsCertificateProvider> xds_certificate_provider,
88
+ absl::string_view sni_name)
89
+ : xds_certificate_provider_(std::move(xds_certificate_provider)),
90
+ sni_name_(sni_name) {}
78
91
 
79
92
  bool XdsCertificateVerifier::Verify(
80
93
  grpc_tls_custom_verification_check_request* request,
81
94
  std::function<void(absl::Status)>, absl::Status* sync_status) {
82
95
  GRPC_CHECK_NE(request, nullptr);
83
- if (!XdsVerifySubjectAlternativeNames(
84
- request->peer_info.san_names.uri_names,
85
- request->peer_info.san_names.uri_names_size,
86
- xds_certificate_provider_->san_matchers()) &&
87
- !XdsVerifySubjectAlternativeNames(
88
- request->peer_info.san_names.ip_names,
89
- request->peer_info.san_names.ip_names_size,
90
- xds_certificate_provider_->san_matchers()) &&
91
- !XdsVerifySubjectAlternativeNames(
92
- request->peer_info.san_names.dns_names,
93
- request->peer_info.san_names.dns_names_size,
94
- xds_certificate_provider_->san_matchers())) {
95
- *sync_status = absl::Status(
96
- absl::StatusCode::kUnauthenticated,
97
- "SANs from certificate did not match SANs from xDS control plane");
96
+ if (xds_certificate_provider_->auto_sni_san_validation()) {
97
+ if (!XdsVerifySubjectAlternativeNames(
98
+ request->peer_info.san_names.dns_names,
99
+ request->peer_info.san_names.dns_names_size,
100
+ {StringMatcher::Create(StringMatcher::Type::kExact, sni_name_, true)
101
+ .value()})) {
102
+ *sync_status = absl::UnauthenticatedError(
103
+ "SANs from certificate did not match SNI from xDS control plane");
104
+ }
105
+ } else {
106
+ if (!XdsVerifySubjectAlternativeNames(
107
+ request->peer_info.san_names.uri_names,
108
+ request->peer_info.san_names.uri_names_size,
109
+ xds_certificate_provider_->san_matchers()) &&
110
+ !XdsVerifySubjectAlternativeNames(
111
+ request->peer_info.san_names.ip_names,
112
+ request->peer_info.san_names.ip_names_size,
113
+ xds_certificate_provider_->san_matchers()) &&
114
+ !XdsVerifySubjectAlternativeNames(
115
+ request->peer_info.san_names.dns_names,
116
+ request->peer_info.san_names.dns_names_size,
117
+ xds_certificate_provider_->san_matchers())) {
118
+ *sync_status = absl::UnauthenticatedError(
119
+ "SANs from certificate did not match SANs from xDS control plane");
120
+ }
98
121
  }
99
122
  return true; // synchronous check
100
123
  }
@@ -105,12 +128,19 @@ void XdsCertificateVerifier::Cancel(
105
128
  int XdsCertificateVerifier::CompareImpl(
106
129
  const grpc_tls_certificate_verifier* other) const {
107
130
  auto* o = static_cast<const XdsCertificateVerifier*>(other);
131
+ int compare_cert_provider;
108
132
  if (xds_certificate_provider_ == nullptr ||
109
133
  o->xds_certificate_provider_ == nullptr) {
110
- return QsortCompare(xds_certificate_provider_,
111
- o->xds_certificate_provider_);
134
+ compare_cert_provider =
135
+ QsortCompare(xds_certificate_provider_, o->xds_certificate_provider_);
136
+ } else {
137
+ compare_cert_provider =
138
+ xds_certificate_provider_->Compare(o->xds_certificate_provider_.get());
139
+ }
140
+ if (compare_cert_provider != 0) {
141
+ return compare_cert_provider;
112
142
  }
113
- return xds_certificate_provider_->Compare(o->xds_certificate_provider_.get());
143
+ return sni_name_.compare(o->sni_name_);
114
144
  }
115
145
 
116
146
  UniqueTypeName XdsCertificateVerifier::type() const {
@@ -145,20 +175,33 @@ XdsCredentials::create_security_connector(
145
175
  if (watch_root || use_system_root_certs || watch_identity) {
146
176
  auto tls_credentials_options =
147
177
  MakeRefCounted<grpc_tls_credentials_options>();
148
- if (watch_root || watch_identity) {
149
- tls_credentials_options->set_certificate_provider(
178
+ if (watch_root) {
179
+ tls_credentials_options->set_root_certificate_provider(
180
+ xds_certificate_provider);
181
+ }
182
+ if (watch_identity) {
183
+ tls_credentials_options->set_identity_certificate_provider(
150
184
  xds_certificate_provider);
151
- if (watch_root) {
152
- tls_credentials_options->set_watch_root_cert(true);
153
- }
154
- if (watch_identity) {
155
- tls_credentials_options->set_watch_identity_pair(true);
156
- }
157
185
  }
158
186
  tls_credentials_options->set_verify_server_cert(true);
187
+ auto hostname = args->GetOwnedString(GRPC_ARG_ADDRESS_NAME);
188
+ if (xds_certificate_provider->auto_host_sni() && hostname.has_value()) {
189
+ std::string host;
190
+ std::string port;
191
+ SplitHostPort(*hostname, &host, &port);
192
+ tls_credentials_options->set_sni_override(host);
193
+ } else if (!xds_certificate_provider->sni().empty()) {
194
+ tls_credentials_options->set_sni_override(
195
+ xds_certificate_provider->sni());
196
+ } else {
197
+ if (!UseChannelAuthorityIfNoSNIApplicable()) {
198
+ tls_credentials_options->set_sni_override("");
199
+ }
200
+ }
159
201
  tls_credentials_options->set_certificate_verifier(
160
202
  MakeRefCounted<XdsCertificateVerifier>(
161
- std::move(xds_certificate_provider)));
203
+ std::move(xds_certificate_provider),
204
+ tls_credentials_options->sni_override().value_or("")));
162
205
  tls_credentials_options->set_check_call_host(false);
163
206
  auto tls_credentials =
164
207
  MakeRefCounted<TlsCredentials>(std::move(tls_credentials_options));
@@ -188,10 +231,11 @@ XdsServerCredentials::create_security_connector(const ChannelArgs& args) {
188
231
  xds_certificate_provider->ProvidesIdentityCerts()) {
189
232
  auto tls_credentials_options =
190
233
  MakeRefCounted<grpc_tls_credentials_options>();
191
- tls_credentials_options->set_watch_identity_pair(true);
192
- tls_credentials_options->set_certificate_provider(xds_certificate_provider);
234
+ tls_credentials_options->set_identity_certificate_provider(
235
+ xds_certificate_provider);
193
236
  if (xds_certificate_provider->ProvidesRootCerts()) {
194
- tls_credentials_options->set_watch_root_cert(true);
237
+ tls_credentials_options->set_root_certificate_provider(
238
+ xds_certificate_provider);
195
239
  tls_credentials_options->set_cert_request_type(
196
240
  xds_certificate_provider->require_client_certificate()
197
241
  ? GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY
@@ -44,8 +44,9 @@ namespace grpc_core {
44
44
 
45
45
  class XdsCertificateVerifier : public grpc_tls_certificate_verifier {
46
46
  public:
47
- explicit XdsCertificateVerifier(
48
- RefCountedPtr<XdsCertificateProvider> xds_certificate_provider);
47
+ XdsCertificateVerifier(
48
+ RefCountedPtr<XdsCertificateProvider> xds_certificate_provider,
49
+ absl::string_view sni_name);
49
50
 
50
51
  bool Verify(grpc_tls_custom_verification_check_request* request,
51
52
  std::function<void(absl::Status)>,
@@ -58,6 +59,7 @@ class XdsCertificateVerifier : public grpc_tls_certificate_verifier {
58
59
  int CompareImpl(const grpc_tls_certificate_verifier* other) const override;
59
60
 
60
61
  RefCountedPtr<XdsCertificateProvider> xds_certificate_provider_;
62
+ std::string sni_name_;
61
63
  };
62
64
 
63
65
  class XdsCredentials final : public grpc_channel_credentials {
@@ -34,6 +34,7 @@
34
34
  #include "src/core/ext/filters/fault_injection/fault_injection_service_config_parser.h"
35
35
  #include "src/core/lib/channel/channel_stack.h"
36
36
  #include "src/core/lib/debug/trace.h"
37
+ #include "src/core/lib/experiments/experiments.h"
37
38
  #include "src/core/lib/promise/context.h"
38
39
  #include "src/core/lib/promise/sleep.h"
39
40
  #include "src/core/lib/promise/try_seq.h"
@@ -50,6 +51,63 @@
50
51
 
51
52
  namespace grpc_core {
52
53
 
54
+ bool FaultInjectionFilter::Config::Equals(const FilterConfig& other) const {
55
+ const auto& o = DownCast<const Config&>(other);
56
+ return abort_code == o.abort_code && abort_message == o.abort_message &&
57
+ abort_code_header == o.abort_code_header &&
58
+ abort_percentage_header == o.abort_percentage_header &&
59
+ delay == o.delay && delay_header == o.delay_header &&
60
+ delay_percentage_header == o.delay_percentage_header &&
61
+ delay_percentage_numerator == o.delay_percentage_numerator &&
62
+ delay_percentage_denominator == o.delay_percentage_denominator &&
63
+ max_faults == o.max_faults;
64
+ }
65
+
66
+ std::string FaultInjectionFilter::Config::ToString() const {
67
+ std::vector<std::string> parts;
68
+ if (abort_code != GRPC_STATUS_OK || !abort_code_header.empty()) {
69
+ if (abort_code != GRPC_STATUS_OK) {
70
+ parts.push_back(
71
+ absl::StrCat("abort_code=", grpc_status_code_to_string(abort_code)));
72
+ }
73
+ if (!abort_code_header.empty()) {
74
+ parts.push_back(
75
+ absl::StrCat("abort_code_header=\"", abort_code_header, "\""));
76
+ }
77
+ parts.push_back(absl::StrCat("abort_message=\"", abort_message, "\""));
78
+ if (!abort_percentage_header.empty()) {
79
+ parts.push_back(absl::StrCat("abort_percentage_header=\"",
80
+ abort_percentage_header, "\""));
81
+ }
82
+ if (abort_percentage_numerator > 0) {
83
+ parts.push_back(absl::StrCat("abort_percentage_numerator=",
84
+ abort_percentage_numerator));
85
+ parts.push_back(absl::StrCat("abort_percentage_denominator=",
86
+ abort_percentage_denominator));
87
+ }
88
+ }
89
+ if (delay != Duration::Zero() || !delay_header.empty()) {
90
+ if (delay != Duration::Zero()) {
91
+ parts.push_back(absl::StrCat("delay=", delay.ToString()));
92
+ }
93
+ if (!delay_header.empty()) {
94
+ parts.push_back(absl::StrCat("delay_header=\"", delay_header, "\""));
95
+ }
96
+ if (!delay_percentage_header.empty()) {
97
+ parts.push_back(absl::StrCat("delay_percentage_header=\"",
98
+ delay_percentage_header, "\""));
99
+ }
100
+ if (delay_percentage_numerator > 0) {
101
+ parts.push_back(absl::StrCat("delay_percentage_numerator=",
102
+ delay_percentage_numerator));
103
+ parts.push_back(absl::StrCat("delay_percentage_denominator=",
104
+ delay_percentage_denominator));
105
+ }
106
+ }
107
+ parts.push_back(absl::StrCat("max_faults=", max_faults));
108
+ return absl::StrCat("{", absl::StrJoin(parts, ", "), "}");
109
+ }
110
+
53
111
  namespace {
54
112
 
55
113
  std::atomic<uint32_t> g_active_faults{0};
@@ -128,13 +186,24 @@ class FaultInjectionFilter::InjectionDecision {
128
186
  absl::StatusOr<std::unique_ptr<FaultInjectionFilter>>
129
187
  FaultInjectionFilter::Create(const ChannelArgs&,
130
188
  ChannelFilter::Args filter_args) {
189
+ if (IsXdsChannelFilterChainPerRouteEnabled()) {
190
+ if (filter_args.config() == nullptr) {
191
+ return absl::InternalError("no config passed to fault injection filter");
192
+ }
193
+ if (filter_args.config()->type() != Config::Type()) {
194
+ return absl::InternalError(
195
+ absl::StrCat("wrong config type passed to fault injection filter: ",
196
+ filter_args.config()->type().name()));
197
+ }
198
+ }
131
199
  return std::make_unique<FaultInjectionFilter>(filter_args);
132
200
  }
133
201
 
134
202
  FaultInjectionFilter::FaultInjectionFilter(ChannelFilter::Args filter_args)
135
203
  : index_(filter_args.instance_id()),
136
204
  service_config_parser_index_(
137
- FaultInjectionServiceConfigParser::ParserIndex()) {}
205
+ FaultInjectionServiceConfigParser::ParserIndex()),
206
+ config_(filter_args.config().TakeAsSubclass<const Config>()) {}
138
207
 
139
208
  // Construct a promise for one call.
140
209
  ArenaPromise<absl::Status> FaultInjectionFilter::Call::OnClientInitialMetadata(
@@ -152,62 +221,75 @@ ArenaPromise<absl::Status> FaultInjectionFilter::Call::OnClientInitialMetadata(
152
221
  FaultInjectionFilter::InjectionDecision
153
222
  FaultInjectionFilter::MakeInjectionDecision(
154
223
  const ClientMetadata& initial_metadata) {
155
- // Fetch the fault injection policy from the service config, based on the
156
- // relative index for which policy should this CallData use.
157
- auto* service_config_call_data = GetContext<ServiceConfigCallData>();
158
- auto* method_params = static_cast<FaultInjectionMethodParsedConfig*>(
159
- service_config_call_data->GetMethodParsedConfig(
160
- service_config_parser_index_));
161
- const FaultInjectionMethodParsedConfig::FaultInjectionPolicy* fi_policy =
162
- nullptr;
163
- if (method_params != nullptr) {
164
- fi_policy = method_params->fault_injection_policy(index_);
224
+ if (!IsXdsChannelFilterChainPerRouteEnabled()) {
225
+ // Fetch the fault injection policy from the service config, based on the
226
+ // relative index for which policy should this CallData use.
227
+ auto* service_config_call_data = GetContext<ServiceConfigCallData>();
228
+ auto* method_params = static_cast<FaultInjectionMethodParsedConfig*>(
229
+ service_config_call_data->GetMethodParsedConfig(
230
+ service_config_parser_index_));
231
+ const FaultInjectionMethodParsedConfig::FaultInjectionPolicy* fi_policy =
232
+ nullptr;
233
+ if (method_params != nullptr) {
234
+ fi_policy = method_params->fault_injection_policy(index_);
235
+ }
236
+ // Shouldn't ever be null, but just in case, return a no-op decision.
237
+ if (fi_policy == nullptr) {
238
+ return InjectionDecision(/*max_faults=*/0,
239
+ /*delay_time=*/Duration::Zero(),
240
+ /*abort_request=*/std::nullopt);
241
+ }
242
+ return MakeInjectionDecision(initial_metadata, *fi_policy);
165
243
  }
166
-
167
244
  // Shouldn't ever be null, but just in case, return a no-op decision.
168
- if (fi_policy == nullptr) {
245
+ if (config_ == nullptr) {
169
246
  return InjectionDecision(/*max_faults=*/0, /*delay_time=*/Duration::Zero(),
170
247
  /*abort_request=*/std::nullopt);
171
248
  }
249
+ return MakeInjectionDecision(initial_metadata, *config_);
250
+ }
172
251
 
173
- grpc_status_code abort_code = fi_policy->abort_code;
174
- uint32_t abort_percentage_numerator = fi_policy->abort_percentage_numerator;
175
- uint32_t delay_percentage_numerator = fi_policy->delay_percentage_numerator;
176
- Duration delay = fi_policy->delay;
252
+ template <typename T>
253
+ FaultInjectionFilter::InjectionDecision
254
+ FaultInjectionFilter::MakeInjectionDecision(
255
+ const ClientMetadata& initial_metadata, const T& config) {
256
+ grpc_status_code abort_code = config.abort_code;
257
+ uint32_t abort_percentage_numerator = config.abort_percentage_numerator;
258
+ uint32_t delay_percentage_numerator = config.delay_percentage_numerator;
259
+ Duration delay = config.delay;
177
260
 
178
261
  // Update the policy with values in initial metadata.
179
- if (!fi_policy->abort_code_header.empty() ||
180
- !fi_policy->abort_percentage_header.empty() ||
181
- !fi_policy->delay_header.empty() ||
182
- !fi_policy->delay_percentage_header.empty()) {
262
+ if (!config.abort_code_header.empty() ||
263
+ !config.abort_percentage_header.empty() || !config.delay_header.empty() ||
264
+ !config.delay_percentage_header.empty()) {
183
265
  std::string buffer;
184
- if (!fi_policy->abort_code_header.empty() && abort_code == GRPC_STATUS_OK) {
185
- auto value = initial_metadata.GetStringValue(fi_policy->abort_code_header,
186
- &buffer);
266
+ if (!config.abort_code_header.empty() && abort_code == GRPC_STATUS_OK) {
267
+ auto value =
268
+ initial_metadata.GetStringValue(config.abort_code_header, &buffer);
187
269
  if (value.has_value()) {
188
270
  grpc_status_code_from_int(
189
271
  AsInt<int>(*value).value_or(GRPC_STATUS_UNKNOWN), &abort_code);
190
272
  }
191
273
  }
192
- if (!fi_policy->abort_percentage_header.empty()) {
274
+ if (!config.abort_percentage_header.empty()) {
193
275
  auto value = initial_metadata.GetStringValue(
194
- fi_policy->abort_percentage_header, &buffer);
276
+ config.abort_percentage_header, &buffer);
195
277
  if (value.has_value()) {
196
278
  abort_percentage_numerator = std::min(
197
279
  AsInt<uint32_t>(*value).value_or(-1), abort_percentage_numerator);
198
280
  }
199
281
  }
200
- if (!fi_policy->delay_header.empty() && delay == Duration::Zero()) {
282
+ if (!config.delay_header.empty() && delay == Duration::Zero()) {
201
283
  auto value =
202
- initial_metadata.GetStringValue(fi_policy->delay_header, &buffer);
284
+ initial_metadata.GetStringValue(config.delay_header, &buffer);
203
285
  if (value.has_value()) {
204
286
  delay = Duration::Milliseconds(
205
287
  std::max(AsInt<int64_t>(*value).value_or(0), int64_t{0}));
206
288
  }
207
289
  }
208
- if (!fi_policy->delay_percentage_header.empty()) {
290
+ if (!config.delay_percentage_header.empty()) {
209
291
  auto value = initial_metadata.GetStringValue(
210
- fi_policy->delay_percentage_header, &buffer);
292
+ config.delay_percentage_header, &buffer);
211
293
  if (value.has_value()) {
212
294
  delay_percentage_numerator = std::min(
213
295
  AsInt<uint32_t>(*value).value_or(-1), delay_percentage_numerator);
@@ -222,20 +304,20 @@ FaultInjectionFilter::MakeInjectionDecision(
222
304
  if (delay_request) {
223
305
  delay_request =
224
306
  UnderFraction(&delay_rand_generator_, delay_percentage_numerator,
225
- fi_policy->delay_percentage_denominator);
307
+ config.delay_percentage_denominator);
226
308
  }
227
309
  if (abort_request) {
228
310
  abort_request =
229
311
  UnderFraction(&abort_rand_generator_, abort_percentage_numerator,
230
- fi_policy->abort_percentage_denominator);
312
+ config.abort_percentage_denominator);
231
313
  }
232
314
  }
233
315
 
234
316
  return InjectionDecision(
235
- fi_policy->max_faults, delay_request ? delay : Duration::Zero(),
317
+ config.max_faults, delay_request ? delay : Duration::Zero(),
236
318
  abort_request ? std::optional<absl::Status>(absl::Status(
237
319
  static_cast<absl::StatusCode>(abort_code),
238
- fi_policy->abort_message))
320
+ config.abort_message))
239
321
  : std::nullopt);
240
322
  }
241
323
 
@@ -264,7 +346,7 @@ std::string FaultInjectionFilter::InjectionDecision::ToString() const {
264
346
  " abort=", abort_request_.has_value());
265
347
  }
266
348
 
267
- const grpc_channel_filter FaultInjectionFilter::kFilter =
349
+ const grpc_channel_filter FaultInjectionFilter::kFilterVtable =
268
350
  MakePromiseBasedFilter<FaultInjectionFilter, FilterEndpoint::kClient>();
269
351
 
270
352
  void FaultInjectionFilterRegister(CoreConfiguration::Builder* builder) {
@@ -17,11 +17,11 @@
17
17
  #ifndef GRPC_SRC_CORE_EXT_FILTERS_FAULT_INJECTION_FAULT_INJECTION_FILTER_H
18
18
  #define GRPC_SRC_CORE_EXT_FILTERS_FAULT_INJECTION_FAULT_INJECTION_FILTER_H
19
19
 
20
- #include <grpc/support/port_platform.h>
21
20
  #include <stddef.h>
22
21
 
23
22
  #include <memory>
24
23
 
24
+ #include "src/core/filter/filter_args.h"
25
25
  #include "src/core/lib/channel/channel_args.h"
26
26
  #include "src/core/lib/channel/channel_fwd.h"
27
27
  #include "src/core/lib/channel/promise_based_filter.h"
@@ -41,7 +41,37 @@ namespace grpc_core {
41
41
  class FaultInjectionFilter
42
42
  : public ImplementChannelFilter<FaultInjectionFilter> {
43
43
  public:
44
- static const grpc_channel_filter kFilter;
44
+ // TODO(roth): The config structure here does not map cleanly to the
45
+ // xDS representation, and I suspect that we are not handling all of
46
+ // the edge cases correctly (e.g., abort_code=OK). When we have time,
47
+ // restructure this.
48
+ struct Config : public FilterConfig {
49
+ static UniqueTypeName Type() {
50
+ return GRPC_UNIQUE_TYPE_NAME_HERE("fault_injection_filter_config");
51
+ }
52
+ UniqueTypeName type() const override { return Type(); }
53
+
54
+ bool Equals(const FilterConfig& other) const override;
55
+ std::string ToString() const override;
56
+
57
+ grpc_status_code abort_code = GRPC_STATUS_OK;
58
+ std::string abort_message = "Fault injected";
59
+ std::string abort_code_header;
60
+ std::string abort_percentage_header;
61
+ uint32_t abort_percentage_numerator = 0;
62
+ uint32_t abort_percentage_denominator = 100;
63
+
64
+ Duration delay;
65
+ std::string delay_header;
66
+ std::string delay_percentage_header;
67
+ uint32_t delay_percentage_numerator = 0;
68
+ uint32_t delay_percentage_denominator = 100;
69
+
70
+ // By default, the max allowed active faults are unlimited.
71
+ uint32_t max_faults = std::numeric_limits<uint32_t>::max();
72
+ };
73
+
74
+ static const grpc_channel_filter kFilterVtable;
45
75
 
46
76
  static absl::string_view TypeName() { return "fault_injection_filter"; }
47
77
 
@@ -68,12 +98,20 @@ class FaultInjectionFilter
68
98
 
69
99
  private:
70
100
  class InjectionDecision;
101
+
71
102
  InjectionDecision MakeInjectionDecision(
72
103
  const ClientMetadata& initial_metadata);
73
104
 
74
- // The relative index of instances of the same filter.
75
- size_t index_;
105
+ // TODO(roth): Remove this method and these data members as part of
106
+ // removing the xds_channel_filter_chain_per_route experiment.
107
+ template <typename T>
108
+ InjectionDecision MakeInjectionDecision(
109
+ const ClientMetadata& initial_metadata, const T& config);
110
+ size_t index_; // The relative index of instances of the same filter.
76
111
  const size_t service_config_parser_index_;
112
+
113
+ const RefCountedPtr<const Config> config_;
114
+
77
115
  Mutex mu_;
78
116
  absl::InsecureBitGen abort_rand_generator_ ABSL_GUARDED_BY(mu_);
79
117
  absl::InsecureBitGen delay_rand_generator_ ABSL_GUARDED_BY(mu_);