grpc 1.48.0 → 1.49.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (715) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +104 -41
  3. data/include/grpc/event_engine/event_engine.h +19 -16
  4. data/include/grpc/impl/codegen/grpc_types.h +3 -8
  5. data/include/grpc/impl/codegen/port_platform.h +0 -8
  6. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +3 -3
  7. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +2 -2
  8. data/src/core/ext/filters/client_channel/client_channel.cc +117 -200
  9. data/src/core/ext/filters/client_channel/client_channel.h +15 -8
  10. data/src/core/ext/filters/client_channel/client_channel_factory.cc +0 -29
  11. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -10
  12. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  13. data/src/core/ext/filters/client_channel/config_selector.h +12 -4
  14. data/src/core/ext/filters/client_channel/connector.h +4 -5
  15. data/src/core/ext/filters/client_channel/http_proxy.cc +53 -65
  16. data/src/core/ext/filters/client_channel/http_proxy.h +12 -9
  17. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +14 -12
  18. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +6 -6
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +100 -124
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +12 -3
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +5 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +1 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -2
  24. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +169 -63
  26. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +25 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +15 -19
  28. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +66 -78
  29. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +44 -44
  30. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +6 -5
  31. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +65 -77
  32. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +15 -14
  33. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +19 -14
  34. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +60 -67
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +40 -49
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +81 -97
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +53 -61
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +171 -102
  39. data/src/core/ext/filters/client_channel/proxy_mapper.h +13 -14
  40. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +19 -16
  41. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +8 -7
  42. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +4 -8
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +431 -145
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +170 -99
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +20 -7
  46. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -15
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +7 -17
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +11 -0
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +13 -14
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
  51. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +5 -6
  52. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -13
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +162 -165
  54. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +37 -30
  55. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +7 -10
  56. data/src/core/ext/filters/client_channel/retry_filter.cc +0 -7
  57. data/src/core/ext/filters/client_channel/retry_service_config.cc +30 -19
  58. data/src/core/ext/filters/client_channel/retry_service_config.h +6 -9
  59. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +6 -7
  60. data/src/core/ext/filters/client_channel/subchannel.cc +49 -89
  61. data/src/core/ext/filters/client_channel/subchannel.h +8 -8
  62. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +1 -1
  63. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +6 -76
  64. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +16 -25
  65. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +3 -4
  66. data/src/core/ext/filters/deadline/deadline_filter.cc +6 -6
  67. data/src/core/ext/filters/deadline/deadline_filter.h +2 -3
  68. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -3
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +1 -1
  70. data/src/core/ext/filters/fault_injection/service_config_parser.cc +17 -12
  71. data/src/core/ext/filters/fault_injection/service_config_parser.h +4 -5
  72. data/src/core/ext/filters/http/client/http_client_filter.cc +2 -3
  73. data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
  74. data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
  75. data/src/core/ext/filters/http/client_authority_filter.h +1 -1
  76. data/src/core/ext/filters/http/server/http_server_filter.cc +2 -3
  77. data/src/core/ext/filters/http/server/http_server_filter.h +1 -1
  78. data/src/core/ext/filters/message_size/message_size_filter.cc +13 -7
  79. data/src/core/ext/filters/message_size/message_size_filter.h +3 -6
  80. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +16 -12
  81. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -6
  82. data/src/core/ext/filters/server_config_selector/server_config_selector.h +5 -0
  83. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +3 -5
  84. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +35 -62
  85. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +62 -89
  86. data/src/core/ext/transport/chttp2/server/chttp2_server.h +4 -6
  87. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +130 -165
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -2
  89. data/src/core/ext/transport/chttp2/transport/flow_control.cc +67 -2
  90. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
  91. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +7 -1
  92. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +25 -8
  93. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -0
  94. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +0 -1
  95. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +8 -2
  96. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -10
  97. data/src/core/ext/transport/chttp2/transport/internal.h +2 -1
  98. data/src/core/ext/transport/inproc/inproc_transport.cc +40 -74
  99. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +5 -5
  100. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +30 -10
  101. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +4 -4
  102. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +24 -8
  103. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +8 -327
  104. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +83 -1723
  105. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +352 -0
  106. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +1768 -0
  107. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +2 -2
  108. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +12 -4
  109. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +6 -4
  110. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +33 -4
  111. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +1 -1
  112. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +6 -2
  113. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +1 -1
  114. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +6 -2
  115. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +6 -2
  116. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +12 -4
  117. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +1 -1
  118. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +6 -2
  119. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  120. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -3
  121. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +14 -14
  122. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +90 -30
  123. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +21 -19
  124. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +124 -34
  125. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +3 -3
  126. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +18 -6
  127. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +23 -22
  128. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +153 -48
  129. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +1 -1
  130. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +6 -2
  131. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +1 -1
  132. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +6 -2
  133. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +11 -11
  134. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +84 -28
  135. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +7 -7
  136. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +42 -14
  137. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +1 -1
  138. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +6 -2
  139. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +25 -23
  140. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +156 -48
  141. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +7 -7
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +42 -14
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  144. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +6 -2
  145. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +1 -1
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +6 -2
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +2 -2
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +12 -4
  149. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +12 -12
  150. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +78 -26
  151. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +9 -9
  152. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +54 -18
  153. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +1 -1
  154. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +6 -2
  155. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +21 -20
  156. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +117 -44
  157. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -1
  158. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +6 -2
  159. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +2 -2
  160. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +12 -4
  161. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +6 -2
  162. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +1 -1
  163. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +6 -2
  164. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +1 -1
  165. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +6 -2
  166. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +3 -3
  167. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +18 -6
  168. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +5 -5
  169. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +36 -12
  170. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +3 -3
  171. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +30 -10
  172. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +1 -1
  173. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +6 -2
  174. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +37 -13
  175. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +170 -15
  176. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +5 -5
  177. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +42 -14
  178. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +1 -1
  179. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +6 -2
  180. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +7 -4
  181. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +36 -4
  182. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +1 -1
  183. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +6 -2
  184. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +6 -6
  185. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +48 -16
  186. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +8 -8
  187. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +54 -18
  188. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +21 -9
  189. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +100 -14
  190. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +7 -22
  191. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +36 -77
  192. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +121 -76
  193. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +647 -163
  194. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +3 -3
  195. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +18 -6
  196. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +34 -15
  197. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +161 -22
  198. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +1 -1
  199. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +6 -2
  200. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +1 -1
  201. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +6 -2
  202. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +2 -2
  203. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +12 -4
  204. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +1 -1
  205. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +6 -2
  206. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +1 -1
  207. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +6 -2
  208. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +46 -0
  209. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +98 -0
  210. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +1 -1
  211. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +6 -2
  212. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +2 -2
  213. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +12 -4
  214. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +1 -0
  215. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +1 -0
  216. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +2 -2
  217. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +12 -4
  218. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +1 -1
  219. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +6 -2
  220. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +1 -1
  221. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +6 -2
  222. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +2 -2
  223. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +30 -10
  224. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +2 -2
  225. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +18 -6
  226. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +11 -4
  227. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +58 -4
  228. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +1 -1
  229. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +6 -2
  230. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +35 -27
  231. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +177 -52
  232. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +6 -2
  233. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +1 -1
  234. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +6 -2
  235. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +10 -8
  236. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +66 -14
  237. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +3 -3
  238. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +18 -6
  239. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +5 -5
  240. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +42 -14
  241. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +2 -2
  242. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +12 -4
  243. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  244. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +6 -2
  245. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +131 -16
  246. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +632 -12
  247. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +2 -2
  248. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +12 -4
  249. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +5 -5
  250. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +30 -10
  251. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +1 -1
  252. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +6 -2
  253. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +4 -4
  254. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +24 -8
  255. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +4 -4
  256. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +24 -8
  257. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +2 -2
  258. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +12 -4
  259. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +1 -1
  260. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +6 -2
  261. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  262. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +6 -2
  263. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  264. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +6 -2
  265. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +3 -3
  266. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +18 -6
  267. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +1 -1
  268. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +12 -4
  269. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +2 -2
  270. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +12 -4
  271. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  272. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +18 -6
  273. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  274. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +42 -14
  275. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +5 -5
  276. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +30 -10
  277. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +3 -3
  278. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +18 -6
  279. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +1 -1
  280. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +6 -2
  281. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +12 -4
  282. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +2 -2
  283. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +18 -6
  284. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c +63 -0
  285. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.h +202 -0
  286. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  287. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +6 -2
  288. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +6 -2
  289. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -1
  290. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +11 -11
  291. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +66 -22
  292. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +9 -9
  293. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +72 -24
  294. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  295. data/src/core/ext/upb-generated/google/api/http.upb.h +18 -6
  296. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +1 -1
  297. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +6 -2
  298. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  299. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +6 -2
  300. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +44 -43
  301. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +177 -55
  302. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  303. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +6 -2
  304. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  305. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +6 -2
  306. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +2 -2
  307. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +18 -6
  308. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  309. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +6 -2
  310. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +6 -6
  311. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +54 -18
  312. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  313. data/src/core/ext/upb-generated/google/rpc/status.upb.h +6 -2
  314. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +2 -2
  315. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +24 -8
  316. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +6 -2
  317. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +7 -7
  318. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +60 -20
  319. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +1 -1
  320. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +12 -4
  321. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  322. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +12 -4
  323. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +6 -6
  324. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +54 -18
  325. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +2 -2
  326. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +12 -4
  327. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +7 -7
  328. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +42 -14
  329. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  330. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +23 -11
  331. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +1 -1
  332. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -3
  333. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -3
  334. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  335. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -3
  336. data/src/core/ext/upb-generated/validate/validate.upb.c +22 -22
  337. data/src/core/ext/upb-generated/validate/validate.upb.h +139 -47
  338. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +3 -3
  339. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +23 -11
  340. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +1 -1
  341. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +7 -3
  342. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +3 -3
  343. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +27 -11
  344. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +1 -1
  345. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +7 -3
  346. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  347. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +6 -2
  348. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +2 -2
  349. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +12 -4
  350. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  351. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +6 -2
  352. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +1 -1
  353. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +6 -2
  354. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  355. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +6 -2
  356. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  357. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +12 -4
  358. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  359. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +6 -2
  360. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +6 -2
  361. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +1 -1
  362. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +6 -2
  363. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +6 -6
  364. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +54 -18
  365. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +2 -2
  366. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +12 -4
  367. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +1 -1
  368. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +12 -4
  369. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +1 -1
  370. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +6 -2
  371. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +67 -274
  372. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +0 -85
  373. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +256 -0
  374. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +115 -0
  375. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +14 -11
  376. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +107 -107
  377. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +191 -187
  378. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +156 -154
  379. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +186 -183
  380. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +136 -134
  381. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +16 -16
  382. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +162 -139
  383. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  384. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +39 -31
  385. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +12 -8
  386. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
  387. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +72 -75
  388. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +0 -5
  389. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +713 -670
  390. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +10 -0
  391. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +150 -139
  392. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +5 -0
  393. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +47 -0
  394. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.h +35 -0
  395. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +16 -12
  396. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +46 -25
  397. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +477 -466
  398. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +21 -18
  399. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +153 -84
  400. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +35 -0
  401. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +113 -113
  402. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -28
  403. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c +69 -0
  404. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.h +40 -0
  405. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +92 -90
  406. data/src/core/ext/xds/upb_utils.h +0 -21
  407. data/src/core/ext/xds/xds_api.cc +53 -86
  408. data/src/core/ext/xds/xds_api.h +19 -28
  409. data/src/core/ext/xds/xds_bootstrap.cc +39 -52
  410. data/src/core/ext/xds/xds_bootstrap.h +28 -8
  411. data/src/core/ext/xds/xds_certificate_provider.h +9 -0
  412. data/src/core/ext/xds/xds_channel_stack_modifier.cc +6 -4
  413. data/src/core/ext/xds/xds_channel_stack_modifier.h +8 -0
  414. data/src/core/ext/xds/xds_client.cc +555 -1214
  415. data/src/core/ext/xds/xds_client.h +16 -44
  416. data/src/core/ext/xds/xds_client_grpc.cc +291 -0
  417. data/src/core/ext/xds/xds_client_grpc.h +102 -0
  418. data/src/core/ext/xds/xds_cluster.cc +92 -103
  419. data/src/core/ext/xds/xds_cluster.h +6 -5
  420. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +10 -14
  421. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -0
  422. data/src/core/ext/xds/xds_common_types.cc +134 -110
  423. data/src/core/ext/xds/xds_common_types.h +6 -7
  424. data/src/core/ext/xds/xds_endpoint.cc +80 -80
  425. data/src/core/ext/xds/xds_endpoint.h +4 -4
  426. data/src/core/ext/xds/xds_http_fault_filter.cc +4 -11
  427. data/src/core/ext/xds/xds_http_fault_filter.h +3 -3
  428. data/src/core/ext/xds/xds_http_filters.h +3 -3
  429. data/src/core/ext/xds/xds_http_rbac_filter.cc +39 -58
  430. data/src/core/ext/xds/xds_http_rbac_filter.h +3 -3
  431. data/src/core/ext/xds/xds_lb_policy_registry.cc +17 -20
  432. data/src/core/ext/xds/xds_lb_policy_registry.h +4 -4
  433. data/src/core/ext/xds/xds_listener.cc +329 -299
  434. data/src/core/ext/xds/xds_listener.h +4 -4
  435. data/src/core/ext/xds/xds_resource_type.h +13 -2
  436. data/src/core/ext/xds/xds_route_config.cc +180 -177
  437. data/src/core/ext/xds/xds_route_config.h +31 -17
  438. data/src/core/ext/xds/xds_routing.cc +3 -6
  439. data/src/core/ext/xds/xds_routing.h +7 -9
  440. data/src/core/ext/xds/xds_server_config_fetcher.cc +76 -81
  441. data/src/core/ext/xds/xds_transport.h +86 -0
  442. data/src/core/ext/xds/xds_transport_grpc.cc +349 -0
  443. data/src/core/ext/xds/xds_transport_grpc.h +135 -0
  444. data/src/core/lib/address_utils/parse_address.cc +19 -17
  445. data/src/core/lib/address_utils/parse_address.h +8 -5
  446. data/src/core/lib/avl/avl.h +47 -25
  447. data/src/core/lib/channel/call_tracer.h +1 -1
  448. data/src/core/lib/channel/channel_args.cc +88 -19
  449. data/src/core/lib/channel/channel_args.h +113 -62
  450. data/src/core/lib/channel/channel_stack.cc +0 -1
  451. data/src/core/lib/channel/channel_stack_builder.cc +3 -3
  452. data/src/core/lib/channel/channel_stack_builder.h +2 -2
  453. data/src/core/lib/channel/channel_stack_builder_impl.cc +2 -4
  454. data/src/core/lib/channel/channelz.cc +27 -37
  455. data/src/core/lib/channel/channelz.h +9 -0
  456. data/src/core/lib/channel/promise_based_filter.h +0 -1
  457. data/src/core/lib/config/core_configuration.h +48 -35
  458. data/src/core/lib/debug/stats.cc +12 -15
  459. data/src/core/lib/debug/stats.h +11 -3
  460. data/src/core/lib/event_engine/{event_engine.cc → default_event_engine.cc} +9 -5
  461. data/src/core/lib/event_engine/{event_engine_factory.h → default_event_engine.h} +4 -8
  462. data/src/core/lib/event_engine/default_event_engine_factory.cc +20 -3
  463. data/src/core/lib/event_engine/default_event_engine_factory.h +33 -0
  464. data/src/core/lib/event_engine/executor/executor.h +38 -0
  465. data/src/core/lib/event_engine/executor/threaded_executor.cc +36 -0
  466. data/src/core/lib/event_engine/executor/threaded_executor.h +44 -0
  467. data/src/core/lib/event_engine/forkable.cc +98 -0
  468. data/src/core/lib/event_engine/forkable.h +61 -0
  469. data/src/core/lib/event_engine/poller.h +54 -0
  470. data/src/core/lib/event_engine/{iomgr_engine/iomgr_engine.cc → posix_engine/posix_engine.cc} +30 -47
  471. data/src/core/lib/event_engine/{iomgr_engine/iomgr_engine.h → posix_engine/posix_engine.h} +27 -28
  472. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer.cc +4 -5
  473. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer.h +8 -8
  474. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_heap.cc +4 -4
  475. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_heap.h +5 -5
  476. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_manager.cc +46 -10
  477. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_manager.h +17 -8
  478. data/src/core/lib/event_engine/promise.h +11 -2
  479. data/src/core/lib/event_engine/socket_notifier.h +55 -0
  480. data/src/core/lib/event_engine/{iomgr_engine/thread_pool.cc → thread_pool.cc} +49 -14
  481. data/src/core/lib/event_engine/{iomgr_engine/thread_pool.h → thread_pool.h} +21 -10
  482. data/src/core/lib/event_engine/utils.cc +49 -0
  483. data/src/core/lib/event_engine/utils.h +40 -0
  484. data/src/core/lib/event_engine/windows/iocp.cc +149 -0
  485. data/src/core/lib/event_engine/windows/iocp.h +68 -0
  486. data/src/core/lib/event_engine/windows/win_socket.cc +196 -0
  487. data/src/core/lib/event_engine/windows/win_socket.h +120 -0
  488. data/src/core/lib/event_engine/windows/windows_engine.cc +159 -0
  489. data/src/core/lib/event_engine/windows/windows_engine.h +120 -0
  490. data/src/core/lib/gpr/time.cc +11 -9
  491. data/src/core/lib/gpr/useful.h +29 -0
  492. data/src/core/lib/gprpp/bitset.h +3 -13
  493. data/src/core/lib/gprpp/debug_location.h +39 -7
  494. data/src/core/lib/gprpp/manual_constructor.h +0 -1
  495. data/src/core/lib/gprpp/no_destruct.h +94 -0
  496. data/src/core/lib/gprpp/ref_counted_ptr.h +0 -1
  497. data/src/core/lib/gprpp/status_helper.cc +1 -0
  498. data/src/core/lib/gprpp/table.h +0 -1
  499. data/src/core/lib/{event_engine/iomgr_engine → gprpp}/time_averaged_stats.cc +3 -5
  500. data/src/core/lib/{event_engine/iomgr_engine → gprpp}/time_averaged_stats.h +5 -7
  501. data/src/core/lib/{iomgr → gprpp}/work_serializer.cc +34 -18
  502. data/src/core/lib/{iomgr → gprpp}/work_serializer.h +21 -27
  503. data/src/core/lib/http/httpcli.cc +12 -24
  504. data/src/core/lib/http/httpcli_security_connector.cc +11 -11
  505. data/src/core/lib/iomgr/call_combiner.cc +0 -26
  506. data/src/core/lib/iomgr/closure.h +0 -9
  507. data/src/core/lib/iomgr/combiner.cc +0 -20
  508. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
  509. data/src/core/lib/iomgr/error.cc +0 -773
  510. data/src/core/lib/iomgr/error.h +0 -145
  511. data/src/core/lib/iomgr/error_cfstream.cc +0 -5
  512. data/src/core/lib/iomgr/ev_poll_posix.cc +17 -9
  513. data/src/core/lib/iomgr/exec_ctx.cc +0 -12
  514. data/src/core/lib/iomgr/executor.cc +0 -10
  515. data/src/core/lib/iomgr/executor.h +0 -3
  516. data/src/core/lib/iomgr/lockfree_event.cc +0 -17
  517. data/src/core/lib/iomgr/port.h +3 -0
  518. data/src/core/lib/iomgr/resolve_address.h +29 -6
  519. data/src/core/lib/iomgr/resolve_address_posix.cc +38 -8
  520. data/src/core/lib/iomgr/resolve_address_posix.h +19 -5
  521. data/src/core/lib/iomgr/resolve_address_windows.cc +40 -10
  522. data/src/core/lib/iomgr/resolve_address_windows.h +19 -5
  523. data/src/core/lib/iomgr/socket_windows.h +0 -2
  524. data/src/core/lib/iomgr/tcp_posix.cc +118 -6
  525. data/src/core/lib/iomgr/timer_generic.cc +6 -8
  526. data/src/core/lib/json/json.h +19 -22
  527. data/src/core/lib/json/json_args.h +34 -0
  528. data/src/core/lib/json/json_object_loader.cc +233 -0
  529. data/src/core/lib/json/json_object_loader.h +618 -0
  530. data/src/core/lib/json/json_reader.cc +86 -62
  531. data/src/core/lib/json/json_util.cc +8 -36
  532. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.cc +3 -44
  533. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.h +15 -24
  534. data/src/core/lib/load_balancing/lb_policy_factory.h +49 -0
  535. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy_registry.cc +49 -72
  536. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy_registry.h +27 -27
  537. data/src/core/{ext/filters/client_channel → lib/load_balancing}/subchannel_interface.h +6 -6
  538. data/src/core/lib/promise/activity.h +56 -8
  539. data/src/core/lib/promise/arena_promise.h +84 -81
  540. data/src/core/lib/promise/context.h +0 -1
  541. data/src/core/lib/promise/detail/basic_seq.h +43 -23
  542. data/src/core/lib/promise/detail/promise_factory.h +0 -1
  543. data/src/core/lib/promise/map.h +0 -1
  544. data/src/core/lib/promise/seq.h +25 -4
  545. data/src/core/lib/promise/sleep.cc +38 -42
  546. data/src/core/lib/promise/sleep.h +27 -24
  547. data/src/core/lib/promise/try_seq.h +26 -6
  548. data/src/core/lib/resolver/resolver.cc +0 -47
  549. data/src/core/lib/resolver/resolver.h +2 -12
  550. data/src/core/lib/resolver/resolver_factory.h +2 -3
  551. data/src/core/lib/resolver/resolver_registry.cc +1 -1
  552. data/src/core/lib/resolver/resolver_registry.h +2 -3
  553. data/src/core/lib/resolver/server_address.cc +11 -15
  554. data/src/core/lib/resolver/server_address.h +4 -8
  555. data/src/core/lib/resource_quota/api.cc +1 -1
  556. data/src/core/lib/resource_quota/arena.cc +21 -1
  557. data/src/core/lib/resource_quota/arena.h +24 -2
  558. data/src/core/lib/resource_quota/memory_quota.cc +157 -17
  559. data/src/core/lib/resource_quota/memory_quota.h +98 -17
  560. data/src/core/lib/resource_quota/periodic_update.cc +79 -0
  561. data/src/core/lib/resource_quota/periodic_update.h +71 -0
  562. data/src/core/lib/security/authorization/evaluate_args.cc +10 -7
  563. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
  564. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -1
  565. data/src/core/lib/security/authorization/matchers.cc +13 -10
  566. data/src/core/lib/security/authorization/rbac_policy.cc +0 -1
  567. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -3
  568. data/src/core/lib/security/credentials/alts/alts_credentials.h +3 -4
  569. data/src/core/lib/security/credentials/composite/composite_credentials.cc +3 -7
  570. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -4
  571. data/src/core/lib/security/credentials/credentials.h +16 -12
  572. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +18 -11
  573. data/src/core/lib/security/credentials/external/external_account_credentials.cc +32 -23
  574. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -6
  575. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -6
  576. data/src/core/lib/security/credentials/fake/fake_credentials.cc +3 -12
  577. data/src/core/lib/security/credentials/fake/fake_credentials.h +0 -4
  578. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +29 -26
  579. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +1 -3
  580. data/src/core/lib/security/credentials/iam/iam_credentials.cc +0 -1
  581. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +3 -3
  582. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +3 -4
  583. data/src/core/lib/security/credentials/jwt/json_token.cc +12 -3
  584. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +4 -8
  585. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +11 -13
  586. data/src/core/lib/security/credentials/local/local_credentials.cc +3 -4
  587. data/src/core/lib/security/credentials/local/local_credentials.h +3 -4
  588. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +17 -18
  589. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +0 -1
  590. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +13 -21
  591. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +3 -4
  592. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +6 -0
  593. data/src/core/lib/security/credentials/tls/tls_credentials.cc +13 -25
  594. data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -4
  595. data/src/core/lib/security/credentials/xds/xds_credentials.cc +13 -30
  596. data/src/core/lib/security/credentials/xds/xds_credentials.h +3 -3
  597. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -18
  598. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +26 -38
  599. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
  600. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +5 -5
  601. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +6 -5
  602. data/src/core/lib/security/security_connector/local/local_security_connector.cc +13 -11
  603. data/src/core/lib/security/security_connector/local/local_security_connector.h +2 -2
  604. data/src/core/lib/security/security_connector/security_connector.h +5 -3
  605. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +5 -4
  606. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +5 -5
  607. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +5 -5
  608. data/src/core/lib/security/transport/auth_filters.h +1 -1
  609. data/src/core/lib/security/transport/client_auth_filter.cc +3 -4
  610. data/src/core/lib/security/transport/security_handshaker.cc +32 -44
  611. data/src/core/lib/security/transport/security_handshaker.h +2 -1
  612. data/src/core/lib/service_config/service_config.h +11 -0
  613. data/src/core/lib/service_config/service_config_impl.cc +98 -97
  614. data/src/core/lib/service_config/service_config_impl.h +11 -13
  615. data/src/core/lib/service_config/service_config_parser.cc +26 -27
  616. data/src/core/lib/service_config/service_config_parser.h +10 -22
  617. data/src/core/lib/slice/percent_encoding.cc +4 -13
  618. data/src/core/lib/slice/slice.cc +10 -4
  619. data/src/core/lib/surface/call.cc +8 -2
  620. data/src/core/lib/surface/channel.cc +6 -6
  621. data/src/core/lib/surface/channel.h +1 -1
  622. data/src/core/lib/surface/completion_queue.cc +0 -2
  623. data/src/core/lib/surface/completion_queue.h +0 -3
  624. data/src/core/lib/surface/init.cc +2 -6
  625. data/src/core/lib/surface/lame_client.cc +2 -3
  626. data/src/core/lib/surface/lame_client.h +1 -1
  627. data/src/core/lib/surface/server.cc +7 -12
  628. data/src/core/lib/surface/server.h +7 -7
  629. data/src/core/lib/surface/validate_metadata.cc +4 -14
  630. data/src/core/lib/surface/version.cc +2 -2
  631. data/src/core/lib/transport/connectivity_state.cc +0 -1
  632. data/src/core/lib/transport/connectivity_state.h +1 -1
  633. data/src/core/lib/transport/error_utils.cc +0 -36
  634. data/src/core/lib/transport/handshaker.cc +7 -9
  635. data/src/core/lib/transport/handshaker.h +4 -5
  636. data/src/core/lib/transport/handshaker_factory.h +2 -3
  637. data/src/core/lib/transport/handshaker_registry.cc +2 -1
  638. data/src/core/lib/transport/handshaker_registry.h +2 -4
  639. data/src/core/lib/transport/http_connect_handshaker.cc +16 -16
  640. data/src/core/lib/transport/metadata_batch.cc +5 -0
  641. data/src/core/lib/transport/metadata_batch.h +52 -7
  642. data/src/core/lib/transport/parsed_metadata.h +0 -1
  643. data/src/core/lib/transport/tcp_connect_handshaker.cc +12 -18
  644. data/src/core/lib/transport/transport.h +0 -7
  645. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +40 -21
  646. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  647. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +14 -7
  648. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +1 -1
  649. data/src/core/tsi/fake_transport_security.cc +53 -30
  650. data/src/core/tsi/local_transport_security.cc +9 -5
  651. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +10 -1
  652. data/src/core/tsi/ssl_transport_security.cc +47 -23
  653. data/src/core/tsi/transport_security.cc +18 -6
  654. data/src/core/tsi/transport_security.h +2 -1
  655. data/src/core/tsi/transport_security_interface.h +17 -5
  656. data/src/ruby/ext/grpc/extconf.rb +2 -0
  657. data/src/ruby/ext/grpc/rb_loader.c +6 -2
  658. data/src/ruby/lib/grpc/version.rb +1 -1
  659. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
  660. data/third_party/abseil-cpp/absl/functional/any_invocable.h +313 -0
  661. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +857 -0
  662. data/third_party/upb/third_party/utf8_range/utf8_range.h +1 -1
  663. data/third_party/upb/upb/arena.c +277 -0
  664. data/third_party/upb/upb/arena.h +225 -0
  665. data/third_party/upb/upb/array.c +114 -0
  666. data/third_party/upb/upb/array.h +83 -0
  667. data/third_party/upb/upb/collections.h +36 -0
  668. data/third_party/upb/upb/decode.c +161 -65
  669. data/third_party/upb/upb/decode.h +1 -0
  670. data/third_party/upb/upb/decode_fast.c +1 -1
  671. data/third_party/upb/upb/def.c +10 -2
  672. data/third_party/upb/upb/def.h +8 -1
  673. data/third_party/upb/upb/def.hpp +7 -4
  674. data/third_party/upb/upb/encode.c +29 -20
  675. data/third_party/upb/upb/encode.h +16 -6
  676. data/third_party/upb/upb/extension_registry.c +93 -0
  677. data/third_party/upb/upb/extension_registry.h +84 -0
  678. data/third_party/upb/upb/{decode_internal.h → internal/decode.h} +5 -5
  679. data/third_party/upb/upb/internal/table.h +385 -0
  680. data/third_party/upb/upb/{upb_internal.h → internal/upb.h} +3 -3
  681. data/third_party/upb/upb/internal/vsnprintf_compat.h +52 -0
  682. data/third_party/upb/upb/json_decode.c +1512 -0
  683. data/third_party/upb/upb/json_decode.h +47 -0
  684. data/third_party/upb/upb/json_encode.c +7 -3
  685. data/third_party/upb/upb/json_encode.h +6 -3
  686. data/third_party/upb/upb/map.c +108 -0
  687. data/third_party/upb/upb/map.h +117 -0
  688. data/third_party/upb/upb/message_value.h +66 -0
  689. data/third_party/upb/upb/mini_table.c +1147 -0
  690. data/third_party/upb/upb/mini_table.h +189 -0
  691. data/third_party/upb/upb/mini_table.hpp +112 -0
  692. data/third_party/upb/upb/msg.c +2 -62
  693. data/third_party/upb/upb/msg.h +2 -45
  694. data/third_party/upb/upb/msg_internal.h +28 -22
  695. data/third_party/upb/upb/port_def.inc +2 -1
  696. data/third_party/upb/upb/port_undef.inc +1 -0
  697. data/third_party/upb/upb/reflection.c +2 -159
  698. data/third_party/upb/upb/reflection.h +2 -112
  699. data/third_party/upb/upb/status.c +86 -0
  700. data/third_party/upb/upb/status.h +66 -0
  701. data/third_party/upb/upb/table.c +2 -2
  702. data/third_party/upb/upb/table_internal.h +3 -352
  703. data/third_party/upb/upb/text_encode.c +3 -2
  704. data/third_party/upb/upb/upb.c +4 -290
  705. data/third_party/upb/upb/upb.h +7 -196
  706. metadata +90 -38
  707. data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -50
  708. data/src/core/lib/iomgr/error_internal.h +0 -66
  709. data/src/core/lib/iomgr/executor/mpmcqueue.cc +0 -182
  710. data/src/core/lib/iomgr/executor/mpmcqueue.h +0 -171
  711. data/src/core/lib/iomgr/executor/threadpool.cc +0 -136
  712. data/src/core/lib/iomgr/executor/threadpool.h +0 -150
  713. data/src/core/lib/iomgr/time_averaged_stats.cc +0 -64
  714. data/src/core/lib/iomgr/time_averaged_stats.h +0 -72
  715. data/src/core/lib/promise/detail/switch.h +0 -1455
@@ -416,7 +416,7 @@ static void on_handshaker_service_resp_recv_dedicated(
416
416
  static tsi_result alts_tsi_handshaker_continue_handshaker_next(
417
417
  alts_tsi_handshaker* handshaker, const unsigned char* received_bytes,
418
418
  size_t received_bytes_size, tsi_handshaker_on_next_done_cb cb,
419
- void* user_data) {
419
+ void* user_data, std::string* error) {
420
420
  if (!handshaker->has_created_handshaker_client) {
421
421
  if (handshaker->channel == nullptr) {
422
422
  grpc_alts_shared_resource_dedicated_start(
@@ -437,9 +437,10 @@ static tsi_result alts_tsi_handshaker_continue_handshaker_next(
437
437
  handshaker->interested_parties, handshaker->options,
438
438
  handshaker->target_name, grpc_cb, cb, user_data,
439
439
  handshaker->client_vtable_for_testing, handshaker->is_client,
440
- handshaker->max_frame_size);
440
+ handshaker->max_frame_size, error);
441
441
  if (client == nullptr) {
442
442
  gpr_log(GPR_ERROR, "Failed to create ALTS handshaker client");
443
+ if (error != nullptr) *error = "Failed to create ALTS handshaker client";
443
444
  return TSI_FAILED_PRECONDITION;
444
445
  }
445
446
  {
@@ -448,6 +449,7 @@ static tsi_result alts_tsi_handshaker_continue_handshaker_next(
448
449
  handshaker->client = client;
449
450
  if (handshaker->shutdown) {
450
451
  gpr_log(GPR_INFO, "TSI handshake shutdown");
452
+ if (error != nullptr) *error = "TSI handshaker shutdown";
451
453
  return TSI_HANDSHAKE_SHUTDOWN;
452
454
  }
453
455
  }
@@ -490,6 +492,7 @@ struct alts_tsi_handshaker_continue_handshaker_next_args {
490
492
  tsi_handshaker_on_next_done_cb cb;
491
493
  void* user_data;
492
494
  grpc_closure closure;
495
+ std::string* error = nullptr;
493
496
  };
494
497
 
495
498
  static void alts_tsi_handshaker_create_channel(
@@ -510,7 +513,8 @@ static void alts_tsi_handshaker_create_channel(
510
513
  tsi_result continue_next_result =
511
514
  alts_tsi_handshaker_continue_handshaker_next(
512
515
  handshaker, next_args->received_bytes.get(),
513
- next_args->received_bytes_size, next_args->cb, next_args->user_data);
516
+ next_args->received_bytes_size, next_args->cb, next_args->user_data,
517
+ next_args->error);
514
518
  if (continue_next_result != TSI_OK) {
515
519
  next_args->cb(continue_next_result, next_args->user_data, nullptr, 0,
516
520
  nullptr);
@@ -522,9 +526,10 @@ static tsi_result handshaker_next(
522
526
  tsi_handshaker* self, const unsigned char* received_bytes,
523
527
  size_t received_bytes_size, const unsigned char** /*bytes_to_send*/,
524
528
  size_t* /*bytes_to_send_size*/, tsi_handshaker_result** /*result*/,
525
- tsi_handshaker_on_next_done_cb cb, void* user_data) {
529
+ tsi_handshaker_on_next_done_cb cb, void* user_data, std::string* error) {
526
530
  if (self == nullptr || cb == nullptr) {
527
531
  gpr_log(GPR_ERROR, "Invalid arguments to handshaker_next()");
532
+ if (error != nullptr) *error = "invalid argument";
528
533
  return TSI_INVALID_ARGUMENT;
529
534
  }
530
535
  alts_tsi_handshaker* handshaker =
@@ -533,6 +538,7 @@ static tsi_result handshaker_next(
533
538
  grpc_core::MutexLock lock(&handshaker->mu);
534
539
  if (handshaker->shutdown) {
535
540
  gpr_log(GPR_INFO, "TSI handshake shutdown");
541
+ if (error != nullptr) *error = "handshake shutdown";
536
542
  return TSI_HANDSHAKE_SHUTDOWN;
537
543
  }
538
544
  }
@@ -542,6 +548,7 @@ static tsi_result handshaker_next(
542
548
  args->handshaker = handshaker;
543
549
  args->received_bytes = nullptr;
544
550
  args->received_bytes_size = received_bytes_size;
551
+ args->error = error;
545
552
  if (received_bytes_size > 0) {
546
553
  args->received_bytes = std::unique_ptr<unsigned char>(
547
554
  static_cast<unsigned char*>(gpr_zalloc(received_bytes_size)));
@@ -559,7 +566,7 @@ static tsi_result handshaker_next(
559
566
  grpc_core::ExecCtx::Run(DEBUG_LOCATION, &args->closure, GRPC_ERROR_NONE);
560
567
  } else {
561
568
  tsi_result ok = alts_tsi_handshaker_continue_handshaker_next(
562
- handshaker, received_bytes, received_bytes_size, cb, user_data);
569
+ handshaker, received_bytes, received_bytes_size, cb, user_data, error);
563
570
  if (ok != TSI_OK) {
564
571
  gpr_log(GPR_ERROR, "Failed to schedule ALTS handshaker requests");
565
572
  return ok;
@@ -577,11 +584,11 @@ static tsi_result handshaker_next_dedicated(
577
584
  tsi_handshaker* self, const unsigned char* received_bytes,
578
585
  size_t received_bytes_size, const unsigned char** bytes_to_send,
579
586
  size_t* bytes_to_send_size, tsi_handshaker_result** result,
580
- tsi_handshaker_on_next_done_cb cb, void* user_data) {
587
+ tsi_handshaker_on_next_done_cb cb, void* user_data, std::string* error) {
581
588
  grpc_core::ExecCtx exec_ctx;
582
589
  return handshaker_next(self, received_bytes, received_bytes_size,
583
590
  bytes_to_send, bytes_to_send_size, result, cb,
584
- user_data);
591
+ user_data, error);
585
592
  }
586
593
 
587
594
  static void handshaker_shutdown(tsi_handshaker* self) {
@@ -63,7 +63,7 @@ void alts_handshaker_client_check_fields_for_testing(
63
63
  void alts_handshaker_client_set_fields_for_testing(
64
64
  alts_handshaker_client* client, alts_tsi_handshaker* handshaker,
65
65
  tsi_handshaker_on_next_done_cb cb, void* user_data,
66
- grpc_byte_buffer* recv_buffer, grpc_status_code status);
66
+ grpc_byte_buffer* recv_buffer, bool inject_read_failure);
67
67
 
68
68
  void alts_handshaker_client_set_vtable_for_testing(
69
69
  alts_handshaker_client* client, alts_handshaker_client_vtable* vtable);
@@ -96,7 +96,8 @@ static const char* tsi_fake_handshake_message_to_string(int msg) {
96
96
  }
97
97
 
98
98
  static tsi_result tsi_fake_handshake_message_from_string(
99
- const char* msg_string, tsi_fake_handshake_message* msg) {
99
+ const char* msg_string, tsi_fake_handshake_message* msg,
100
+ std::string* error) {
100
101
  for (int i = 0; i < TSI_FAKE_HANDSHAKE_MESSAGE_MAX; i++) {
101
102
  if (strncmp(msg_string, tsi_fake_handshake_message_strings[i],
102
103
  strlen(tsi_fake_handshake_message_strings[i])) == 0) {
@@ -105,6 +106,7 @@ static tsi_result tsi_fake_handshake_message_from_string(
105
106
  }
106
107
  }
107
108
  gpr_log(GPR_ERROR, "Invalid handshake message.");
109
+ if (error != nullptr) *error = "invalid handshake message";
108
110
  return TSI_DATA_CORRUPTED;
109
111
  }
110
112
 
@@ -174,12 +176,16 @@ static void tsi_fake_frame_ensure_size(tsi_fake_frame* frame) {
174
176
  * This method should not be called if frame->needs_framing is not 0. */
175
177
  static tsi_result tsi_fake_frame_decode(const unsigned char* incoming_bytes,
176
178
  size_t* incoming_bytes_size,
177
- tsi_fake_frame* frame) {
179
+ tsi_fake_frame* frame,
180
+ std::string* error) {
178
181
  size_t available_size = *incoming_bytes_size;
179
182
  size_t to_read_size = 0;
180
183
  const unsigned char* bytes_cursor = incoming_bytes;
181
184
 
182
- if (frame->needs_draining) return TSI_INTERNAL_ERROR;
185
+ if (frame->needs_draining) {
186
+ if (error != nullptr) *error = "fake handshaker frame needs draining";
187
+ return TSI_INTERNAL_ERROR;
188
+ }
183
189
  if (frame->data == nullptr) {
184
190
  frame->allocated_size = TSI_FAKE_FRAME_INITIAL_ALLOCATED_SIZE;
185
191
  frame->data =
@@ -224,9 +230,13 @@ static tsi_result tsi_fake_frame_decode(const unsigned char* incoming_bytes,
224
230
  * This method should not be called if frame->needs_framing is 0. */
225
231
  static tsi_result tsi_fake_frame_encode(unsigned char* outgoing_bytes,
226
232
  size_t* outgoing_bytes_size,
227
- tsi_fake_frame* frame) {
233
+ tsi_fake_frame* frame,
234
+ std::string* error) {
228
235
  size_t to_write_size = frame->size - frame->offset;
229
- if (!frame->needs_draining) return TSI_INTERNAL_ERROR;
236
+ if (!frame->needs_draining) {
237
+ if (error != nullptr) *error = "fake frame needs draining";
238
+ return TSI_INTERNAL_ERROR;
239
+ }
230
240
  if (*outgoing_bytes_size < to_write_size) {
231
241
  memcpy(outgoing_bytes, frame->data + frame->offset, *outgoing_bytes_size);
232
242
  frame->offset += *outgoing_bytes_size;
@@ -240,15 +250,14 @@ static tsi_result tsi_fake_frame_encode(unsigned char* outgoing_bytes,
240
250
 
241
251
  /* Sets the payload of a fake frame to contain the given data blob, where
242
252
  * data_size indicates the size of data. */
243
- static tsi_result tsi_fake_frame_set_data(unsigned char* data, size_t data_size,
244
- tsi_fake_frame* frame) {
253
+ static void tsi_fake_frame_set_data(unsigned char* data, size_t data_size,
254
+ tsi_fake_frame* frame) {
245
255
  frame->offset = 0;
246
256
  frame->size = data_size + TSI_FAKE_FRAME_HEADER_SIZE;
247
257
  tsi_fake_frame_ensure_size(frame);
248
258
  store32_little_endian(static_cast<uint32_t>(frame->size), frame->data);
249
259
  memcpy(frame->data + TSI_FAKE_FRAME_HEADER_SIZE, data, data_size);
250
260
  tsi_fake_frame_reset(frame, 1 /* needs draining */);
251
- return TSI_OK;
252
261
  }
253
262
 
254
263
  /* Destroys the contents of a fake frame. */
@@ -276,8 +285,8 @@ static tsi_result fake_protector_protect(tsi_frame_protector* self,
276
285
  /* Try to drain first. */
277
286
  if (frame->needs_draining) {
278
287
  drained_size = saved_output_size - *num_bytes_written;
279
- result =
280
- tsi_fake_frame_encode(protected_output_frames, &drained_size, frame);
288
+ result = tsi_fake_frame_encode(protected_output_frames, &drained_size,
289
+ frame, /*error=*/nullptr);
281
290
  *num_bytes_written += drained_size;
282
291
  protected_output_frames += drained_size;
283
292
  if (result != TSI_OK) {
@@ -297,7 +306,8 @@ static tsi_result fake_protector_protect(tsi_frame_protector* self,
297
306
  store32_little_endian(static_cast<uint32_t>(impl->max_frame_size),
298
307
  frame_header);
299
308
  written_in_frame_size = TSI_FAKE_FRAME_HEADER_SIZE;
300
- result = tsi_fake_frame_decode(frame_header, &written_in_frame_size, frame);
309
+ result = tsi_fake_frame_decode(frame_header, &written_in_frame_size, frame,
310
+ /*error=*/nullptr);
301
311
  if (result != TSI_INCOMPLETE_DATA) {
302
312
  gpr_log(GPR_ERROR, "tsi_fake_frame_decode returned %s",
303
313
  tsi_result_to_string(result));
@@ -305,7 +315,8 @@ static tsi_result fake_protector_protect(tsi_frame_protector* self,
305
315
  }
306
316
  }
307
317
  result =
308
- tsi_fake_frame_decode(unprotected_bytes, unprotected_bytes_size, frame);
318
+ tsi_fake_frame_decode(unprotected_bytes, unprotected_bytes_size, frame,
319
+ /*error=*/nullptr);
309
320
  if (result != TSI_OK) {
310
321
  if (result == TSI_INCOMPLETE_DATA) result = TSI_OK;
311
322
  return result;
@@ -315,7 +326,8 @@ static tsi_result fake_protector_protect(tsi_frame_protector* self,
315
326
  if (!frame->needs_draining) return TSI_INTERNAL_ERROR;
316
327
  if (frame->offset != 0) return TSI_INTERNAL_ERROR;
317
328
  drained_size = saved_output_size - *num_bytes_written;
318
- result = tsi_fake_frame_encode(protected_output_frames, &drained_size, frame);
329
+ result = tsi_fake_frame_encode(protected_output_frames, &drained_size, frame,
330
+ /*error=*/nullptr);
319
331
  *num_bytes_written += drained_size;
320
332
  if (result == TSI_INCOMPLETE_DATA) result = TSI_OK;
321
333
  return result;
@@ -337,7 +349,8 @@ static tsi_result fake_protector_protect_flush(
337
349
  frame->data); /* Overwrite header. */
338
350
  }
339
351
  result = tsi_fake_frame_encode(protected_output_frames,
340
- protected_output_frames_size, frame);
352
+ protected_output_frames_size, frame,
353
+ /*error=*/nullptr);
341
354
  if (result == TSI_INCOMPLETE_DATA) result = TSI_OK;
342
355
  *still_pending_size = frame->size - frame->offset;
343
356
  return result;
@@ -361,7 +374,8 @@ static tsi_result fake_protector_unprotect(
361
374
  /* Go past the header if needed. */
362
375
  if (frame->offset == 0) frame->offset = TSI_FAKE_FRAME_HEADER_SIZE;
363
376
  drained_size = saved_output_size - *num_bytes_written;
364
- result = tsi_fake_frame_encode(unprotected_bytes, &drained_size, frame);
377
+ result = tsi_fake_frame_encode(unprotected_bytes, &drained_size, frame,
378
+ /*error=*/nullptr);
365
379
  unprotected_bytes += drained_size;
366
380
  *num_bytes_written += drained_size;
367
381
  if (result != TSI_OK) {
@@ -376,7 +390,8 @@ static tsi_result fake_protector_unprotect(
376
390
  /* Now process the protected_bytes. */
377
391
  if (frame->needs_draining) return TSI_INTERNAL_ERROR;
378
392
  result = tsi_fake_frame_decode(protected_frames_bytes,
379
- protected_frames_bytes_size, frame);
393
+ protected_frames_bytes_size, frame,
394
+ /*error=*/nullptr);
380
395
  if (result != TSI_OK) {
381
396
  if (result == TSI_INCOMPLETE_DATA) result = TSI_OK;
382
397
  return result;
@@ -387,7 +402,8 @@ static tsi_result fake_protector_unprotect(
387
402
  if (frame->offset != 0) return TSI_INTERNAL_ERROR;
388
403
  frame->offset = TSI_FAKE_FRAME_HEADER_SIZE; /* Go past the header. */
389
404
  drained_size = saved_output_size - *num_bytes_written;
390
- result = tsi_fake_frame_encode(unprotected_bytes, &drained_size, frame);
405
+ result = tsi_fake_frame_encode(unprotected_bytes, &drained_size, frame,
406
+ /*error=*/nullptr);
391
407
  *num_bytes_written += drained_size;
392
408
  if (result == TSI_INCOMPLETE_DATA) result = TSI_OK;
393
409
  return result;
@@ -579,9 +595,10 @@ static const tsi_handshaker_result_vtable handshaker_result_vtable = {
579
595
 
580
596
  static tsi_result fake_handshaker_result_create(
581
597
  const unsigned char* unused_bytes, size_t unused_bytes_size,
582
- tsi_handshaker_result** handshaker_result) {
598
+ tsi_handshaker_result** handshaker_result, std::string* error) {
583
599
  if ((unused_bytes_size > 0 && unused_bytes == nullptr) ||
584
600
  handshaker_result == nullptr) {
601
+ if (error != nullptr) *error = "invalid argument";
585
602
  return TSI_INVALID_ARGUMENT;
586
603
  }
587
604
  fake_handshaker_result* result = grpc_core::Zalloc<fake_handshaker_result>();
@@ -599,7 +616,8 @@ static tsi_result fake_handshaker_result_create(
599
616
  /* --- tsi_handshaker methods implementation. ---*/
600
617
 
601
618
  static tsi_result fake_handshaker_get_bytes_to_send_to_peer(
602
- tsi_handshaker* self, unsigned char* bytes, size_t* bytes_size) {
619
+ tsi_handshaker* self, unsigned char* bytes, size_t* bytes_size,
620
+ std::string* error) {
603
621
  tsi_fake_handshaker* impl = reinterpret_cast<tsi_fake_handshaker*>(self);
604
622
  tsi_result result = TSI_OK;
605
623
  if (impl->needs_incoming_message || impl->result == TSI_OK) {
@@ -612,10 +630,9 @@ static tsi_result fake_handshaker_get_bytes_to_send_to_peer(
612
630
  static_cast<tsi_fake_handshake_message>(impl->next_message_to_send + 2);
613
631
  const char* msg_string =
614
632
  tsi_fake_handshake_message_to_string(impl->next_message_to_send);
615
- result = tsi_fake_frame_set_data(
633
+ tsi_fake_frame_set_data(
616
634
  reinterpret_cast<unsigned char*>(const_cast<char*>(msg_string)),
617
635
  strlen(msg_string), &impl->outgoing_frame);
618
- if (result != TSI_OK) return result;
619
636
  if (next_message_to_send > TSI_FAKE_HANDSHAKE_MESSAGE_MAX) {
620
637
  next_message_to_send = TSI_FAKE_HANDSHAKE_MESSAGE_MAX;
621
638
  }
@@ -626,7 +643,8 @@ static tsi_result fake_handshaker_get_bytes_to_send_to_peer(
626
643
  }
627
644
  impl->next_message_to_send = next_message_to_send;
628
645
  }
629
- result = tsi_fake_frame_encode(bytes, bytes_size, &impl->outgoing_frame);
646
+ result =
647
+ tsi_fake_frame_encode(bytes, bytes_size, &impl->outgoing_frame, error);
630
648
  if (result != TSI_OK) return result;
631
649
  if (!impl->is_client &&
632
650
  impl->next_message_to_send == TSI_FAKE_HANDSHAKE_MESSAGE_MAX) {
@@ -642,7 +660,8 @@ static tsi_result fake_handshaker_get_bytes_to_send_to_peer(
642
660
  }
643
661
 
644
662
  static tsi_result fake_handshaker_process_bytes_from_peer(
645
- tsi_handshaker* self, const unsigned char* bytes, size_t* bytes_size) {
663
+ tsi_handshaker* self, const unsigned char* bytes, size_t* bytes_size,
664
+ std::string* error) {
646
665
  tsi_result result = TSI_OK;
647
666
  tsi_fake_handshaker* impl = reinterpret_cast<tsi_fake_handshaker*>(self);
648
667
  tsi_fake_handshake_message expected_msg =
@@ -653,14 +672,15 @@ static tsi_result fake_handshaker_process_bytes_from_peer(
653
672
  *bytes_size = 0;
654
673
  return TSI_OK;
655
674
  }
656
- result = tsi_fake_frame_decode(bytes, bytes_size, &impl->incoming_frame);
675
+ result =
676
+ tsi_fake_frame_decode(bytes, bytes_size, &impl->incoming_frame, error);
657
677
  if (result != TSI_OK) return result;
658
678
 
659
679
  /* We now have a complete frame. */
660
680
  result = tsi_fake_handshake_message_from_string(
661
681
  reinterpret_cast<const char*>(impl->incoming_frame.data) +
662
682
  TSI_FAKE_FRAME_HEADER_SIZE,
663
- &received_msg);
683
+ &received_msg, error);
664
684
  if (result != TSI_OK) {
665
685
  impl->result = result;
666
686
  return result;
@@ -703,11 +723,13 @@ static tsi_result fake_handshaker_next(
703
723
  tsi_handshaker* self, const unsigned char* received_bytes,
704
724
  size_t received_bytes_size, const unsigned char** bytes_to_send,
705
725
  size_t* bytes_to_send_size, tsi_handshaker_result** handshaker_result,
706
- tsi_handshaker_on_next_done_cb /*cb*/, void* /*user_data*/) {
726
+ tsi_handshaker_on_next_done_cb /*cb*/, void* /*user_data*/,
727
+ std::string* error) {
707
728
  /* Sanity check the arguments. */
708
729
  if ((received_bytes_size > 0 && received_bytes == nullptr) ||
709
730
  bytes_to_send == nullptr || bytes_to_send_size == nullptr ||
710
731
  handshaker_result == nullptr) {
732
+ if (error != nullptr) *error = "invalid argument";
711
733
  return TSI_INVALID_ARGUMENT;
712
734
  }
713
735
  tsi_fake_handshaker* handshaker =
@@ -717,8 +739,8 @@ static tsi_result fake_handshaker_next(
717
739
  /* Decode and process a handshake frame from the peer. */
718
740
  size_t consumed_bytes_size = received_bytes_size;
719
741
  if (received_bytes_size > 0) {
720
- result = fake_handshaker_process_bytes_from_peer(self, received_bytes,
721
- &consumed_bytes_size);
742
+ result = fake_handshaker_process_bytes_from_peer(
743
+ self, received_bytes, &consumed_bytes_size, error);
722
744
  if (result != TSI_OK) return result;
723
745
  }
724
746
 
@@ -728,7 +750,8 @@ static tsi_result fake_handshaker_next(
728
750
  do {
729
751
  size_t sent_bytes_size = handshaker->outgoing_bytes_buffer_size - offset;
730
752
  result = fake_handshaker_get_bytes_to_send_to_peer(
731
- self, handshaker->outgoing_bytes_buffer + offset, &sent_bytes_size);
753
+ self, handshaker->outgoing_bytes_buffer + offset, &sent_bytes_size,
754
+ error);
732
755
  offset += sent_bytes_size;
733
756
  if (result == TSI_INCOMPLETE_DATA) {
734
757
  handshaker->outgoing_bytes_buffer_size *= 2;
@@ -754,7 +777,7 @@ static tsi_result fake_handshaker_next(
754
777
 
755
778
  /* Create a handshaker_result containing the unused bytes. */
756
779
  result = fake_handshaker_result_create(unused_bytes, unused_bytes_size,
757
- handshaker_result);
780
+ handshaker_result, error);
758
781
  if (result == TSI_OK) {
759
782
  /* Indicate that the handshake has completed and that a handshaker_result
760
783
  * has been created. */
@@ -119,13 +119,17 @@ tsi_result create_handshaker_result(const unsigned char* received_bytes,
119
119
 
120
120
  /* --- tsi_handshaker methods implementation. --- */
121
121
 
122
- tsi_result handshaker_next(
123
- tsi_handshaker* self, const unsigned char* received_bytes,
124
- size_t received_bytes_size, const unsigned char** /*bytes_to_send*/,
125
- size_t* bytes_to_send_size, tsi_handshaker_result** result,
126
- tsi_handshaker_on_next_done_cb /*cb*/, void* /*user_data*/) {
122
+ tsi_result handshaker_next(tsi_handshaker* self,
123
+ const unsigned char* received_bytes,
124
+ size_t received_bytes_size,
125
+ const unsigned char** /*bytes_to_send*/,
126
+ size_t* bytes_to_send_size,
127
+ tsi_handshaker_result** result,
128
+ tsi_handshaker_on_next_done_cb /*cb*/,
129
+ void* /*user_data*/, std::string* error) {
127
130
  if (self == nullptr) {
128
131
  gpr_log(GPR_ERROR, "Invalid arguments to handshaker_next()");
132
+ if (error != nullptr) *error = "invalid argument";
129
133
  return TSI_INVALID_ARGUMENT;
130
134
  }
131
135
  /* Note that there is no interaction between TSI peers, and all operations are
@@ -25,9 +25,11 @@
25
25
 
26
26
  #include <openssl/ssl.h>
27
27
 
28
+ #include <grpc/impl/codegen/grpc_types.h>
28
29
  #include <grpc/slice.h>
29
30
  #include <grpc/support/sync.h>
30
31
 
32
+ #include "src/core/lib/gprpp/cpp_impl_of.h"
31
33
  #include "src/core/lib/gprpp/memory.h"
32
34
  #include "src/core/lib/gprpp/ref_counted.h"
33
35
  #include "src/core/lib/gprpp/sync.h"
@@ -44,7 +46,10 @@
44
46
 
45
47
  namespace tsi {
46
48
 
47
- class SslSessionLRUCache : public grpc_core::RefCounted<SslSessionLRUCache> {
49
+ class SslSessionLRUCache
50
+ : public grpc_core::CppImplOf<SslSessionLRUCache,
51
+ struct tsi_ssl_session_cache>,
52
+ public grpc_core::RefCounted<SslSessionLRUCache> {
48
53
  public:
49
54
  /// Create new LRU cache with the given capacity.
50
55
  static grpc_core::RefCountedPtr<SslSessionLRUCache> Create(size_t capacity) {
@@ -59,6 +64,10 @@ class SslSessionLRUCache : public grpc_core::RefCounted<SslSessionLRUCache> {
59
64
  SslSessionLRUCache(const SslSessionLRUCache&) = delete;
60
65
  SslSessionLRUCache& operator=(const SslSessionLRUCache&) = delete;
61
66
 
67
+ static absl::string_view ChannelArgName() {
68
+ return GRPC_SSL_SESSION_CACHE_ARG;
69
+ }
70
+
62
71
  /// Returns current number of sessions in the cache.
63
72
  size_t Size();
64
73
  /// Add \a session in the cache using \a key. This operation may discard older
@@ -45,6 +45,7 @@
45
45
  #include <openssl/x509v3.h>
46
46
 
47
47
  #include "absl/strings/match.h"
48
+ #include "absl/strings/str_cat.h"
48
49
  #include "absl/strings/string_view.h"
49
50
 
50
51
  #include <grpc/grpc_security.h>
@@ -1036,17 +1037,16 @@ void tsi_ssl_root_certs_store_destroy(tsi_ssl_root_certs_store* self) {
1036
1037
 
1037
1038
  tsi_ssl_session_cache* tsi_ssl_session_cache_create_lru(size_t capacity) {
1038
1039
  /* Pointer will be dereferenced by unref call. */
1039
- return reinterpret_cast<tsi_ssl_session_cache*>(
1040
- tsi::SslSessionLRUCache::Create(capacity).release());
1040
+ return tsi::SslSessionLRUCache::Create(capacity).release()->c_ptr();
1041
1041
  }
1042
1042
 
1043
1043
  void tsi_ssl_session_cache_ref(tsi_ssl_session_cache* cache) {
1044
1044
  /* Pointer will be dereferenced by unref call. */
1045
- reinterpret_cast<tsi::SslSessionLRUCache*>(cache)->Ref().release();
1045
+ tsi::SslSessionLRUCache::FromC(cache)->Ref().release();
1046
1046
  }
1047
1047
 
1048
1048
  void tsi_ssl_session_cache_unref(tsi_ssl_session_cache* cache) {
1049
- reinterpret_cast<tsi::SslSessionLRUCache*>(cache)->Unref();
1049
+ tsi::SslSessionLRUCache::FromC(cache)->Unref();
1050
1050
  }
1051
1051
 
1052
1052
  /* --- tsi_frame_protector methods implementation. ---*/
@@ -1416,9 +1416,11 @@ static const tsi_handshaker_result_vtable handshaker_result_vtable = {
1416
1416
 
1417
1417
  static tsi_result ssl_handshaker_result_create(
1418
1418
  tsi_ssl_handshaker* handshaker, unsigned char* unused_bytes,
1419
- size_t unused_bytes_size, tsi_handshaker_result** handshaker_result) {
1419
+ size_t unused_bytes_size, tsi_handshaker_result** handshaker_result,
1420
+ std::string* error) {
1420
1421
  if (handshaker == nullptr || handshaker_result == nullptr ||
1421
1422
  (unused_bytes_size > 0 && unused_bytes == nullptr)) {
1423
+ if (error != nullptr) *error = "invalid argument";
1422
1424
  return TSI_INVALID_ARGUMENT;
1423
1425
  }
1424
1426
  tsi_ssl_handshaker_result* result =
@@ -1439,9 +1441,11 @@ static tsi_result ssl_handshaker_result_create(
1439
1441
  /* --- tsi_handshaker methods implementation. ---*/
1440
1442
 
1441
1443
  static tsi_result ssl_handshaker_get_bytes_to_send_to_peer(
1442
- tsi_ssl_handshaker* impl, unsigned char* bytes, size_t* bytes_size) {
1444
+ tsi_ssl_handshaker* impl, unsigned char* bytes, size_t* bytes_size,
1445
+ std::string* error) {
1443
1446
  int bytes_read_from_ssl = 0;
1444
1447
  if (bytes == nullptr || bytes_size == nullptr || *bytes_size > INT_MAX) {
1448
+ if (error != nullptr) *error = "invalid argument";
1445
1449
  return TSI_INVALID_ARGUMENT;
1446
1450
  }
1447
1451
  GPR_ASSERT(*bytes_size <= INT_MAX);
@@ -1450,6 +1454,7 @@ static tsi_result ssl_handshaker_get_bytes_to_send_to_peer(
1450
1454
  if (bytes_read_from_ssl < 0) {
1451
1455
  *bytes_size = 0;
1452
1456
  if (!BIO_should_retry(impl->network_io)) {
1457
+ if (error != nullptr) *error = "error reading from BIO";
1453
1458
  impl->result = TSI_INTERNAL_ERROR;
1454
1459
  return impl->result;
1455
1460
  } else {
@@ -1468,7 +1473,8 @@ static tsi_result ssl_handshaker_get_result(tsi_ssl_handshaker* impl) {
1468
1473
  return impl->result;
1469
1474
  }
1470
1475
 
1471
- static tsi_result ssl_handshaker_do_handshake(tsi_ssl_handshaker* impl) {
1476
+ static tsi_result ssl_handshaker_do_handshake(tsi_ssl_handshaker* impl,
1477
+ std::string* error) {
1472
1478
  if (ssl_handshaker_get_result(impl) != TSI_HANDSHAKE_IN_PROGRESS) {
1473
1479
  impl->result = TSI_OK;
1474
1480
  return impl->result;
@@ -1494,6 +1500,9 @@ static tsi_result ssl_handshaker_do_handshake(tsi_ssl_handshaker* impl) {
1494
1500
  ERR_error_string_n(ERR_get_error(), err_str, sizeof(err_str));
1495
1501
  gpr_log(GPR_ERROR, "Handshake failed with fatal error %s: %s.",
1496
1502
  ssl_error_string(ssl_result), err_str);
1503
+ if (error != nullptr) {
1504
+ *error = absl::StrCat(ssl_error_string(ssl_result), ": ", err_str);
1505
+ }
1497
1506
  impl->result = TSI_PROTOCOL_FAILURE;
1498
1507
  return impl->result;
1499
1508
  }
@@ -1502,9 +1511,11 @@ static tsi_result ssl_handshaker_do_handshake(tsi_ssl_handshaker* impl) {
1502
1511
  }
1503
1512
 
1504
1513
  static tsi_result ssl_handshaker_process_bytes_from_peer(
1505
- tsi_ssl_handshaker* impl, const unsigned char* bytes, size_t* bytes_size) {
1514
+ tsi_ssl_handshaker* impl, const unsigned char* bytes, size_t* bytes_size,
1515
+ std::string* error) {
1506
1516
  int bytes_written_into_ssl_size = 0;
1507
1517
  if (bytes == nullptr || bytes_size == nullptr || *bytes_size > INT_MAX) {
1518
+ if (error != nullptr) *error = "invalid argument";
1508
1519
  return TSI_INVALID_ARGUMENT;
1509
1520
  }
1510
1521
  GPR_ASSERT(*bytes_size <= INT_MAX);
@@ -1512,11 +1523,12 @@ static tsi_result ssl_handshaker_process_bytes_from_peer(
1512
1523
  BIO_write(impl->network_io, bytes, static_cast<int>(*bytes_size));
1513
1524
  if (bytes_written_into_ssl_size < 0) {
1514
1525
  gpr_log(GPR_ERROR, "Could not write to memory BIO.");
1526
+ if (error != nullptr) *error = "could not write to memory BIO";
1515
1527
  impl->result = TSI_INTERNAL_ERROR;
1516
1528
  return impl->result;
1517
1529
  }
1518
1530
  *bytes_size = static_cast<size_t>(bytes_written_into_ssl_size);
1519
- return ssl_handshaker_do_handshake(impl);
1531
+ return ssl_handshaker_do_handshake(impl, error);
1520
1532
  }
1521
1533
 
1522
1534
  static void ssl_handshaker_destroy(tsi_handshaker* self) {
@@ -1532,9 +1544,11 @@ static void ssl_handshaker_destroy(tsi_handshaker* self) {
1532
1544
  // |bytes_remaining|.
1533
1545
  static tsi_result ssl_bytes_remaining(tsi_ssl_handshaker* impl,
1534
1546
  unsigned char** bytes_remaining,
1535
- size_t* bytes_remaining_size) {
1547
+ size_t* bytes_remaining_size,
1548
+ std::string* error) {
1536
1549
  if (impl == nullptr || bytes_remaining == nullptr ||
1537
1550
  bytes_remaining_size == nullptr) {
1551
+ if (error != nullptr) *error = "invalid argument";
1538
1552
  return TSI_INVALID_ARGUMENT;
1539
1553
  }
1540
1554
  // Atempt to read all of the bytes in SSL's read BIO. These bytes should
@@ -1552,6 +1566,9 @@ static tsi_result ssl_bytes_remaining(tsi_ssl_handshaker* impl,
1552
1566
  "Failed to read the expected number of bytes from SSL object.");
1553
1567
  gpr_free(*bytes_remaining);
1554
1568
  *bytes_remaining = nullptr;
1569
+ if (error != nullptr) {
1570
+ *error = "Failed to read the expected number of bytes from SSL object.";
1571
+ }
1555
1572
  return TSI_INTERNAL_ERROR;
1556
1573
  }
1557
1574
  *bytes_remaining_size = static_cast<size_t>(bytes_read);
@@ -1563,14 +1580,15 @@ static tsi_result ssl_bytes_remaining(tsi_ssl_handshaker* impl,
1563
1580
  // This API needs to be repeatedly called until all handshake data are
1564
1581
  // received from SSL.
1565
1582
  static tsi_result ssl_handshaker_write_output_buffer(tsi_handshaker* self,
1566
- size_t* bytes_written) {
1583
+ size_t* bytes_written,
1584
+ std::string* error) {
1567
1585
  tsi_ssl_handshaker* impl = reinterpret_cast<tsi_ssl_handshaker*>(self);
1568
1586
  tsi_result status = TSI_OK;
1569
1587
  size_t offset = *bytes_written;
1570
1588
  do {
1571
1589
  size_t to_send_size = impl->outgoing_bytes_buffer_size - offset;
1572
1590
  status = ssl_handshaker_get_bytes_to_send_to_peer(
1573
- impl, impl->outgoing_bytes_buffer + offset, &to_send_size);
1591
+ impl, impl->outgoing_bytes_buffer + offset, &to_send_size, error);
1574
1592
  offset += to_send_size;
1575
1593
  if (status == TSI_INCOMPLETE_DATA) {
1576
1594
  impl->outgoing_bytes_buffer_size *= 2;
@@ -1582,15 +1600,19 @@ static tsi_result ssl_handshaker_write_output_buffer(tsi_handshaker* self,
1582
1600
  return status;
1583
1601
  }
1584
1602
 
1585
- static tsi_result ssl_handshaker_next(
1586
- tsi_handshaker* self, const unsigned char* received_bytes,
1587
- size_t received_bytes_size, const unsigned char** bytes_to_send,
1588
- size_t* bytes_to_send_size, tsi_handshaker_result** handshaker_result,
1589
- tsi_handshaker_on_next_done_cb /*cb*/, void* /*user_data*/) {
1603
+ static tsi_result ssl_handshaker_next(tsi_handshaker* self,
1604
+ const unsigned char* received_bytes,
1605
+ size_t received_bytes_size,
1606
+ const unsigned char** bytes_to_send,
1607
+ size_t* bytes_to_send_size,
1608
+ tsi_handshaker_result** handshaker_result,
1609
+ tsi_handshaker_on_next_done_cb /*cb*/,
1610
+ void* /*user_data*/, std::string* error) {
1590
1611
  /* Input sanity check. */
1591
1612
  if ((received_bytes_size > 0 && received_bytes == nullptr) ||
1592
1613
  bytes_to_send == nullptr || bytes_to_send_size == nullptr ||
1593
1614
  handshaker_result == nullptr) {
1615
+ if (error != nullptr) *error = "invalid argument";
1594
1616
  return TSI_INVALID_ARGUMENT;
1595
1617
  }
1596
1618
  /* If there are received bytes, process them first. */
@@ -1600,16 +1622,16 @@ static tsi_result ssl_handshaker_next(
1600
1622
  size_t bytes_written = 0;
1601
1623
  if (received_bytes_size > 0) {
1602
1624
  status = ssl_handshaker_process_bytes_from_peer(impl, received_bytes,
1603
- &bytes_consumed);
1625
+ &bytes_consumed, error);
1604
1626
  while (status == TSI_DRAIN_BUFFER) {
1605
- status = ssl_handshaker_write_output_buffer(self, &bytes_written);
1627
+ status = ssl_handshaker_write_output_buffer(self, &bytes_written, error);
1606
1628
  if (status != TSI_OK) return status;
1607
- status = ssl_handshaker_do_handshake(impl);
1629
+ status = ssl_handshaker_do_handshake(impl, error);
1608
1630
  }
1609
1631
  }
1610
1632
  if (status != TSI_OK) return status;
1611
1633
  /* Get bytes to send to the peer, if available. */
1612
- status = ssl_handshaker_write_output_buffer(self, &bytes_written);
1634
+ status = ssl_handshaker_write_output_buffer(self, &bytes_written, error);
1613
1635
  if (status != TSI_OK) return status;
1614
1636
  *bytes_to_send = impl->outgoing_bytes_buffer;
1615
1637
  *bytes_to_send_size = bytes_written;
@@ -1623,15 +1645,17 @@ static tsi_result ssl_handshaker_next(
1623
1645
  // peer that must be processed.
1624
1646
  unsigned char* unused_bytes = nullptr;
1625
1647
  size_t unused_bytes_size = 0;
1626
- status = ssl_bytes_remaining(impl, &unused_bytes, &unused_bytes_size);
1648
+ status =
1649
+ ssl_bytes_remaining(impl, &unused_bytes, &unused_bytes_size, error);
1627
1650
  if (status != TSI_OK) return status;
1628
1651
  if (unused_bytes_size > received_bytes_size) {
1629
1652
  gpr_log(GPR_ERROR, "More unused bytes than received bytes.");
1630
1653
  gpr_free(unused_bytes);
1654
+ if (error != nullptr) *error = "More unused bytes than received bytes.";
1631
1655
  return TSI_INTERNAL_ERROR;
1632
1656
  }
1633
1657
  status = ssl_handshaker_result_create(impl, unused_bytes, unused_bytes_size,
1634
- handshaker_result);
1658
+ handshaker_result, error);
1635
1659
  if (status == TSI_OK) {
1636
1660
  /* Indicates that the handshake has completed and that a handshaker_result
1637
1661
  * has been created. */