grpc 1.78.1 → 1.80.0

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 (426) 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/version.rb +1 -1
  423. data/src/ruby/pb/generate_proto_ruby.sh +1 -1
  424. metadata +42 -6
  425. data/src/core/ext/transport/chttp2/transport/security_frame.cc +0 -31
  426. data/src/core/handshaker/security/legacy_secure_endpoint.cc +0 -597
@@ -1,597 +0,0 @@
1
- //
2
- //
3
- // Copyright 2015 gRPC authors.
4
- //
5
- // Licensed under the Apache License, Version 2.0 (the "License");
6
- // you may not use this file except in compliance with the License.
7
- // You may obtain a copy of the License at
8
- //
9
- // http://www.apache.org/licenses/LICENSE-2.0
10
- //
11
- // Unless required by applicable law or agreed to in writing, software
12
- // distributed under the License is distributed on an "AS IS" BASIS,
13
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- // See the License for the specific language governing permissions and
15
- // limitations under the License.
16
- //
17
- //
18
-
19
- #include <grpc/event_engine/memory_allocator.h>
20
- #include <grpc/event_engine/memory_request.h>
21
- #include <grpc/slice.h>
22
- #include <grpc/slice_buffer.h>
23
- #include <grpc/support/alloc.h>
24
- #include <grpc/support/atm.h>
25
- #include <grpc/support/port_platform.h>
26
- #include <grpc/support/sync.h>
27
- #include <inttypes.h>
28
-
29
- #include <algorithm>
30
- #include <atomic>
31
- #include <memory>
32
- #include <optional>
33
- #include <utility>
34
-
35
- #include "src/core/handshaker/security/secure_endpoint.h"
36
- #include "src/core/lib/debug/trace.h"
37
- #include "src/core/lib/experiments/experiments.h"
38
- #include "src/core/lib/iomgr/closure.h"
39
- #include "src/core/lib/iomgr/endpoint.h"
40
- #include "src/core/lib/iomgr/error.h"
41
- #include "src/core/lib/iomgr/exec_ctx.h"
42
- #include "src/core/lib/iomgr/iomgr_fwd.h"
43
- #include "src/core/lib/resource_quota/api.h"
44
- #include "src/core/lib/resource_quota/memory_quota.h"
45
- #include "src/core/lib/resource_quota/resource_quota.h"
46
- #include "src/core/lib/slice/slice.h"
47
- #include "src/core/lib/slice/slice_string_helpers.h"
48
- #include "src/core/tsi/transport_security_grpc.h"
49
- #include "src/core/tsi/transport_security_interface.h"
50
- #include "src/core/util/debug_location.h"
51
- #include "src/core/util/grpc_check.h"
52
- #include "src/core/util/orphanable.h"
53
- #include "src/core/util/ref_counted_ptr.h"
54
- #include "src/core/util/string.h"
55
- #include "src/core/util/sync.h"
56
- #include "absl/base/thread_annotations.h"
57
- #include "absl/log/log.h"
58
- #include "absl/status/status.h"
59
- #include "absl/strings/string_view.h"
60
-
61
- #define STAGING_BUFFER_SIZE 8192
62
-
63
- static void on_read(void* user_data, grpc_error_handle error);
64
- static void on_write(void* user_data, grpc_error_handle error);
65
-
66
- namespace {
67
- struct secure_endpoint : public grpc_endpoint {
68
- secure_endpoint(const grpc_endpoint_vtable* vtbl,
69
- tsi_frame_protector* protector,
70
- tsi_zero_copy_grpc_protector* zero_copy_protector,
71
- grpc_core::OrphanablePtr<grpc_endpoint> endpoint,
72
- grpc_slice* leftover_slices,
73
- const grpc_channel_args* channel_args,
74
- size_t leftover_nslices)
75
- : wrapped_ep(std::move(endpoint)),
76
- protector(protector),
77
- zero_copy_protector(zero_copy_protector) {
78
- this->vtable = vtbl;
79
- gpr_mu_init(&protector_mu);
80
- GRPC_CLOSURE_INIT(&on_read, ::on_read, this, grpc_schedule_on_exec_ctx);
81
- GRPC_CLOSURE_INIT(&on_write, ::on_write, this, grpc_schedule_on_exec_ctx);
82
- grpc_slice_buffer_init(&source_buffer);
83
- grpc_slice_buffer_init(&leftover_bytes);
84
- for (size_t i = 0; i < leftover_nslices; i++) {
85
- grpc_slice_buffer_add(&leftover_bytes,
86
- grpc_core::CSliceRef(leftover_slices[i]));
87
- }
88
- grpc_slice_buffer_init(&output_buffer);
89
- memory_owner = grpc_core::ResourceQuotaFromChannelArgs(channel_args)
90
- ->memory_quota()
91
- ->CreateMemoryOwner();
92
- self_reservation = memory_owner.MakeReservation(sizeof(*this));
93
- if (zero_copy_protector) {
94
- read_staging_buffer = grpc_empty_slice();
95
- write_staging_buffer = grpc_empty_slice();
96
- } else {
97
- read_staging_buffer =
98
- memory_owner.MakeSlice(grpc_core::MemoryRequest(STAGING_BUFFER_SIZE));
99
- write_staging_buffer =
100
- memory_owner.MakeSlice(grpc_core::MemoryRequest(STAGING_BUFFER_SIZE));
101
- }
102
- has_posted_reclaimer.store(false, std::memory_order_relaxed);
103
- min_progress_size = 1;
104
- grpc_slice_buffer_init(&protector_staging_buffer);
105
- gpr_ref_init(&ref, 1);
106
- }
107
-
108
- ~secure_endpoint() {
109
- tsi_frame_protector_destroy(protector);
110
- tsi_zero_copy_grpc_protector_destroy(zero_copy_protector);
111
- grpc_slice_buffer_destroy(&source_buffer);
112
- grpc_slice_buffer_destroy(&leftover_bytes);
113
- grpc_core::CSliceUnref(read_staging_buffer);
114
- grpc_core::CSliceUnref(write_staging_buffer);
115
- grpc_slice_buffer_destroy(&output_buffer);
116
- grpc_slice_buffer_destroy(&protector_staging_buffer);
117
- gpr_mu_destroy(&protector_mu);
118
- }
119
-
120
- grpc_core::OrphanablePtr<grpc_endpoint> wrapped_ep;
121
- struct tsi_frame_protector* protector;
122
- struct tsi_zero_copy_grpc_protector* zero_copy_protector;
123
- gpr_mu protector_mu;
124
- grpc_core::Mutex read_mu;
125
- grpc_core::Mutex write_mu;
126
- // saved upper level callbacks and user_data.
127
- grpc_closure* read_cb = nullptr;
128
- grpc_closure* write_cb = nullptr;
129
- grpc_closure on_read;
130
- grpc_closure on_write;
131
- grpc_slice_buffer* read_buffer = nullptr;
132
- grpc_slice_buffer source_buffer;
133
- // saved handshaker leftover data to unprotect.
134
- grpc_slice_buffer leftover_bytes;
135
- // buffers for read and write
136
- grpc_slice read_staging_buffer ABSL_GUARDED_BY(read_mu);
137
- grpc_slice write_staging_buffer ABSL_GUARDED_BY(write_mu);
138
- grpc_slice_buffer output_buffer;
139
- grpc_core::MemoryOwner memory_owner;
140
- grpc_core::MemoryAllocator::Reservation self_reservation;
141
- std::atomic<bool> has_posted_reclaimer;
142
- int min_progress_size;
143
- grpc_slice_buffer protector_staging_buffer;
144
- gpr_refcount ref;
145
- };
146
- } // namespace
147
-
148
- static void destroy(secure_endpoint* ep) { delete ep; }
149
-
150
- #ifndef NDEBUG
151
- #define SECURE_ENDPOINT_UNREF(ep, reason) \
152
- secure_endpoint_unref((ep), (reason), __FILE__, __LINE__)
153
- #define SECURE_ENDPOINT_REF(ep, reason) \
154
- secure_endpoint_ref((ep), (reason), __FILE__, __LINE__)
155
- static void secure_endpoint_unref(secure_endpoint* ep, const char* reason,
156
- const char* file, int line) {
157
- if (GRPC_TRACE_FLAG_ENABLED(secure_endpoint)) {
158
- gpr_atm val = gpr_atm_no_barrier_load(&ep->ref.count);
159
- VLOG(2).AtLocation(file, line) << "SECENDP unref " << ep << " : " << reason
160
- << " " << val << " -> " << val - 1;
161
- }
162
- if (gpr_unref(&ep->ref)) {
163
- destroy(ep);
164
- }
165
- }
166
-
167
- static void secure_endpoint_ref(secure_endpoint* ep, const char* reason,
168
- const char* file, int line) {
169
- if (GRPC_TRACE_FLAG_ENABLED(secure_endpoint)) {
170
- gpr_atm val = gpr_atm_no_barrier_load(&ep->ref.count);
171
- VLOG(2).AtLocation(file, line) << "SECENDP ref " << ep << " : " << reason
172
- << " " << val << " -> " << val + 1;
173
- }
174
- gpr_ref(&ep->ref);
175
- }
176
- #else
177
- #define SECURE_ENDPOINT_UNREF(ep, reason) secure_endpoint_unref((ep))
178
- #define SECURE_ENDPOINT_REF(ep, reason) secure_endpoint_ref((ep))
179
- static void secure_endpoint_unref(secure_endpoint* ep) {
180
- if (gpr_unref(&ep->ref)) {
181
- destroy(ep);
182
- }
183
- }
184
-
185
- static void secure_endpoint_ref(secure_endpoint* ep) { gpr_ref(&ep->ref); }
186
- #endif
187
-
188
- static void maybe_post_reclaimer(secure_endpoint* ep) {
189
- if (!ep->has_posted_reclaimer) {
190
- SECURE_ENDPOINT_REF(ep, "benign_reclaimer");
191
- ep->has_posted_reclaimer.exchange(true, std::memory_order_relaxed);
192
- ep->memory_owner.PostReclaimer(
193
- grpc_core::ReclamationPass::kBenign,
194
- [ep](std::optional<grpc_core::ReclamationSweep> sweep) {
195
- if (sweep.has_value()) {
196
- GRPC_TRACE_LOG(resource_quota, INFO)
197
- << "secure endpoint: benign reclamation to free memory";
198
- grpc_slice temp_read_slice;
199
- grpc_slice temp_write_slice;
200
-
201
- ep->read_mu.Lock();
202
- temp_read_slice = ep->read_staging_buffer;
203
- ep->read_staging_buffer = grpc_empty_slice();
204
- ep->read_mu.Unlock();
205
-
206
- ep->write_mu.Lock();
207
- temp_write_slice = ep->write_staging_buffer;
208
- ep->write_staging_buffer = grpc_empty_slice();
209
- ep->write_mu.Unlock();
210
-
211
- grpc_core::CSliceUnref(temp_read_slice);
212
- grpc_core::CSliceUnref(temp_write_slice);
213
- ep->has_posted_reclaimer.exchange(false, std::memory_order_relaxed);
214
- }
215
- SECURE_ENDPOINT_UNREF(ep, "benign_reclaimer");
216
- });
217
- }
218
- }
219
-
220
- static void flush_read_staging_buffer(secure_endpoint* ep, uint8_t** cur,
221
- uint8_t** end)
222
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(ep->read_mu) {
223
- grpc_slice_buffer_add_indexed(ep->read_buffer, ep->read_staging_buffer);
224
- ep->read_staging_buffer =
225
- ep->memory_owner.MakeSlice(grpc_core::MemoryRequest(STAGING_BUFFER_SIZE));
226
- *cur = GRPC_SLICE_START_PTR(ep->read_staging_buffer);
227
- *end = GRPC_SLICE_END_PTR(ep->read_staging_buffer);
228
- }
229
-
230
- static void call_read_cb(secure_endpoint* ep, grpc_error_handle error) {
231
- if (GRPC_TRACE_FLAG_ENABLED(secure_endpoint) && ABSL_VLOG_IS_ON(2)) {
232
- size_t i;
233
- for (i = 0; i < ep->read_buffer->count; i++) {
234
- char* data = grpc_dump_slice(ep->read_buffer->slices[i],
235
- GPR_DUMP_HEX | GPR_DUMP_ASCII);
236
- VLOG(2) << "READ " << ep << ": " << data;
237
- gpr_free(data);
238
- }
239
- }
240
- ep->read_buffer = nullptr;
241
- grpc_core::ExecCtx::Run(DEBUG_LOCATION, ep->read_cb, error);
242
- SECURE_ENDPOINT_UNREF(ep, "read");
243
- }
244
-
245
- static void on_read(void* user_data, grpc_error_handle error) {
246
- unsigned i;
247
- uint8_t keep_looping = 0;
248
- tsi_result result = TSI_OK;
249
- secure_endpoint* ep = static_cast<secure_endpoint*>(user_data);
250
-
251
- {
252
- grpc_core::MutexLock l(&ep->read_mu);
253
-
254
- // If we were shut down after this callback was scheduled with OK
255
- // status but before it was invoked, we need to treat that as an error.
256
- if (ep->wrapped_ep == nullptr && error.ok()) {
257
- error = absl::CancelledError("secure endpoint shutdown");
258
- }
259
-
260
- uint8_t* cur = GRPC_SLICE_START_PTR(ep->read_staging_buffer);
261
- uint8_t* end = GRPC_SLICE_END_PTR(ep->read_staging_buffer);
262
-
263
- if (!error.ok()) {
264
- grpc_slice_buffer_reset_and_unref(ep->read_buffer);
265
- } else if (ep->zero_copy_protector != nullptr) {
266
- // Use zero-copy grpc protector to unprotect.
267
- int min_progress_size = 1;
268
- // Get the size of the last frame which is not yet fully decrypted.
269
- // This estimated frame size is stored in ep->min_progress_size which is
270
- // passed to the TCP layer to indicate the minimum number of
271
- // bytes that need to be read to make meaningful progress. This would
272
- // avoid reading of small slices from the network.
273
- // TODO(vigneshbabu): Set min_progress_size in the regular (non-zero-copy)
274
- // frame protector code path as well.
275
- result = tsi_zero_copy_grpc_protector_unprotect(
276
- ep->zero_copy_protector, &ep->source_buffer, ep->read_buffer,
277
- &min_progress_size);
278
- min_progress_size = std::max(1, min_progress_size);
279
- ep->min_progress_size = result != TSI_OK ? 1 : min_progress_size;
280
- } else {
281
- // Use frame protector to unprotect.
282
- // TODO(yangg) check error, maybe bail out early
283
- for (i = 0; i < ep->source_buffer.count; i++) {
284
- grpc_slice encrypted = ep->source_buffer.slices[i];
285
- uint8_t* message_bytes = GRPC_SLICE_START_PTR(encrypted);
286
- size_t message_size = GRPC_SLICE_LENGTH(encrypted);
287
-
288
- while (message_size > 0 || keep_looping) {
289
- size_t unprotected_buffer_size_written =
290
- static_cast<size_t>(end - cur);
291
- size_t processed_message_size = message_size;
292
- if (grpc_core::IsTsiFrameProtectorWithoutLocksEnabled()) {
293
- result = tsi_frame_protector_unprotect(
294
- ep->protector, message_bytes, &processed_message_size, cur,
295
- &unprotected_buffer_size_written);
296
- } else {
297
- gpr_mu_lock(&ep->protector_mu);
298
- result = tsi_frame_protector_unprotect(
299
- ep->protector, message_bytes, &processed_message_size, cur,
300
- &unprotected_buffer_size_written);
301
- gpr_mu_unlock(&ep->protector_mu);
302
- }
303
- if (result != TSI_OK) {
304
- LOG(ERROR) << "Decryption error: " << tsi_result_to_string(result);
305
- break;
306
- }
307
- message_bytes += processed_message_size;
308
- message_size -= processed_message_size;
309
- cur += unprotected_buffer_size_written;
310
-
311
- if (cur == end) {
312
- flush_read_staging_buffer(ep, &cur, &end);
313
- // Force to enter the loop again to extract buffered bytes in
314
- // protector. The bytes could be buffered because of running out of
315
- // staging_buffer. If this happens at the end of all slices, doing
316
- // another unprotect avoids leaving data in the protector.
317
- keep_looping = 1;
318
- } else if (unprotected_buffer_size_written > 0) {
319
- keep_looping = 1;
320
- } else {
321
- keep_looping = 0;
322
- }
323
- }
324
- if (result != TSI_OK) break;
325
- }
326
-
327
- if (cur != GRPC_SLICE_START_PTR(ep->read_staging_buffer)) {
328
- grpc_slice_buffer_add(
329
- ep->read_buffer,
330
- grpc_slice_split_head(
331
- &ep->read_staging_buffer,
332
- static_cast<size_t>(
333
- cur - GRPC_SLICE_START_PTR(ep->read_staging_buffer))));
334
- }
335
- }
336
- }
337
-
338
- if (!error.ok()) {
339
- call_read_cb(
340
- ep, GRPC_ERROR_CREATE_REFERENCING("Secure read failed", &error, 1));
341
- return;
342
- }
343
-
344
- // TODO(yangg) experiment with moving this block after read_cb to see if it
345
- // helps latency
346
- grpc_slice_buffer_reset_and_unref(&ep->source_buffer);
347
-
348
- if (result != TSI_OK) {
349
- grpc_slice_buffer_reset_and_unref(ep->read_buffer);
350
- call_read_cb(
351
- ep, GRPC_ERROR_CREATE(absl::StrCat("Unwrap failed (",
352
- tsi_result_to_string(result), ")")));
353
- return;
354
- }
355
-
356
- call_read_cb(ep, absl::OkStatus());
357
- }
358
-
359
- static void endpoint_read(grpc_endpoint* secure_ep, grpc_slice_buffer* slices,
360
- grpc_closure* cb, bool urgent,
361
- int /*min_progress_size*/) {
362
- secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
363
- ep->read_cb = cb;
364
- ep->read_buffer = slices;
365
- grpc_slice_buffer_reset_and_unref(ep->read_buffer);
366
-
367
- SECURE_ENDPOINT_REF(ep, "read");
368
- if (ep->leftover_bytes.count) {
369
- grpc_slice_buffer_swap(&ep->leftover_bytes, &ep->source_buffer);
370
- GRPC_CHECK_EQ(ep->leftover_bytes.count, 0u);
371
- on_read(ep, absl::OkStatus());
372
- return;
373
- }
374
-
375
- grpc_endpoint_read(ep->wrapped_ep.get(), &ep->source_buffer, &ep->on_read,
376
- urgent, /*min_progress_size=*/ep->min_progress_size);
377
- }
378
-
379
- static void flush_write_staging_buffer(secure_endpoint* ep, uint8_t** cur,
380
- uint8_t** end)
381
- ABSL_EXCLUSIVE_LOCKS_REQUIRED(ep->write_mu) {
382
- grpc_slice_buffer_add_indexed(&ep->output_buffer, ep->write_staging_buffer);
383
- ep->write_staging_buffer =
384
- ep->memory_owner.MakeSlice(grpc_core::MemoryRequest(STAGING_BUFFER_SIZE));
385
- *cur = GRPC_SLICE_START_PTR(ep->write_staging_buffer);
386
- *end = GRPC_SLICE_END_PTR(ep->write_staging_buffer);
387
- maybe_post_reclaimer(ep);
388
- }
389
-
390
- static void on_write(void* user_data, grpc_error_handle error) {
391
- secure_endpoint* ep = static_cast<secure_endpoint*>(user_data);
392
- grpc_closure* cb = ep->write_cb;
393
- ep->write_cb = nullptr;
394
- SECURE_ENDPOINT_UNREF(ep, "write");
395
- grpc_core::EnsureRunInExecCtx([cb, error = std::move(error)]() {
396
- grpc_core::Closure::Run(DEBUG_LOCATION, cb, error);
397
- });
398
- }
399
-
400
- static void endpoint_write(
401
- grpc_endpoint* secure_ep, grpc_slice_buffer* slices, grpc_closure* cb,
402
- grpc_event_engine::experimental::EventEngine::Endpoint::WriteArgs args) {
403
- GRPC_LATENT_SEE_ALWAYS_ON_SCOPE("secure_endpoint write");
404
- unsigned i;
405
- tsi_result result = TSI_OK;
406
- secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
407
-
408
- {
409
- grpc_core::MutexLock l(&ep->write_mu);
410
- uint8_t* cur = GRPC_SLICE_START_PTR(ep->write_staging_buffer);
411
- uint8_t* end = GRPC_SLICE_END_PTR(ep->write_staging_buffer);
412
-
413
- grpc_slice_buffer_reset_and_unref(&ep->output_buffer);
414
-
415
- if (GRPC_TRACE_FLAG_ENABLED(secure_endpoint) && ABSL_VLOG_IS_ON(2)) {
416
- for (i = 0; i < slices->count; i++) {
417
- char* data =
418
- grpc_dump_slice(slices->slices[i], GPR_DUMP_HEX | GPR_DUMP_ASCII);
419
- VLOG(2) << "WRITE " << ep << ": " << data;
420
- gpr_free(data);
421
- }
422
- }
423
-
424
- if (ep->zero_copy_protector != nullptr) {
425
- // Use zero-copy grpc protector to protect.
426
- result = TSI_OK;
427
- // Break the input slices into chunks of size = max_frame_size and call
428
- // tsi_zero_copy_grpc_protector_protect on each chunk. This ensures that
429
- // the protector cannot create frames larger than the specified
430
- // max_frame_size.
431
- while (slices->length > static_cast<size_t>(args.max_frame_size()) &&
432
- result == TSI_OK) {
433
- grpc_slice_buffer_move_first(slices,
434
- static_cast<size_t>(args.max_frame_size()),
435
- &ep->protector_staging_buffer);
436
- result = tsi_zero_copy_grpc_protector_protect(
437
- ep->zero_copy_protector, &ep->protector_staging_buffer,
438
- &ep->output_buffer);
439
- }
440
- if (result == TSI_OK && slices->length > 0) {
441
- result = tsi_zero_copy_grpc_protector_protect(
442
- ep->zero_copy_protector, slices, &ep->output_buffer);
443
- }
444
- grpc_slice_buffer_reset_and_unref(&ep->protector_staging_buffer);
445
- } else {
446
- // Use frame protector to protect.
447
- for (i = 0; i < slices->count; i++) {
448
- grpc_slice plain = slices->slices[i];
449
- uint8_t* message_bytes = GRPC_SLICE_START_PTR(plain);
450
- size_t message_size = GRPC_SLICE_LENGTH(plain);
451
- while (message_size > 0) {
452
- size_t protected_buffer_size_to_send = static_cast<size_t>(end - cur);
453
- size_t processed_message_size = message_size;
454
- if (grpc_core::IsTsiFrameProtectorWithoutLocksEnabled()) {
455
- result = tsi_frame_protector_protect(
456
- ep->protector, message_bytes, &processed_message_size, cur,
457
- &protected_buffer_size_to_send);
458
- } else {
459
- gpr_mu_lock(&ep->protector_mu);
460
- result = tsi_frame_protector_protect(
461
- ep->protector, message_bytes, &processed_message_size, cur,
462
- &protected_buffer_size_to_send);
463
- gpr_mu_unlock(&ep->protector_mu);
464
- }
465
- if (result != TSI_OK) {
466
- LOG(ERROR) << "Encryption error: " << tsi_result_to_string(result);
467
- break;
468
- }
469
- message_bytes += processed_message_size;
470
- message_size -= processed_message_size;
471
- cur += protected_buffer_size_to_send;
472
-
473
- if (cur == end) {
474
- flush_write_staging_buffer(ep, &cur, &end);
475
- }
476
- }
477
- if (result != TSI_OK) break;
478
- }
479
- if (result == TSI_OK) {
480
- size_t still_pending_size;
481
- do {
482
- size_t protected_buffer_size_to_send = static_cast<size_t>(end - cur);
483
- if (grpc_core::IsTsiFrameProtectorWithoutLocksEnabled()) {
484
- result = tsi_frame_protector_protect_flush(
485
- ep->protector, cur, &protected_buffer_size_to_send,
486
- &still_pending_size);
487
- } else {
488
- gpr_mu_lock(&ep->protector_mu);
489
- result = tsi_frame_protector_protect_flush(
490
- ep->protector, cur, &protected_buffer_size_to_send,
491
- &still_pending_size);
492
- gpr_mu_unlock(&ep->protector_mu);
493
- }
494
- if (result != TSI_OK) break;
495
- cur += protected_buffer_size_to_send;
496
- if (cur == end) {
497
- flush_write_staging_buffer(ep, &cur, &end);
498
- }
499
- } while (still_pending_size > 0);
500
- if (cur != GRPC_SLICE_START_PTR(ep->write_staging_buffer)) {
501
- grpc_slice_buffer_add(
502
- &ep->output_buffer,
503
- grpc_slice_split_head(
504
- &ep->write_staging_buffer,
505
- static_cast<size_t>(
506
- cur - GRPC_SLICE_START_PTR(ep->write_staging_buffer))));
507
- }
508
- }
509
- }
510
- }
511
-
512
- if (result != TSI_OK) {
513
- // TODO(yangg) do different things according to the error type?
514
- grpc_slice_buffer_reset_and_unref(&ep->output_buffer);
515
- grpc_core::ExecCtx::Run(
516
- DEBUG_LOCATION, cb,
517
- GRPC_ERROR_CREATE(
518
- absl::StrCat("Wrap failed (", tsi_result_to_string(result), ")")));
519
- return;
520
- }
521
-
522
- // Need to hold a ref here, because the wrapped endpoint may access
523
- // output_buffer at any time until the write completes.
524
- SECURE_ENDPOINT_REF(ep, "write");
525
- ep->write_cb = cb;
526
- grpc_endpoint_write(ep->wrapped_ep.get(), &ep->output_buffer, &ep->on_write,
527
- std::move(args));
528
- }
529
-
530
- static void endpoint_destroy(grpc_endpoint* secure_ep) {
531
- secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
532
- ep->read_mu.Lock();
533
- ep->wrapped_ep.reset();
534
- ep->memory_owner.Reset();
535
- ep->read_mu.Unlock();
536
- SECURE_ENDPOINT_UNREF(ep, "destroy");
537
- }
538
-
539
- static void endpoint_add_to_pollset(grpc_endpoint* secure_ep,
540
- grpc_pollset* pollset) {
541
- secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
542
- grpc_endpoint_add_to_pollset(ep->wrapped_ep.get(), pollset);
543
- }
544
-
545
- static void endpoint_add_to_pollset_set(grpc_endpoint* secure_ep,
546
- grpc_pollset_set* pollset_set) {
547
- secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
548
- grpc_endpoint_add_to_pollset_set(ep->wrapped_ep.get(), pollset_set);
549
- }
550
-
551
- static void endpoint_delete_from_pollset_set(grpc_endpoint* secure_ep,
552
- grpc_pollset_set* pollset_set) {
553
- secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
554
- grpc_endpoint_delete_from_pollset_set(ep->wrapped_ep.get(), pollset_set);
555
- }
556
-
557
- static absl::string_view endpoint_get_peer(grpc_endpoint* secure_ep) {
558
- secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
559
- return grpc_endpoint_get_peer(ep->wrapped_ep.get());
560
- }
561
-
562
- static absl::string_view endpoint_get_local_address(grpc_endpoint* secure_ep) {
563
- secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
564
- return grpc_endpoint_get_local_address(ep->wrapped_ep.get());
565
- }
566
-
567
- static int endpoint_get_fd(grpc_endpoint* secure_ep) {
568
- secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
569
- return grpc_endpoint_get_fd(ep->wrapped_ep.get());
570
- }
571
-
572
- static bool endpoint_can_track_err(grpc_endpoint* secure_ep) {
573
- secure_endpoint* ep = reinterpret_cast<secure_endpoint*>(secure_ep);
574
- return grpc_endpoint_can_track_err(ep->wrapped_ep.get());
575
- }
576
-
577
- static const grpc_endpoint_vtable vtable = {endpoint_read,
578
- endpoint_write,
579
- endpoint_add_to_pollset,
580
- endpoint_add_to_pollset_set,
581
- endpoint_delete_from_pollset_set,
582
- endpoint_destroy,
583
- endpoint_get_peer,
584
- endpoint_get_local_address,
585
- endpoint_get_fd,
586
- endpoint_can_track_err};
587
-
588
- grpc_core::OrphanablePtr<grpc_endpoint> grpc_legacy_secure_endpoint_create(
589
- struct tsi_frame_protector* protector,
590
- struct tsi_zero_copy_grpc_protector* zero_copy_protector,
591
- grpc_core::OrphanablePtr<grpc_endpoint> to_wrap,
592
- grpc_slice* leftover_slices, const grpc_channel_args* channel_args,
593
- size_t leftover_nslices) {
594
- return grpc_core::MakeOrphanable<secure_endpoint>(
595
- &vtable, protector, zero_copy_protector, std::move(to_wrap),
596
- leftover_slices, channel_args, leftover_nslices);
597
- }