grpc 1.41.1 → 1.44.0.pre2

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.

Potentially problematic release.


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

Files changed (1156) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +185 -102
  3. data/include/grpc/event_engine/event_engine.h +118 -54
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +68 -0
  5. data/include/grpc/event_engine/memory_allocator.h +226 -0
  6. data/include/grpc/event_engine/memory_request.h +57 -0
  7. data/include/grpc/grpc.h +4 -0
  8. data/include/grpc/grpc_security.h +304 -145
  9. data/include/grpc/grpc_security_constants.h +2 -14
  10. data/include/grpc/impl/codegen/compression_types.h +0 -2
  11. data/include/grpc/impl/codegen/grpc_types.h +6 -0
  12. data/include/grpc/impl/codegen/port_platform.h +14 -3
  13. data/src/core/ext/filters/client_channel/backend_metric.cc +21 -23
  14. data/src/core/ext/filters/client_channel/backend_metric.h +4 -3
  15. data/src/core/ext/filters/client_channel/backup_poller.cc +2 -1
  16. data/src/core/ext/filters/client_channel/channel_connectivity.cc +71 -89
  17. data/src/core/ext/filters/client_channel/client_channel.cc +305 -335
  18. data/src/core/ext/filters/client_channel/client_channel.h +84 -36
  19. data/src/core/ext/filters/client_channel/client_channel_factory.cc +1 -1
  20. data/src/core/ext/filters/client_channel/client_channel_factory.h +17 -19
  21. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +8 -15
  22. data/src/core/ext/filters/client_channel/config_selector.cc +1 -1
  23. data/src/core/ext/filters/client_channel/config_selector.h +5 -6
  24. data/src/core/ext/filters/client_channel/connector.h +18 -18
  25. data/src/core/ext/filters/client_channel/dynamic_filters.cc +5 -5
  26. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  27. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +0 -1
  28. data/src/core/ext/filters/client_channel/health/health_check_client.cc +25 -22
  29. data/src/core/ext/filters/client_channel/health/health_check_client.h +4 -4
  30. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +13 -15
  31. data/src/core/ext/filters/client_channel/http_connect_handshaker.h +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  33. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  34. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +4 -0
  35. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +5 -18
  36. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +198 -116
  37. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +3 -6
  38. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +1 -1
  39. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  40. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
  41. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  42. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -2
  43. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
  44. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +2 -4
  45. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +66 -36
  46. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +21 -12
  47. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +124 -74
  48. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +2514 -0
  49. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +68 -62
  50. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  51. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +18 -6
  52. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +51 -96
  53. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  54. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_channel_args.h +1 -1
  55. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +101 -46
  56. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +11 -3
  57. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +101 -209
  58. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  59. data/src/core/ext/filters/client_channel/lb_policy.h +105 -63
  60. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -0
  61. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +139 -0
  62. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +220 -88
  63. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  64. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  65. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +31 -50
  66. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +124 -240
  67. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +38 -25
  68. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  69. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +90 -77
  70. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +13 -11
  71. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  72. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +7 -16
  73. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  74. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +423 -396
  75. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +2 -2
  76. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
  77. data/src/core/ext/filters/client_channel/retry_filter.cc +66 -131
  78. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
  79. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  80. data/src/core/ext/filters/client_channel/retry_throttle.cc +17 -48
  81. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +49 -36
  82. data/src/core/ext/filters/client_channel/subchannel.cc +99 -161
  83. data/src/core/ext/filters/client_channel/subchannel.h +31 -52
  84. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +22 -7
  85. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +11 -2
  86. data/src/core/ext/filters/client_idle/client_idle_filter.cc +27 -210
  87. data/src/core/ext/filters/client_idle/idle_filter_state.cc +96 -0
  88. data/src/core/ext/filters/client_idle/idle_filter_state.h +66 -0
  89. data/src/core/ext/filters/deadline/deadline_filter.cc +23 -26
  90. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +42 -53
  91. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -9
  92. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  93. data/src/core/ext/filters/http/client/http_client_filter.cc +70 -160
  94. data/src/core/ext/filters/http/client_authority_filter.cc +19 -36
  95. data/src/core/ext/filters/http/http_filters_plugin.cc +51 -71
  96. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +46 -139
  97. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
  98. data/src/core/ext/filters/http/server/http_server_filter.cc +84 -183
  99. data/src/core/ext/filters/max_age/max_age_filter.cc +24 -26
  100. data/src/core/ext/filters/message_size/message_size_filter.cc +19 -16
  101. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  102. data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
  103. data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
  104. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
  105. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
  106. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +67 -0
  107. data/src/core/ext/filters/server_config_selector/server_config_selector.h +71 -0
  108. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +270 -0
  109. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → filters/server_config_selector/server_config_selector_filter.h} +9 -7
  110. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -23
  111. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -2
  112. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +26 -28
  113. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +11 -14
  114. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +33 -53
  115. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +146 -113
  116. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -3
  117. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +9 -13
  118. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +6 -6
  119. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
  120. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +129 -278
  121. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -2
  122. data/src/core/ext/transport/chttp2/transport/context_list.cc +2 -3
  123. data/src/core/ext/transport/chttp2/transport/context_list.h +2 -3
  124. data/src/core/ext/transport/chttp2/transport/flow_control.cc +26 -23
  125. data/src/core/ext/transport/chttp2/transport/flow_control.h +6 -6
  126. data/src/core/ext/transport/chttp2/transport/frame_data.cc +4 -5
  127. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +2 -1
  128. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +2 -1
  129. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +2 -3
  130. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +2 -2
  131. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +1 -1
  132. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +384 -218
  133. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +89 -143
  134. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  135. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  136. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +201 -202
  137. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +27 -9
  138. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +106 -26
  139. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +29 -44
  140. data/src/core/ext/transport/chttp2/transport/internal.h +10 -38
  141. data/src/core/ext/transport/chttp2/transport/parsing.cc +30 -179
  142. data/src/core/ext/transport/chttp2/transport/writing.cc +65 -127
  143. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  144. data/src/core/ext/transport/inproc/inproc_transport.cc +114 -161
  145. data/src/core/ext/transport/inproc/inproc_transport.h +1 -4
  146. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +197 -165
  147. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +2 -0
  148. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +41 -0
  149. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +18 -0
  150. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +26 -2
  151. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  152. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +107 -82
  153. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +2 -0
  154. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +188 -160
  155. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +2 -0
  156. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +35 -22
  157. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +2 -0
  158. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +277 -208
  159. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +141 -1
  160. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +16 -5
  161. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +2 -0
  162. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +36 -25
  163. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +2 -0
  164. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +56 -39
  165. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +2 -0
  166. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +16 -5
  167. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +2 -0
  168. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +171 -125
  169. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +55 -4
  170. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +51 -36
  171. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +2 -0
  172. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +15 -4
  173. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +2 -0
  174. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +25 -13
  175. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +2 -0
  176. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +114 -90
  177. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +2 -0
  178. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +90 -71
  179. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +17 -0
  180. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +17 -6
  181. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +2 -0
  182. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +121 -92
  183. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +25 -0
  184. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +13 -2
  185. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +2 -0
  186. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +21 -9
  187. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +2 -0
  188. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +18 -7
  189. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +2 -0
  190. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +22 -11
  191. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +2 -0
  192. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +17 -6
  193. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +2 -0
  194. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +41 -27
  195. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +2 -0
  196. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +59 -44
  197. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +2 -0
  198. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +58 -43
  199. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +2 -0
  200. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +15 -4
  201. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +2 -0
  202. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +73 -57
  203. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +2 -0
  204. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +81 -64
  205. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +2 -0
  206. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +25 -14
  207. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +2 -0
  208. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +19 -7
  209. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +2 -0
  210. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +63 -45
  211. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +2 -0
  212. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +66 -47
  213. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +2 -0
  214. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +99 -78
  215. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +19 -0
  216. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +41 -28
  217. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +2 -0
  218. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +508 -442
  219. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +51 -19
  220. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +26 -13
  221. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +2 -0
  222. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +21 -9
  223. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +2 -0
  224. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +13 -2
  225. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +2 -0
  226. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +35 -20
  227. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +2 -0
  228. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +44 -31
  229. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +2 -0
  230. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
  231. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
  232. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +22 -11
  233. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +2 -0
  234. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +210 -181
  235. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +2 -0
  236. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +7 -0
  237. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +5 -3
  238. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +64 -48
  239. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +2 -0
  240. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +33 -20
  241. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +2 -0
  242. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +81 -65
  243. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +2 -0
  244. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +12 -1
  245. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +2 -0
  246. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +12 -1
  247. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +2 -0
  248. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +75 -58
  249. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +2 -0
  250. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +12 -1
  251. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +2 -0
  252. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +12 -1
  253. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +2 -0
  254. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +25 -13
  255. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +2 -0
  256. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +12 -1
  257. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +2 -0
  258. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +12 -1
  259. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +2 -0
  260. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +61 -46
  261. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +2 -0
  262. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +26 -12
  263. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +2 -0
  264. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +22 -10
  265. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +2 -0
  266. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +17 -6
  267. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +2 -0
  268. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +16 -5
  269. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +2 -0
  270. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +15 -4
  271. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +2 -0
  272. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +27 -14
  273. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +2 -0
  274. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +25 -13
  275. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +2 -0
  276. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +20 -8
  277. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +2 -0
  278. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +30 -17
  279. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +2 -0
  280. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +38 -21
  281. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +2 -0
  282. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +41 -26
  283. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +2 -0
  284. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +7 -0
  285. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +2 -0
  286. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +17 -5
  287. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +2 -0
  288. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +22 -9
  289. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +2 -0
  290. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +15 -4
  291. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +2 -0
  292. data/src/core/ext/upb-generated/google/api/annotations.upb.c +20 -0
  293. data/src/core/ext/upb-generated/google/api/annotations.upb.h +7 -0
  294. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +116 -93
  295. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +2 -0
  296. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.c +102 -0
  297. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.h +306 -0
  298. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.c +56 -0
  299. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.h +135 -0
  300. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +122 -98
  301. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +2 -0
  302. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.c +115 -0
  303. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.h +371 -0
  304. data/src/core/ext/upb-generated/google/api/http.upb.c +35 -22
  305. data/src/core/ext/upb-generated/google/api/http.upb.h +2 -0
  306. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +14 -3
  307. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +2 -0
  308. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +247 -210
  309. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2 -0
  310. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +14 -3
  311. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +2 -0
  312. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +12 -1
  313. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +2 -0
  314. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +37 -23
  315. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +2 -0
  316. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +14 -3
  317. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +2 -0
  318. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +37 -18
  319. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +2 -0
  320. data/src/core/ext/upb-generated/google/rpc/status.upb.c +17 -6
  321. data/src/core/ext/upb-generated/google/rpc/status.upb.h +2 -0
  322. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +26 -14
  323. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +2 -0
  324. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +105 -83
  325. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +2 -0
  326. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +20 -8
  327. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +2 -0
  328. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +16 -4
  329. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +2 -0
  330. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +65 -47
  331. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -36
  332. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +68 -0
  333. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +156 -0
  334. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +67 -7
  335. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +27 -0
  336. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +27 -5
  337. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
  338. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +19 -0
  339. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +7 -0
  340. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +27 -3
  341. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -0
  342. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +26 -2
  343. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  344. data/src/core/ext/upb-generated/validate/validate.upb.c +320 -251
  345. data/src/core/ext/upb-generated/validate/validate.upb.h +20 -0
  346. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +103 -0
  347. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +199 -0
  348. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +14 -3
  349. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +2 -0
  350. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +25 -13
  351. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +2 -0
  352. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +20 -8
  353. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +2 -0
  354. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +19 -8
  355. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +2 -0
  356. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +28 -16
  357. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +2 -0
  358. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +19 -8
  359. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +2 -0
  360. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +71 -0
  361. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +132 -0
  362. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +44 -0
  363. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +85 -0
  364. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +2 -49
  365. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +2 -2
  366. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +2 -7
  367. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +2 -35
  368. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +2 -41
  369. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +2 -11
  370. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +307 -336
  371. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.h +10 -0
  372. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +2 -7
  373. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +2 -7
  374. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +2 -19
  375. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +2 -7
  376. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +100 -138
  377. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +5 -0
  378. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +2 -15
  379. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +2 -7
  380. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +2 -9
  381. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +2 -33
  382. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +61 -77
  383. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +2 -7
  384. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +61 -79
  385. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +2 -7
  386. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +2 -9
  387. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +2 -7
  388. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +2 -7
  389. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +2 -7
  390. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +2 -13
  391. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +80 -99
  392. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +2 -15
  393. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +2 -7
  394. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +2 -17
  395. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +2 -19
  396. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +2 -7
  397. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +2 -9
  398. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +2 -21
  399. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +2 -23
  400. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
  401. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  402. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +2 -11
  403. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +325 -427
  404. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +2 -11
  405. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +2 -9
  406. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +2 -7
  407. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +2 -15
  408. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +2 -11
  409. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
  410. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  411. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +2 -7
  412. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +2 -43
  413. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +2 -2
  414. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +2 -17
  415. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +2 -11
  416. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +2 -17
  417. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +2 -7
  418. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +2 -7
  419. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +2 -19
  420. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +2 -7
  421. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +2 -7
  422. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +2 -9
  423. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +2 -7
  424. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +2 -7
  425. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +2 -15
  426. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +2 -13
  427. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +2 -9
  428. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +2 -7
  429. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +2 -7
  430. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +2 -7
  431. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +2 -11
  432. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +2 -9
  433. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +2 -9
  434. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +2 -11
  435. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +2 -19
  436. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +2 -15
  437. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +2 -2
  438. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +2 -9
  439. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +2 -11
  440. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +2 -7
  441. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +2 -2
  442. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  443. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  444. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
  445. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
  446. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
  447. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
  448. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  449. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  450. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
  451. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
  452. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +2 -11
  453. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +2 -7
  454. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +2 -59
  455. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +2 -7
  456. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +2 -7
  457. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +2 -13
  458. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +2 -7
  459. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +2 -23
  460. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +2 -7
  461. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +7 -15
  462. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +21 -30
  463. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +6 -5
  464. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +7 -10
  465. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +7 -11
  466. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +2 -51
  467. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +64 -0
  468. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.h +50 -0
  469. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +15 -19
  470. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +27 -33
  471. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +18 -24
  472. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +19 -23
  473. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +35 -41
  474. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +21 -25
  475. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +40 -0
  476. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.h +35 -0
  477. data/src/core/ext/xds/certificate_provider_registry.cc +1 -1
  478. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  479. data/src/core/ext/xds/upb_utils.h +65 -0
  480. data/src/core/ext/xds/xds_api.cc +159 -3468
  481. data/src/core/ext/xds/xds_api.h +57 -558
  482. data/src/core/ext/xds/xds_bootstrap.cc +189 -122
  483. data/src/core/ext/xds/xds_bootstrap.h +30 -15
  484. data/src/core/ext/xds/xds_certificate_provider.cc +3 -3
  485. data/src/core/ext/xds/xds_certificate_provider.h +2 -2
  486. data/src/core/ext/xds/xds_channel_creds.cc +108 -0
  487. data/src/core/ext/xds/xds_channel_creds.h +50 -0
  488. data/src/core/ext/xds/xds_channel_stack_modifier.cc +112 -0
  489. data/src/core/ext/xds/xds_channel_stack_modifier.h +52 -0
  490. data/src/core/ext/xds/xds_client.cc +751 -844
  491. data/src/core/ext/xds/xds_client.h +100 -143
  492. data/src/core/ext/xds/xds_client_stats.h +1 -1
  493. data/src/core/ext/xds/xds_cluster.cc +451 -0
  494. data/src/core/ext/xds/xds_cluster.h +111 -0
  495. data/src/core/ext/xds/xds_common_types.cc +388 -0
  496. data/src/core/ext/xds/xds_common_types.h +110 -0
  497. data/src/core/ext/xds/xds_endpoint.cc +364 -0
  498. data/src/core/ext/xds/xds_endpoint.h +135 -0
  499. data/src/core/ext/xds/xds_http_filters.cc +5 -0
  500. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  501. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  502. data/src/core/ext/xds/xds_listener.cc +1036 -0
  503. data/src/core/ext/xds/xds_listener.h +220 -0
  504. data/src/core/ext/{filters/workarounds/workaround_cronet_compression_filter.h → xds/xds_resource_type.cc} +14 -8
  505. data/src/core/ext/xds/xds_resource_type.h +98 -0
  506. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  507. data/src/core/ext/xds/xds_route_config.cc +993 -0
  508. data/src/core/ext/xds/xds_route_config.h +215 -0
  509. data/src/core/ext/xds/xds_routing.cc +250 -0
  510. data/src/core/ext/xds/xds_routing.h +101 -0
  511. data/src/core/ext/xds/xds_server_config_fetcher.cc +1061 -289
  512. data/src/core/lib/address_utils/parse_address.cc +22 -0
  513. data/src/core/lib/address_utils/parse_address.h +5 -0
  514. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  515. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  516. data/src/core/lib/avl/avl.h +389 -88
  517. data/src/core/lib/backoff/backoff.cc +6 -32
  518. data/src/core/lib/backoff/backoff.h +3 -3
  519. data/src/core/lib/channel/channel_args.cc +25 -8
  520. data/src/core/lib/channel/channel_args.h +11 -1
  521. data/src/core/lib/channel/channel_args_preconditioning.cc +47 -0
  522. data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
  523. data/src/core/lib/channel/channel_stack.cc +8 -0
  524. data/src/core/lib/channel/channel_stack.h +1 -1
  525. data/src/core/lib/channel/channel_stack_builder.cc +8 -14
  526. data/src/core/lib/channel/channel_stack_builder.h +4 -7
  527. data/src/core/lib/channel/channel_trace.cc +7 -7
  528. data/src/core/lib/channel/channel_trace.h +1 -1
  529. data/src/core/lib/channel/channelz.cc +4 -3
  530. data/src/core/lib/channel/channelz.h +2 -2
  531. data/src/core/lib/channel/channelz_registry.cc +1 -1
  532. data/src/core/lib/channel/channelz_registry.h +1 -1
  533. data/src/core/lib/channel/connected_channel.cc +1 -3
  534. data/src/core/lib/channel/connected_channel.h +1 -2
  535. data/src/core/lib/compression/compression.cc +21 -113
  536. data/src/core/lib/compression/compression_internal.cc +142 -202
  537. data/src/core/lib/compression/compression_internal.h +64 -69
  538. data/src/core/lib/compression/message_compress.cc +11 -11
  539. data/src/core/lib/compression/message_compress.h +2 -2
  540. data/src/core/lib/config/core_configuration.cc +46 -2
  541. data/src/core/lib/config/core_configuration.h +50 -1
  542. data/src/core/lib/debug/stats.cc +1 -1
  543. data/src/core/lib/debug/stats_data.cc +13 -13
  544. data/src/core/lib/debug/trace.h +2 -2
  545. data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +2 -1
  546. data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +3 -3
  547. data/src/core/lib/event_engine/event_engine.cc +0 -13
  548. data/src/core/lib/event_engine/event_engine_factory.cc +49 -0
  549. data/src/core/lib/event_engine/event_engine_factory.h +33 -0
  550. data/src/core/lib/event_engine/memory_allocator.cc +70 -0
  551. data/src/core/lib/gpr/atm.cc +1 -1
  552. data/src/core/lib/gpr/cpu_posix.cc +1 -1
  553. data/src/core/lib/gpr/string.cc +2 -2
  554. data/src/core/lib/gpr/tls.h +7 -1
  555. data/src/core/lib/gpr/useful.h +83 -32
  556. data/src/core/lib/gprpp/bitset.h +45 -16
  557. data/src/core/lib/gprpp/chunked_vector.h +253 -0
  558. data/src/core/lib/gprpp/construct_destruct.h +1 -1
  559. data/src/core/lib/gprpp/cpp_impl_of.h +45 -0
  560. data/src/core/lib/gprpp/global_config_env.cc +7 -7
  561. data/src/core/lib/gprpp/global_config_env.h +2 -2
  562. data/src/core/lib/gprpp/manual_constructor.h +2 -3
  563. data/src/core/lib/gprpp/memory.h +6 -0
  564. data/src/core/lib/gprpp/orphanable.h +1 -1
  565. data/src/core/lib/gprpp/ref_counted.h +1 -1
  566. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -4
  567. data/src/core/lib/gprpp/status_helper.cc +35 -23
  568. data/src/core/lib/gprpp/status_helper.h +14 -16
  569. data/src/core/lib/gprpp/table.h +434 -0
  570. data/src/core/lib/http/httpcli.cc +215 -202
  571. data/src/core/lib/http/httpcli.h +17 -27
  572. data/src/core/lib/http/parser.cc +2 -2
  573. data/src/core/lib/iomgr/buffer_list.cc +9 -9
  574. data/src/core/lib/iomgr/buffer_list.h +13 -13
  575. data/src/core/lib/iomgr/call_combiner.cc +44 -16
  576. data/src/core/lib/iomgr/closure.h +29 -9
  577. data/src/core/lib/iomgr/combiner.cc +31 -24
  578. data/src/core/lib/iomgr/endpoint.h +0 -1
  579. data/src/core/lib/iomgr/endpoint_cfstream.cc +14 -30
  580. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  581. data/src/core/lib/iomgr/endpoint_pair_posix.cc +9 -11
  582. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
  583. data/src/core/lib/iomgr/error.cc +115 -52
  584. data/src/core/lib/iomgr/error.h +53 -9
  585. data/src/core/lib/iomgr/error_cfstream.cc +5 -0
  586. data/src/core/lib/iomgr/ev_epoll1_linux.cc +3 -2
  587. data/src/core/lib/iomgr/ev_epollex_linux.cc +7 -7
  588. data/src/core/lib/iomgr/ev_poll_posix.cc +29 -20
  589. data/src/core/lib/iomgr/event_engine/closure.cc +41 -18
  590. data/src/core/lib/iomgr/event_engine/closure.h +10 -1
  591. data/src/core/lib/iomgr/event_engine/endpoint.cc +5 -6
  592. data/src/core/lib/iomgr/event_engine/iomgr.cc +9 -28
  593. data/src/core/lib/iomgr/event_engine/pollset.cc +5 -4
  594. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  595. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  596. data/src/core/lib/iomgr/event_engine/resolver.cc +68 -46
  597. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  598. data/src/core/lib/iomgr/event_engine/tcp.cc +16 -13
  599. data/src/core/lib/iomgr/event_engine/timer.cc +10 -4
  600. data/src/core/lib/iomgr/exec_ctx.cc +23 -18
  601. data/src/core/lib/iomgr/exec_ctx.h +11 -11
  602. data/src/core/lib/iomgr/executor/mpmcqueue.cc +5 -7
  603. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -8
  604. data/src/core/lib/iomgr/executor.cc +26 -34
  605. data/src/core/lib/iomgr/executor.h +1 -1
  606. data/src/core/lib/iomgr/fork_posix.cc +3 -2
  607. data/src/core/lib/iomgr/iomgr.cc +3 -1
  608. data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
  609. data/src/core/lib/iomgr/iomgr_internal.cc +4 -9
  610. data/src/core/lib/iomgr/iomgr_internal.h +3 -2
  611. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  612. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  613. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  614. data/src/core/lib/iomgr/load_file.cc +2 -2
  615. data/src/core/lib/iomgr/lockfree_event.cc +18 -0
  616. data/src/core/lib/iomgr/pollset_custom.cc +1 -1
  617. data/src/core/lib/iomgr/pollset_custom.h +1 -1
  618. data/src/core/lib/iomgr/port.h +2 -2
  619. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  620. data/src/core/lib/iomgr/resolve_address.h +47 -44
  621. data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
  622. data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
  623. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  624. data/src/core/lib/iomgr/resolve_address_posix.cc +87 -73
  625. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  626. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  627. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  628. data/src/core/lib/iomgr/resolved_address.h +39 -0
  629. data/src/core/lib/iomgr/socket_factory_posix.cc +2 -2
  630. data/src/core/lib/iomgr/socket_mutator.cc +2 -2
  631. data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -2
  632. data/src/core/lib/iomgr/tcp_client.cc +2 -4
  633. data/src/core/lib/iomgr/tcp_client.h +1 -3
  634. data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -12
  635. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -11
  636. data/src/core/lib/iomgr/tcp_client_posix.cc +16 -41
  637. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  638. data/src/core/lib/iomgr/tcp_client_windows.cc +3 -13
  639. data/src/core/lib/iomgr/tcp_custom.cc +9 -36
  640. data/src/core/lib/iomgr/tcp_custom.h +0 -1
  641. data/src/core/lib/iomgr/tcp_posix.cc +32 -38
  642. data/src/core/lib/iomgr/tcp_posix.h +1 -3
  643. data/src/core/lib/iomgr/tcp_server.cc +4 -6
  644. data/src/core/lib/iomgr/tcp_server.h +6 -8
  645. data/src/core/lib/iomgr/tcp_server_custom.cc +7 -16
  646. data/src/core/lib/iomgr/tcp_server_posix.cc +20 -25
  647. data/src/core/lib/iomgr/tcp_server_utils_posix.h +19 -18
  648. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  649. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  650. data/src/core/lib/iomgr/tcp_server_windows.cc +9 -17
  651. data/src/core/lib/iomgr/tcp_windows.cc +4 -9
  652. data/src/core/lib/iomgr/tcp_windows.h +1 -2
  653. data/src/core/lib/iomgr/timer_generic.cc +13 -13
  654. data/src/core/lib/iomgr/timer_heap.cc +1 -1
  655. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  656. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  657. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  658. data/src/core/lib/iomgr/work_serializer.cc +115 -44
  659. data/src/core/lib/iomgr/work_serializer.h +16 -4
  660. data/src/core/lib/json/json_reader.cc +83 -35
  661. data/src/core/lib/json/json_util.cc +69 -1
  662. data/src/core/lib/json/json_util.h +57 -99
  663. data/src/core/lib/json/json_writer.cc +0 -3
  664. data/src/core/lib/matchers/matchers.cc +1 -1
  665. data/src/core/lib/promise/activity.cc +115 -0
  666. data/src/core/lib/promise/activity.h +528 -0
  667. data/src/core/lib/promise/context.h +86 -0
  668. data/src/core/lib/promise/detail/basic_seq.h +407 -0
  669. data/src/core/lib/promise/detail/promise_factory.h +189 -0
  670. data/src/core/lib/promise/detail/promise_like.h +85 -0
  671. data/src/core/lib/promise/detail/status.h +49 -0
  672. data/src/core/lib/promise/detail/switch.h +1455 -0
  673. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
  674. data/src/core/lib/promise/loop.h +108 -0
  675. data/src/core/lib/promise/map.h +88 -0
  676. data/src/core/lib/promise/poll.h +60 -0
  677. data/src/core/lib/promise/race.h +84 -0
  678. data/src/core/lib/promise/seq.h +71 -0
  679. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  680. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  681. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +12 -5
  682. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +15 -17
  683. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +5 -7
  684. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  685. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +5 -5
  686. data/src/core/lib/resource_quota/api.cc +108 -0
  687. data/src/core/lib/resource_quota/api.h +40 -0
  688. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  689. data/src/core/lib/{gprpp → resource_quota}/arena.h +32 -11
  690. data/src/core/lib/resource_quota/memory_quota.cc +454 -0
  691. data/src/core/lib/resource_quota/memory_quota.h +421 -0
  692. data/src/core/lib/resource_quota/resource_quota.cc +33 -0
  693. data/src/core/lib/resource_quota/resource_quota.h +58 -0
  694. data/src/core/lib/{transport/authority_override.h → resource_quota/thread_quota.cc} +22 -16
  695. data/src/core/lib/resource_quota/thread_quota.h +57 -0
  696. data/src/core/lib/resource_quota/trace.cc +19 -0
  697. data/src/core/lib/resource_quota/trace.h +24 -0
  698. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  699. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +1 -1
  700. data/src/core/lib/security/authorization/evaluate_args.cc +41 -30
  701. data/src/core/lib/security/authorization/evaluate_args.h +3 -1
  702. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  703. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  704. data/src/core/lib/security/authorization/matchers.cc +227 -0
  705. data/src/core/lib/security/authorization/matchers.h +211 -0
  706. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  707. data/src/core/lib/security/authorization/rbac_policy.h +170 -0
  708. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +15 -1
  709. data/src/core/lib/security/context/security_context.cc +8 -4
  710. data/src/core/lib/security/context/security_context.h +1 -1
  711. data/src/core/lib/security/credentials/composite/composite_credentials.cc +6 -6
  712. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
  713. data/src/core/lib/security/credentials/credentials.cc +4 -2
  714. data/src/core/lib/security/credentials/credentials.h +16 -21
  715. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +8 -12
  716. data/src/core/lib/security/credentials/external/external_account_credentials.cc +57 -24
  717. data/src/core/lib/security/credentials/external/external_account_credentials.h +3 -7
  718. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -4
  719. data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
  720. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
  721. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +4 -9
  722. data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
  723. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
  724. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  725. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +17 -29
  726. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
  727. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +11 -24
  728. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +53 -70
  729. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
  730. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +8 -9
  731. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
  732. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
  733. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +11 -12
  734. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -8
  735. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +201 -0
  736. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +106 -0
  737. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +15 -88
  738. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +26 -82
  739. data/src/core/lib/security/credentials/tls/tls_credentials.cc +21 -10
  740. data/src/core/lib/security/credentials/xds/xds_credentials.cc +28 -33
  741. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  742. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +3 -3
  743. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +2 -2
  744. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +5 -6
  745. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  746. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +7 -7
  747. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -2
  748. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -1
  749. data/src/core/lib/security/security_connector/security_connector.cc +9 -8
  750. data/src/core/lib/security/security_connector/security_connector.h +6 -2
  751. data/src/core/lib/security/security_connector/ssl_utils.cc +25 -27
  752. data/src/core/lib/security/security_connector/ssl_utils.h +6 -15
  753. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +347 -198
  754. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +64 -43
  755. data/src/core/lib/security/transport/auth_filters.h +7 -0
  756. data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
  757. data/src/core/lib/security/transport/security_handshaker.cc +75 -45
  758. data/src/core/lib/security/transport/server_auth_filter.cc +40 -37
  759. data/src/core/lib/security/transport/tsi_error.cc +3 -5
  760. data/src/core/{ext/filters/client_channel → lib/service_config}/service_config.cc +2 -2
  761. data/src/core/{ext/filters/client_channel → lib/service_config}/service_config.h +4 -4
  762. data/src/core/lib/service_config/service_config_call_data.h +72 -0
  763. data/src/core/{ext/filters/client_channel → lib/service_config}/service_config_parser.cc +3 -3
  764. data/src/core/{ext/filters/client_channel → lib/service_config}/service_config_parser.h +8 -6
  765. data/src/core/lib/slice/percent_encoding.cc +30 -86
  766. data/src/core/lib/slice/percent_encoding.h +5 -11
  767. data/src/core/lib/slice/slice.cc +10 -24
  768. data/src/core/lib/slice/slice.h +371 -0
  769. data/src/core/lib/{compression/stream_compression_gzip.h → slice/slice_api.cc} +18 -7
  770. data/src/core/lib/slice/slice_buffer.cc +9 -5
  771. data/src/core/lib/slice/slice_intern.cc +4 -107
  772. data/src/core/lib/slice/slice_internal.h +2 -246
  773. data/src/core/lib/slice/slice_refcount.cc +17 -0
  774. data/src/core/lib/slice/slice_refcount.h +116 -0
  775. data/src/core/lib/slice/slice_refcount_base.h +165 -0
  776. data/src/core/lib/slice/slice_split.cc +100 -0
  777. data/src/core/lib/slice/slice_split.h +40 -0
  778. data/src/core/lib/slice/slice_string_helpers.cc +0 -83
  779. data/src/core/lib/slice/slice_string_helpers.h +0 -11
  780. data/src/core/lib/surface/builtins.cc +49 -0
  781. data/src/core/lib/surface/builtins.h +26 -0
  782. data/src/core/lib/surface/call.cc +249 -482
  783. data/src/core/lib/surface/call.h +4 -10
  784. data/src/core/lib/surface/channel.cc +53 -93
  785. data/src/core/lib/surface/channel.h +6 -25
  786. data/src/core/lib/surface/channel_init.cc +23 -76
  787. data/src/core/lib/surface/channel_init.h +52 -44
  788. data/src/core/lib/surface/completion_queue.cc +8 -7
  789. data/src/core/lib/surface/init.cc +0 -42
  790. data/src/core/lib/surface/init_secure.cc +17 -14
  791. data/src/core/lib/surface/lame_client.cc +41 -28
  792. data/src/core/lib/surface/lame_client.h +1 -1
  793. data/src/core/lib/surface/server.cc +46 -55
  794. data/src/core/lib/surface/server.h +27 -21
  795. data/src/core/lib/surface/validate_metadata.cc +7 -4
  796. data/src/core/lib/surface/version.cc +2 -2
  797. data/src/core/lib/transport/bdp_estimator.cc +2 -2
  798. data/src/core/lib/transport/byte_stream.cc +4 -0
  799. data/src/core/lib/transport/error_utils.cc +42 -17
  800. data/src/core/lib/transport/error_utils.h +15 -1
  801. data/src/core/lib/transport/metadata_batch.h +1167 -176
  802. data/src/core/lib/transport/{authority_override.cc → parsed_metadata.cc} +14 -17
  803. data/src/core/lib/transport/parsed_metadata.h +385 -0
  804. data/src/core/lib/transport/pid_controller.cc +4 -4
  805. data/src/core/lib/transport/timeout_encoding.cc +200 -66
  806. data/src/core/lib/transport/timeout_encoding.h +40 -10
  807. data/src/core/lib/transport/transport.cc +8 -31
  808. data/src/core/lib/transport/transport.h +1 -2
  809. data/src/core/lib/transport/transport_op_string.cc +7 -20
  810. data/src/core/lib/uri/uri_parser.cc +233 -63
  811. data/src/core/lib/uri/uri_parser.h +38 -23
  812. data/src/core/plugin_registry/grpc_plugin_registry.cc +69 -45
  813. data/src/core/tsi/alts/crypt/aes_gcm.cc +3 -1
  814. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +13 -12
  815. data/src/core/tsi/alts/frame_protector/frame_handler.cc +10 -11
  816. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +3 -4
  817. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +12 -2
  818. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
  819. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +2 -2
  820. data/src/core/tsi/fake_transport_security.cc +15 -7
  821. data/src/core/tsi/local_transport_security.cc +43 -80
  822. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  823. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +16 -50
  824. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +6 -7
  825. data/src/core/tsi/ssl_transport_security.cc +93 -16
  826. data/src/core/tsi/ssl_transport_security.h +19 -6
  827. data/src/core/tsi/transport_security.cc +12 -0
  828. data/src/core/tsi/transport_security.h +16 -1
  829. data/src/core/tsi/transport_security_interface.h +26 -0
  830. data/src/ruby/ext/grpc/extconf.rb +21 -11
  831. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +12 -10
  832. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +18 -15
  833. data/src/ruby/lib/grpc/version.rb +1 -1
  834. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +1 -0
  835. data/src/ruby/spec/client_server_spec.rb +1 -1
  836. data/third_party/abseil-cpp/absl/algorithm/container.h +101 -91
  837. data/third_party/abseil-cpp/absl/base/attributes.h +64 -31
  838. data/third_party/abseil-cpp/absl/base/config.h +67 -37
  839. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
  840. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  841. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -1
  842. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
  843. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +69 -0
  844. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +4 -4
  845. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +15 -10
  846. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +16 -0
  847. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +4 -4
  848. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  849. data/third_party/abseil-cpp/absl/container/fixed_array.h +0 -5
  850. data/third_party/abseil-cpp/absl/container/inlined_vector.h +105 -97
  851. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
  852. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +18 -102
  853. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +37 -78
  854. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +388 -423
  855. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
  856. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -8
  857. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +251 -120
  858. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
  859. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -11
  860. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +6 -2
  861. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +12 -5
  862. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  863. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
  864. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -7
  865. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
  866. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +21 -3
  867. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
  868. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +2 -0
  869. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +14 -0
  870. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  871. data/third_party/abseil-cpp/absl/functional/function_ref.h +4 -1
  872. data/third_party/abseil-cpp/absl/hash/hash.h +22 -0
  873. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
  874. data/third_party/abseil-cpp/absl/hash/internal/hash.h +88 -37
  875. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
  876. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
  877. data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
  878. data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
  879. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -10
  880. data/third_party/abseil-cpp/absl/numeric/int128.h +146 -73
  881. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  882. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  883. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
  884. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
  885. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
  886. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  887. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  888. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  889. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  890. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  891. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  892. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  893. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  894. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  895. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  896. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  897. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  898. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  899. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  900. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  901. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  902. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  903. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  904. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  905. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  906. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  907. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  908. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  909. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  910. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  911. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  912. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  913. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  914. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  915. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  916. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  917. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  918. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  919. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  920. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  921. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  922. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  923. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  924. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  925. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  926. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  927. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  928. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  929. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  930. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  931. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +5 -5
  932. data/third_party/abseil-cpp/absl/status/status.cc +9 -17
  933. data/third_party/abseil-cpp/absl/status/status.h +19 -15
  934. data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
  935. data/third_party/abseil-cpp/absl/status/statusor.h +31 -21
  936. data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
  937. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  938. data/third_party/abseil-cpp/absl/strings/cord.cc +453 -359
  939. data/third_party/abseil-cpp/absl/strings/cord.h +197 -70
  940. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
  941. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +6 -0
  942. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +140 -63
  943. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
  944. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
  945. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
  946. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
  947. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
  948. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
  949. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
  950. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  951. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +7 -7
  952. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +55 -181
  953. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
  954. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
  955. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  956. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  957. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  958. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  959. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
  960. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  961. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
  962. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  963. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
  964. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  965. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -0
  966. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
  967. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +1 -1
  968. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  969. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +36 -18
  970. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
  971. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +24 -16
  972. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
  973. data/third_party/abseil-cpp/absl/strings/numbers.cc +1 -1
  974. data/third_party/abseil-cpp/absl/strings/numbers.h +34 -0
  975. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  976. data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
  977. data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
  978. data/third_party/abseil-cpp/absl/strings/string_view.h +120 -39
  979. data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
  980. data/third_party/abseil-cpp/absl/strings/substitute.h +99 -74
  981. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
  982. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
  983. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -1
  984. data/third_party/abseil-cpp/absl/synchronization/mutex.h +3 -3
  985. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
  986. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
  987. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  988. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  989. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
  990. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  991. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
  992. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
  993. data/third_party/abseil-cpp/absl/time/time.h +67 -36
  994. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  995. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
  996. data/third_party/abseil-cpp/absl/types/span.h +3 -3
  997. data/third_party/address_sorting/address_sorting_posix.c +1 -0
  998. data/third_party/boringssl-with-bazel/err_data.c +681 -677
  999. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
  1000. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +20 -21
  1001. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +41 -30
  1002. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +104 -114
  1003. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  1004. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
  1005. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
  1006. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
  1007. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +41 -0
  1008. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +48 -272
  1009. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  1010. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
  1011. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  1012. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +4 -6
  1013. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
  1014. data/third_party/boringssl-with-bazel/src/crypto/chacha/chacha.c +38 -47
  1015. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  1016. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
  1017. data/third_party/boringssl-with-bazel/src/crypto/evp/scrypt.c +32 -34
  1018. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/sqrt.c +5 -9
  1019. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  1020. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/des.c +10 -11
  1021. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/des/internal.h +1 -3
  1022. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  1023. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +3 -6
  1024. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +4 -7
  1025. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
  1026. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +35 -35
  1027. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +11 -10
  1028. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +10 -37
  1029. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  1030. data/third_party/boringssl-with-bazel/src/crypto/internal.h +39 -0
  1031. data/third_party/boringssl-with-bazel/src/crypto/mem.c +18 -0
  1032. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  1033. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  1034. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  1035. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  1036. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  1037. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
  1038. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +6 -6
  1039. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
  1040. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +8 -2
  1041. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +216 -11
  1042. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -1
  1043. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  1044. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  1045. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -1
  1046. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  1047. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +1 -1
  1048. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +1 -0
  1049. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +0 -1
  1050. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
  1051. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +0 -1
  1052. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +1019 -274
  1053. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +3 -3
  1054. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +5 -2
  1055. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  1056. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  1057. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
  1058. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +27 -41
  1059. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  1060. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
  1061. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
  1062. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  1063. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +12 -13
  1064. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  1065. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  1066. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +24 -28
  1067. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +31 -13
  1068. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +491 -58
  1069. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +16 -564
  1070. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +4 -3
  1071. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3 -3
  1072. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  1073. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
  1074. data/third_party/boringssl-with-bazel/src/ssl/ssl_x509.cc +0 -1
  1075. data/third_party/re2/re2/compile.cc +91 -109
  1076. data/third_party/re2/re2/dfa.cc +27 -39
  1077. data/third_party/re2/re2/filtered_re2.cc +18 -2
  1078. data/third_party/re2/re2/filtered_re2.h +10 -5
  1079. data/third_party/re2/re2/nfa.cc +1 -1
  1080. data/third_party/re2/re2/parse.cc +42 -23
  1081. data/third_party/re2/re2/perl_groups.cc +34 -34
  1082. data/third_party/re2/re2/prefilter.cc +3 -2
  1083. data/third_party/re2/re2/prog.cc +182 -4
  1084. data/third_party/re2/re2/prog.h +28 -9
  1085. data/third_party/re2/re2/re2.cc +87 -118
  1086. data/third_party/re2/re2/re2.h +156 -141
  1087. data/third_party/re2/re2/regexp.cc +12 -5
  1088. data/third_party/re2/re2/regexp.h +8 -2
  1089. data/third_party/re2/re2/set.cc +31 -9
  1090. data/third_party/re2/re2/set.h +9 -4
  1091. data/third_party/re2/re2/simplify.cc +11 -3
  1092. data/third_party/re2/re2/tostring.cc +1 -1
  1093. data/third_party/re2/re2/walker-inl.h +1 -1
  1094. data/third_party/re2/util/mutex.h +2 -2
  1095. data/third_party/re2/util/pcre.h +3 -3
  1096. data/third_party/upb/upb/decode.c +309 -178
  1097. data/third_party/upb/upb/decode_fast.c +1 -1
  1098. data/third_party/upb/upb/decode_internal.h +1 -0
  1099. data/third_party/upb/upb/def.c +330 -85
  1100. data/third_party/upb/upb/def.h +45 -14
  1101. data/third_party/upb/upb/def.hpp +17 -4
  1102. data/third_party/upb/upb/encode.c +100 -40
  1103. data/third_party/upb/upb/msg.c +22 -9
  1104. data/third_party/upb/upb/msg_internal.h +90 -8
  1105. data/third_party/upb/upb/reflection.c +98 -58
  1106. data/third_party/upb/upb/reflection.h +6 -2
  1107. data/third_party/upb/upb/text_encode.c +3 -3
  1108. data/third_party/upb/upb/upb.c +8 -0
  1109. data/third_party/xxhash/xxhash.h +607 -352
  1110. metadata +259 -115
  1111. data/include/grpc/event_engine/slice_allocator.h +0 -71
  1112. data/src/core/ext/filters/client_channel/service_config_call_data.h +0 -126
  1113. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +0 -211
  1114. data/src/core/ext/filters/workarounds/workaround_utils.cc +0 -53
  1115. data/src/core/ext/filters/workarounds/workaround_utils.h +0 -39
  1116. data/src/core/ext/transport/chttp2/client/authority.cc +0 -42
  1117. data/src/core/ext/transport/chttp2/client/authority.h +0 -36
  1118. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +0 -67
  1119. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +0 -74
  1120. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  1121. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  1122. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +0 -66
  1123. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +0 -58
  1124. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  1125. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.c +0 -58
  1126. data/src/core/ext/upb-generated/udpa/data/orca/v1/orca_load_report.upb.h +0 -130
  1127. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.c +0 -33
  1128. data/src/core/ext/upb-generated/udpa/type/v1/typed_struct.upb.h +0 -83
  1129. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.c +0 -44
  1130. data/src/core/ext/upbdefs-generated/udpa/type/v1/typed_struct.upbdefs.h +0 -35
  1131. data/src/core/lib/avl/avl.cc +0 -306
  1132. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  1133. data/src/core/lib/compression/compression_args.cc +0 -136
  1134. data/src/core/lib/compression/compression_args.h +0 -56
  1135. data/src/core/lib/compression/stream_compression.cc +0 -81
  1136. data/src/core/lib/compression/stream_compression.h +0 -117
  1137. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  1138. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  1139. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  1140. data/src/core/lib/gprpp/match.h +0 -73
  1141. data/src/core/lib/gprpp/overload.h +0 -59
  1142. data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
  1143. data/src/core/lib/iomgr/resource_quota.cc +0 -1104
  1144. data/src/core/lib/iomgr/resource_quota.h +0 -226
  1145. data/src/core/lib/iomgr/udp_server.cc +0 -747
  1146. data/src/core/lib/iomgr/udp_server.h +0 -103
  1147. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  1148. data/src/core/lib/transport/metadata.cc +0 -693
  1149. data/src/core/lib/transport/metadata.h +0 -448
  1150. data/src/core/lib/transport/metadata_batch.cc +0 -430
  1151. data/src/core/lib/transport/static_metadata.cc +0 -1249
  1152. data/src/core/lib/transport/static_metadata.h +0 -604
  1153. data/src/core/lib/transport/status_metadata.cc +0 -62
  1154. data/src/core/lib/transport/status_metadata.h +0 -48
  1155. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  1156. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
@@ -18,46 +18,150 @@
18
18
 
19
19
  #include <grpc/support/port_platform.h>
20
20
 
21
+ #include "absl/strings/str_join.h"
21
22
  #include "absl/strings/str_replace.h"
22
23
 
24
+ #include "src/core/ext/filters/server_config_selector/server_config_selector.h"
25
+ #include "src/core/ext/filters/server_config_selector/server_config_selector_filter.h"
23
26
  #include "src/core/ext/xds/xds_certificate_provider.h"
27
+ #include "src/core/ext/xds/xds_channel_stack_modifier.h"
24
28
  #include "src/core/ext/xds/xds_client.h"
29
+ #include "src/core/ext/xds/xds_listener.h"
30
+ #include "src/core/ext/xds/xds_route_config.h"
31
+ #include "src/core/ext/xds/xds_routing.h"
32
+ #include "src/core/lib/address_utils/parse_address.h"
25
33
  #include "src/core/lib/address_utils/sockaddr_utils.h"
26
34
  #include "src/core/lib/channel/channel_args.h"
35
+ #include "src/core/lib/config/core_configuration.h"
27
36
  #include "src/core/lib/gprpp/host_port.h"
28
37
  #include "src/core/lib/iomgr/sockaddr.h"
29
38
  #include "src/core/lib/iomgr/socket_utils.h"
30
39
  #include "src/core/lib/security/credentials/xds/xds_credentials.h"
40
+ #include "src/core/lib/slice/slice_utils.h"
31
41
  #include "src/core/lib/surface/api_trace.h"
32
42
  #include "src/core/lib/surface/server.h"
43
+ #include "src/core/lib/transport/error_utils.h"
33
44
  #include "src/core/lib/uri/uri_parser.h"
34
45
 
35
46
  namespace grpc_core {
47
+ namespace {
36
48
 
37
49
  TraceFlag grpc_xds_server_config_fetcher_trace(false,
38
50
  "xds_server_config_fetcher");
39
51
 
40
- namespace {
52
+ // A server config fetcher that fetches the information for configuring server
53
+ // listeners from the xDS control plane.
54
+ class XdsServerConfigFetcher : public grpc_server_config_fetcher {
55
+ public:
56
+ XdsServerConfigFetcher(RefCountedPtr<XdsClient> xds_client,
57
+ grpc_server_xds_status_notifier notifier);
58
+
59
+ void StartWatch(std::string listening_address,
60
+ std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
61
+ watcher) override;
62
+
63
+ void CancelWatch(
64
+ grpc_server_config_fetcher::WatcherInterface* watcher) override;
65
+
66
+ // Return the interested parties from the xds client so that it can be polled.
67
+ grpc_pollset_set* interested_parties() override {
68
+ return xds_client_->interested_parties();
69
+ }
70
+
71
+ private:
72
+ class ListenerWatcher;
73
+
74
+ const RefCountedPtr<XdsClient> xds_client_;
75
+ const grpc_server_xds_status_notifier serving_status_notifier_;
76
+ Mutex mu_;
77
+ std::map<grpc_server_config_fetcher::WatcherInterface*, ListenerWatcher*>
78
+ listener_watchers_ ABSL_GUARDED_BY(mu_);
79
+ };
80
+
81
+ // A watcher implementation for listening on LDS updates from the xDS control
82
+ // plane. When a good LDS update is received, it creates a
83
+ // FilterChainMatchManager object that would replace the existing (if any)
84
+ // FilterChainMatchManager object after all referenced RDS resources are
85
+ // fetched. Note that a good update also causes the server listener to start
86
+ // listening if it isn't already. If an error LDS update is received (NACKed
87
+ // resource, timeouts), the previous good FilterChainMatchManager, if any,
88
+ // continues to be used. If there isn't any previous good update or if the
89
+ // update received was a fatal error (resource does not exist), the server
90
+ // listener is made to stop listening.
91
+ class XdsServerConfigFetcher::ListenerWatcher
92
+ : public XdsListenerResourceType::WatcherInterface {
93
+ public:
94
+ ListenerWatcher(RefCountedPtr<XdsClient> xds_client,
95
+ std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
96
+ server_config_watcher,
97
+ grpc_server_xds_status_notifier serving_status_notifier,
98
+ std::string listening_address);
99
+
100
+ void OnResourceChanged(XdsListenerResource listener) override;
101
+
102
+ void OnError(grpc_error_handle error) override;
103
+
104
+ void OnResourceDoesNotExist() override;
105
+
106
+ const std::string& listening_address() const { return listening_address_; }
107
+
108
+ private:
109
+ class FilterChainMatchManager;
41
110
 
42
- class FilterChainMatchManager
111
+ void OnFatalError(absl::Status status) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
112
+
113
+ // Invoked by FilterChainMatchManager that is done fetching all referenced RDS
114
+ // resources. If the calling FilterChainMatchManager is the
115
+ // pending_filter_chain_match_manager_, it is promoted to be the
116
+ // filter_chain_match_manager_ in use.
117
+ void PendingFilterChainMatchManagerReady(
118
+ FilterChainMatchManager* filter_chain_match_manager) {
119
+ MutexLock lock(&mu_);
120
+ PendingFilterChainMatchManagerReadyLocked(filter_chain_match_manager);
121
+ }
122
+ void PendingFilterChainMatchManagerReadyLocked(
123
+ FilterChainMatchManager* filter_chain_match_manager)
124
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&mu_);
125
+
126
+ const RefCountedPtr<XdsClient> xds_client_;
127
+ const std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
128
+ server_config_watcher_;
129
+ const grpc_server_xds_status_notifier serving_status_notifier_;
130
+ const std::string listening_address_;
131
+ Mutex mu_;
132
+ RefCountedPtr<FilterChainMatchManager> filter_chain_match_manager_
133
+ ABSL_GUARDED_BY(mu_);
134
+ RefCountedPtr<FilterChainMatchManager> pending_filter_chain_match_manager_
135
+ ABSL_GUARDED_BY(mu_);
136
+ };
137
+
138
+ // A connection manager used by the server listener code to inject channel args
139
+ // to be used for each incoming connection. This implementation chooses the
140
+ // appropriate filter chain from the xDS Listener resource and injects channel
141
+ // args that configure the right mTLS certs and cause the right set of HTTP
142
+ // filters to be injected.
143
+ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager
43
144
  : public grpc_server_config_fetcher::ConnectionManager {
44
145
  public:
45
- FilterChainMatchManager(
46
- RefCountedPtr<XdsClient> xds_client,
47
- XdsApi::LdsUpdate::FilterChainMap filter_chain_map,
48
- absl::optional<XdsApi::LdsUpdate::FilterChainData> default_filter_chain)
49
- : xds_client_(xds_client),
50
- filter_chain_map_(std::move(filter_chain_map)),
51
- default_filter_chain_(std::move(default_filter_chain)) {}
146
+ FilterChainMatchManager(RefCountedPtr<XdsClient> xds_client,
147
+ XdsListenerResource::FilterChainMap filter_chain_map,
148
+ absl::optional<XdsListenerResource::FilterChainData>
149
+ default_filter_chain);
52
150
 
53
151
  absl::StatusOr<grpc_channel_args*> UpdateChannelArgsForConnection(
54
152
  grpc_channel_args* args, grpc_endpoint* tcp) override;
55
153
 
56
- const XdsApi::LdsUpdate::FilterChainMap& filter_chain_map() const {
154
+ void Orphan() override;
155
+
156
+ // Invoked by ListenerWatcher to start fetching referenced RDS resources.
157
+ void StartRdsWatch(RefCountedPtr<ListenerWatcher> listener_watcher)
158
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ListenerWatcher::mu_);
159
+
160
+ const XdsListenerResource::FilterChainMap& filter_chain_map() const {
57
161
  return filter_chain_map_;
58
162
  }
59
163
 
60
- const absl::optional<XdsApi::LdsUpdate::FilterChainData>&
164
+ const absl::optional<XdsListenerResource::FilterChainData>&
61
165
  default_filter_chain() const {
62
166
  return default_filter_chain_;
63
167
  }
@@ -72,41 +176,655 @@ class FilterChainMatchManager
72
176
  RefCountedPtr<XdsCertificateProvider> xds;
73
177
  };
74
178
 
179
+ class RouteConfigWatcher;
180
+ struct RdsUpdateState {
181
+ RouteConfigWatcher* watcher;
182
+ absl::optional<absl::StatusOr<XdsRouteConfigResource>> rds_update;
183
+ };
184
+
185
+ class XdsServerConfigSelector;
186
+ class StaticXdsServerConfigSelectorProvider;
187
+ class DynamicXdsServerConfigSelectorProvider;
188
+
75
189
  absl::StatusOr<RefCountedPtr<XdsCertificateProvider>>
76
190
  CreateOrGetXdsCertificateProviderFromFilterChainData(
77
- const XdsApi::LdsUpdate::FilterChainData* filter_chain);
191
+ const XdsListenerResource::FilterChainData* filter_chain);
78
192
 
79
- const RefCountedPtr<XdsClient> xds_client_;
80
- const XdsApi::LdsUpdate::FilterChainMap filter_chain_map_;
81
- const absl::optional<XdsApi::LdsUpdate::FilterChainData>
82
- default_filter_chain_;
193
+ // Helper functions invoked by RouteConfigWatcher when there are updates to
194
+ // RDS resources.
195
+ void OnRouteConfigChanged(const std::string& resource_name,
196
+ XdsRouteConfigResource route_config);
197
+ void OnError(const std::string& resource_name, grpc_error_handle error);
198
+ void OnResourceDoesNotExist(const std::string& resource_name);
199
+
200
+ RefCountedPtr<XdsClient> xds_client_;
201
+ // This ref is only kept around till the FilterChainMatchManager becomes
202
+ // ready.
203
+ RefCountedPtr<ListenerWatcher> listener_watcher_;
204
+ XdsListenerResource::FilterChainMap filter_chain_map_;
205
+ absl::optional<XdsListenerResource::FilterChainData> default_filter_chain_;
83
206
  Mutex mu_;
84
- std::map<const XdsApi::LdsUpdate::FilterChainData*, CertificateProviders>
207
+ size_t rds_resources_yet_to_fetch_ ABSL_GUARDED_BY(mu_) = 0;
208
+ std::map<std::string /* resource_name */, RdsUpdateState> rds_map_
209
+ ABSL_GUARDED_BY(mu_);
210
+ std::map<const XdsListenerResource::FilterChainData*, CertificateProviders>
85
211
  certificate_providers_map_ ABSL_GUARDED_BY(mu_);
86
212
  };
87
213
 
88
- bool IsLoopbackIp(const grpc_resolved_address* address) {
89
- const grpc_sockaddr* sock_addr =
90
- reinterpret_cast<const grpc_sockaddr*>(&address->addr);
91
- if (sock_addr->sa_family == GRPC_AF_INET) {
92
- const grpc_sockaddr_in* addr4 =
93
- reinterpret_cast<const grpc_sockaddr_in*>(sock_addr);
94
- if (addr4->sin_addr.s_addr == grpc_htonl(INADDR_LOOPBACK)) {
95
- return true;
214
+ // A watcher implementation for listening on RDS updates referenced to by a
215
+ // FilterChainMatchManager object. After all referenced RDS resources are
216
+ // fetched (errors are allowed), the FilterChainMatchManager tries to replace
217
+ // the current object. The watcher continues to update the referenced RDS
218
+ // resources so that new XdsServerConfigSelectorProvider objects are created
219
+ // with the latest updates and new connections do not need to wait for the RDS
220
+ // resources to be fetched.
221
+ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
222
+ RouteConfigWatcher : public XdsRouteConfigResourceType::WatcherInterface {
223
+ public:
224
+ RouteConfigWatcher(
225
+ std::string resource_name,
226
+ WeakRefCountedPtr<FilterChainMatchManager> filter_chain_match_manager)
227
+ : resource_name_(std::move(resource_name)),
228
+ filter_chain_match_manager_(std::move(filter_chain_match_manager)) {}
229
+
230
+ void OnResourceChanged(XdsRouteConfigResource route_config) override {
231
+ filter_chain_match_manager_->OnRouteConfigChanged(resource_name_,
232
+ std::move(route_config));
233
+ }
234
+
235
+ void OnError(grpc_error_handle error) override {
236
+ filter_chain_match_manager_->OnError(resource_name_, error);
237
+ }
238
+
239
+ void OnResourceDoesNotExist() override {
240
+ filter_chain_match_manager_->OnResourceDoesNotExist(resource_name_);
241
+ }
242
+
243
+ private:
244
+ std::string resource_name_;
245
+ WeakRefCountedPtr<FilterChainMatchManager> filter_chain_match_manager_;
246
+ };
247
+
248
+ // An implementation of ServerConfigSelector used by
249
+ // StaticXdsServerConfigSelectorProvider and
250
+ // DynamicXdsServerConfigSelectorProvider to parse the RDS update and get
251
+ // per-call configuration based on incoming metadata.
252
+ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
253
+ XdsServerConfigSelector : public ServerConfigSelector {
254
+ public:
255
+ static absl::StatusOr<RefCountedPtr<XdsServerConfigSelector>> Create(
256
+ XdsRouteConfigResource rds_update,
257
+ const std::vector<XdsListenerResource::HttpConnectionManager::HttpFilter>&
258
+ http_filters);
259
+ ~XdsServerConfigSelector() override = default;
260
+
261
+ CallConfig GetCallConfig(grpc_metadata_batch* metadata) override;
262
+
263
+ private:
264
+ struct VirtualHost {
265
+ struct Route {
266
+ // true if an action other than kNonForwardingAction is configured.
267
+ bool unsupported_action;
268
+ XdsRouteConfigResource::Route::Matchers matchers;
269
+ RefCountedPtr<ServiceConfig> method_config;
270
+ };
271
+
272
+ class RouteListIterator : public XdsRouting::RouteListIterator {
273
+ public:
274
+ explicit RouteListIterator(const std::vector<Route>* routes)
275
+ : routes_(routes) {}
276
+
277
+ size_t Size() const override { return routes_->size(); }
278
+
279
+ const XdsRouteConfigResource::Route::Matchers& GetMatchersForRoute(
280
+ size_t index) const override {
281
+ return (*routes_)[index].matchers;
282
+ }
283
+
284
+ private:
285
+ const std::vector<Route>* routes_;
286
+ };
287
+
288
+ std::vector<std::string> domains;
289
+ std::vector<Route> routes;
290
+ };
291
+
292
+ class VirtualHostListIterator : public XdsRouting::VirtualHostListIterator {
293
+ public:
294
+ explicit VirtualHostListIterator(
295
+ const std::vector<VirtualHost>* virtual_hosts)
296
+ : virtual_hosts_(virtual_hosts) {}
297
+
298
+ size_t Size() const override { return virtual_hosts_->size(); }
299
+
300
+ const std::vector<std::string>& GetDomainsForVirtualHost(
301
+ size_t index) const override {
302
+ return (*virtual_hosts_)[index].domains;
96
303
  }
97
- } else if (sock_addr->sa_family == GRPC_AF_INET6) {
98
- const grpc_sockaddr_in6* addr6 =
99
- reinterpret_cast<const grpc_sockaddr_in6*>(sock_addr);
100
- if (memcmp(&addr6->sin6_addr, &in6addr_loopback,
101
- sizeof(in6addr_loopback)) == 0) {
102
- return true;
304
+
305
+ private:
306
+ const std::vector<VirtualHost>* virtual_hosts_;
307
+ };
308
+
309
+ std::vector<VirtualHost> virtual_hosts_;
310
+ };
311
+
312
+ // An XdsServerConfigSelectorProvider implementation for when the
313
+ // RouteConfiguration is available inline.
314
+ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
315
+ StaticXdsServerConfigSelectorProvider
316
+ : public ServerConfigSelectorProvider {
317
+ public:
318
+ StaticXdsServerConfigSelectorProvider(
319
+ absl::StatusOr<XdsRouteConfigResource> static_resource,
320
+ std::vector<XdsListenerResource::HttpConnectionManager::HttpFilter>
321
+ http_filters)
322
+ : static_resource_(std::move(static_resource)),
323
+ http_filters_(std::move(http_filters)) {}
324
+
325
+ absl::StatusOr<RefCountedPtr<ServerConfigSelector>> Watch(
326
+ std::unique_ptr<ServerConfigSelectorProvider::ServerConfigSelectorWatcher>
327
+ watcher) override {
328
+ GPR_ASSERT(watcher_ == nullptr);
329
+ watcher_ = std::move(watcher);
330
+ if (!static_resource_.ok()) {
331
+ return static_resource_.status();
103
332
  }
333
+ return XdsServerConfigSelector::Create(static_resource_.value(),
334
+ http_filters_);
104
335
  }
105
- return false;
336
+
337
+ void Orphan() override {}
338
+
339
+ void CancelWatch() override { watcher_.reset(); }
340
+
341
+ private:
342
+ absl::StatusOr<XdsRouteConfigResource> static_resource_;
343
+ std::vector<XdsListenerResource::HttpConnectionManager::HttpFilter>
344
+ http_filters_;
345
+ std::unique_ptr<ServerConfigSelectorProvider::ServerConfigSelectorWatcher>
346
+ watcher_;
347
+ };
348
+
349
+ // An XdsServerConfigSelectorProvider implementation for when the
350
+ // RouteConfiguration is to be fetched separately via RDS.
351
+ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
352
+ DynamicXdsServerConfigSelectorProvider
353
+ : public ServerConfigSelectorProvider {
354
+ public:
355
+ DynamicXdsServerConfigSelectorProvider(
356
+ RefCountedPtr<XdsClient> xds_client, std::string resource_name,
357
+ absl::StatusOr<XdsRouteConfigResource> initial_resource,
358
+ std::vector<XdsListenerResource::HttpConnectionManager::HttpFilter>
359
+ http_filters);
360
+
361
+ void Orphan() override;
362
+
363
+ absl::StatusOr<RefCountedPtr<ServerConfigSelector>> Watch(
364
+ std::unique_ptr<ServerConfigSelectorProvider::ServerConfigSelectorWatcher>
365
+ watcher) override;
366
+ void CancelWatch() override;
367
+
368
+ private:
369
+ class RouteConfigWatcher;
370
+
371
+ void OnRouteConfigChanged(XdsRouteConfigResource rds_update);
372
+ void OnError(grpc_error_handle error);
373
+ void OnResourceDoesNotExist();
374
+
375
+ RefCountedPtr<XdsClient> xds_client_;
376
+ std::string resource_name_;
377
+ std::vector<XdsListenerResource::HttpConnectionManager::HttpFilter>
378
+ http_filters_;
379
+ RouteConfigWatcher* route_config_watcher_ = nullptr;
380
+ Mutex mu_;
381
+ std::unique_ptr<ServerConfigSelectorProvider::ServerConfigSelectorWatcher>
382
+ watcher_ ABSL_GUARDED_BY(mu_);
383
+ absl::StatusOr<XdsRouteConfigResource> resource_ ABSL_GUARDED_BY(mu_);
384
+ };
385
+
386
+ // A watcher implementation for updating the RDS resource used by
387
+ // DynamicXdsServerConfigSelectorProvider
388
+ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
389
+ DynamicXdsServerConfigSelectorProvider::RouteConfigWatcher
390
+ : public XdsRouteConfigResourceType::WatcherInterface {
391
+ public:
392
+ explicit RouteConfigWatcher(
393
+ WeakRefCountedPtr<DynamicXdsServerConfigSelectorProvider> parent)
394
+ : parent_(std::move(parent)) {}
395
+
396
+ void OnResourceChanged(XdsRouteConfigResource route_config) override {
397
+ parent_->OnRouteConfigChanged(std::move(route_config));
398
+ }
399
+
400
+ void OnError(grpc_error_handle error) override { parent_->OnError(error); }
401
+
402
+ void OnResourceDoesNotExist() override { parent_->OnResourceDoesNotExist(); }
403
+
404
+ private:
405
+ WeakRefCountedPtr<DynamicXdsServerConfigSelectorProvider> parent_;
406
+ };
407
+
408
+ //
409
+ // XdsServerConfigFetcher
410
+ //
411
+
412
+ XdsServerConfigFetcher::XdsServerConfigFetcher(
413
+ RefCountedPtr<XdsClient> xds_client,
414
+ grpc_server_xds_status_notifier notifier)
415
+ : xds_client_(std::move(xds_client)), serving_status_notifier_(notifier) {
416
+ GPR_ASSERT(xds_client_ != nullptr);
417
+ }
418
+
419
+ std::string ListenerResourceName(absl::string_view resource_name_template,
420
+ absl::string_view listening_address) {
421
+ std::string tmp;
422
+ if (absl::StartsWith(resource_name_template, "xdstp:")) {
423
+ tmp = URI::PercentEncodePath(listening_address);
424
+ listening_address = tmp;
425
+ }
426
+ return absl::StrReplaceAll(resource_name_template,
427
+ {{"%s", listening_address}});
428
+ }
429
+
430
+ void XdsServerConfigFetcher::StartWatch(
431
+ std::string listening_address,
432
+ std::unique_ptr<grpc_server_config_fetcher::WatcherInterface> watcher) {
433
+ grpc_server_config_fetcher::WatcherInterface* watcher_ptr = watcher.get();
434
+ auto listener_watcher = MakeRefCounted<ListenerWatcher>(
435
+ xds_client_, std::move(watcher), serving_status_notifier_,
436
+ listening_address);
437
+ auto* listener_watcher_ptr = listener_watcher.get();
438
+ XdsListenerResourceType::StartWatch(
439
+ xds_client_.get(),
440
+ ListenerResourceName(
441
+ xds_client_->bootstrap().server_listener_resource_name_template(),
442
+ listening_address),
443
+ std::move(listener_watcher));
444
+ MutexLock lock(&mu_);
445
+ listener_watchers_.emplace(watcher_ptr, listener_watcher_ptr);
446
+ }
447
+
448
+ void XdsServerConfigFetcher::CancelWatch(
449
+ grpc_server_config_fetcher::WatcherInterface* watcher) {
450
+ MutexLock lock(&mu_);
451
+ auto it = listener_watchers_.find(watcher);
452
+ if (it != listener_watchers_.end()) {
453
+ // Cancel the watch on the listener before erasing
454
+ XdsListenerResourceType::CancelWatch(
455
+ xds_client_.get(),
456
+ ListenerResourceName(
457
+ xds_client_->bootstrap().server_listener_resource_name_template(),
458
+ it->second->listening_address()),
459
+ it->second, false /* delay_unsubscription */);
460
+ listener_watchers_.erase(it);
461
+ }
462
+ }
463
+
464
+ //
465
+ // XdsServerConfigFetcher::ListenerWatcher
466
+ //
467
+
468
+ XdsServerConfigFetcher::ListenerWatcher::ListenerWatcher(
469
+ RefCountedPtr<XdsClient> xds_client,
470
+ std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
471
+ server_config_watcher,
472
+ grpc_server_xds_status_notifier serving_status_notifier,
473
+ std::string listening_address)
474
+ : xds_client_(std::move(xds_client)),
475
+ server_config_watcher_(std::move(server_config_watcher)),
476
+ serving_status_notifier_(serving_status_notifier),
477
+ listening_address_(std::move(listening_address)) {}
478
+
479
+ void XdsServerConfigFetcher::ListenerWatcher::OnResourceChanged(
480
+ XdsListenerResource listener) {
481
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_server_config_fetcher_trace)) {
482
+ gpr_log(GPR_INFO,
483
+ "[ListenerWatcher %p] Received LDS update from xds client %p: %s",
484
+ this, xds_client_.get(), listener.ToString().c_str());
485
+ }
486
+ if (listener.address != listening_address_) {
487
+ MutexLock lock(&mu_);
488
+ OnFatalError(absl::FailedPreconditionError(
489
+ "Address in LDS update does not match listening address"));
490
+ return;
491
+ }
492
+ auto new_filter_chain_match_manager = MakeRefCounted<FilterChainMatchManager>(
493
+ xds_client_, std::move(listener.filter_chain_map),
494
+ std::move(listener.default_filter_chain));
495
+ MutexLock lock(&mu_);
496
+ if (filter_chain_match_manager_ == nullptr ||
497
+ !(new_filter_chain_match_manager->filter_chain_map() ==
498
+ filter_chain_match_manager_->filter_chain_map() &&
499
+ new_filter_chain_match_manager->default_filter_chain() ==
500
+ filter_chain_match_manager_->default_filter_chain())) {
501
+ pending_filter_chain_match_manager_ =
502
+ std::move(new_filter_chain_match_manager);
503
+ if (XdsRbacEnabled()) {
504
+ pending_filter_chain_match_manager_->StartRdsWatch(Ref());
505
+ } else {
506
+ PendingFilterChainMatchManagerReadyLocked(
507
+ pending_filter_chain_match_manager_.get());
508
+ }
509
+ }
510
+ }
511
+
512
+ void XdsServerConfigFetcher::ListenerWatcher::OnError(grpc_error_handle error) {
513
+ MutexLock lock(&mu_);
514
+ if (filter_chain_match_manager_ != nullptr ||
515
+ pending_filter_chain_match_manager_ != nullptr) {
516
+ gpr_log(GPR_ERROR,
517
+ "ListenerWatcher:%p XdsClient reports error: %s for %s; "
518
+ "ignoring in favor of existing resource",
519
+ this, grpc_error_std_string(error).c_str(),
520
+ listening_address_.c_str());
521
+ } else {
522
+ if (serving_status_notifier_.on_serving_status_update != nullptr) {
523
+ serving_status_notifier_.on_serving_status_update(
524
+ serving_status_notifier_.user_data, listening_address_.c_str(),
525
+ {GRPC_STATUS_UNAVAILABLE, grpc_error_std_string(error).c_str()});
526
+ } else {
527
+ gpr_log(GPR_ERROR,
528
+ "ListenerWatcher:%p error obtaining xDS Listener resource: %s; "
529
+ "not serving on %s",
530
+ this, grpc_error_std_string(error).c_str(),
531
+ listening_address_.c_str());
532
+ }
533
+ }
534
+ GRPC_ERROR_UNREF(error);
535
+ }
536
+
537
+ void XdsServerConfigFetcher::ListenerWatcher::OnFatalError(
538
+ absl::Status status) {
539
+ pending_filter_chain_match_manager_.reset();
540
+ if (filter_chain_match_manager_ != nullptr) {
541
+ // The server has started listening already, so we need to gracefully
542
+ // stop serving.
543
+ server_config_watcher_->StopServing();
544
+ filter_chain_match_manager_.reset();
545
+ }
546
+ if (serving_status_notifier_.on_serving_status_update != nullptr) {
547
+ serving_status_notifier_.on_serving_status_update(
548
+ serving_status_notifier_.user_data, listening_address_.c_str(),
549
+ {static_cast<grpc_status_code>(status.raw_code()),
550
+ std::string(status.message()).c_str()});
551
+ } else {
552
+ gpr_log(GPR_ERROR,
553
+ "ListenerWatcher:%p Encountered fatal error %s; not serving on %s",
554
+ this, status.ToString().c_str(), listening_address_.c_str());
555
+ }
556
+ }
557
+
558
+ void XdsServerConfigFetcher::ListenerWatcher::OnResourceDoesNotExist() {
559
+ MutexLock lock(&mu_);
560
+ OnFatalError(absl::NotFoundError("Requested listener does not exist"));
561
+ }
562
+
563
+ void XdsServerConfigFetcher::ListenerWatcher::
564
+ PendingFilterChainMatchManagerReadyLocked(
565
+ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager*
566
+ filter_chain_match_manager) {
567
+ if (pending_filter_chain_match_manager_ != filter_chain_match_manager) {
568
+ // This FilterChainMatchManager is no longer the current pending resource.
569
+ // It should get cleaned up eventually. Ignore this update.
570
+ return;
571
+ }
572
+ // Let the logger know about the update if there was no previous good update.
573
+ if (filter_chain_match_manager_ == nullptr) {
574
+ if (serving_status_notifier_.on_serving_status_update != nullptr) {
575
+ serving_status_notifier_.on_serving_status_update(
576
+ serving_status_notifier_.user_data, listening_address_.c_str(),
577
+ {GRPC_STATUS_OK, ""});
578
+ } else {
579
+ gpr_log(GPR_INFO,
580
+ "xDS Listener resource obtained; will start serving on %s",
581
+ listening_address_.c_str());
582
+ }
583
+ }
584
+ // Promote the pending FilterChainMatchManager
585
+ filter_chain_match_manager_ = std::move(pending_filter_chain_match_manager_);
586
+ // TODO(yashykt): Right now, the server_config_watcher_ does not invoke
587
+ // XdsServerConfigFetcher while holding a lock, but that might change in the
588
+ // future in which case we would want to execute this update outside the
589
+ // critical region through a WorkSerializer similar to XdsClient.
590
+ server_config_watcher_->UpdateConnectionManager(filter_chain_match_manager_);
591
+ }
592
+
593
+ //
594
+ // XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager
595
+ //
596
+
597
+ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
598
+ FilterChainMatchManager(
599
+ RefCountedPtr<XdsClient> xds_client,
600
+ XdsListenerResource::FilterChainMap filter_chain_map,
601
+ absl::optional<XdsListenerResource::FilterChainData>
602
+ default_filter_chain)
603
+ : xds_client_(std::move(xds_client)),
604
+ filter_chain_map_(std::move(filter_chain_map)),
605
+ default_filter_chain_(std::move(default_filter_chain)) {}
606
+
607
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
608
+ StartRdsWatch(RefCountedPtr<ListenerWatcher> listener_watcher) {
609
+ // Get the set of RDS resources to watch on. Also get the set of
610
+ // FilterChainData so that we can reverse the list of HTTP filters since
611
+ // received data moves *up* the stack in Core.
612
+ std::set<std::string> resource_names;
613
+ std::set<XdsListenerResource::FilterChainData*> filter_chain_data_set;
614
+ for (const auto& destination_ip : filter_chain_map_.destination_ip_vector) {
615
+ for (const auto& source_type : destination_ip.source_types_array) {
616
+ for (const auto& source_ip : source_type) {
617
+ for (const auto& source_port_pair : source_ip.ports_map) {
618
+ if (!source_port_pair.second.data->http_connection_manager
619
+ .route_config_name.empty()) {
620
+ resource_names.insert(
621
+ source_port_pair.second.data->http_connection_manager
622
+ .route_config_name);
623
+ }
624
+ filter_chain_data_set.insert(source_port_pair.second.data.get());
625
+ }
626
+ }
627
+ }
628
+ }
629
+ if (default_filter_chain_.has_value()) {
630
+ if (!default_filter_chain_->http_connection_manager.route_config_name
631
+ .empty()) {
632
+ resource_names.insert(
633
+ default_filter_chain_->http_connection_manager.route_config_name);
634
+ }
635
+ std::reverse(
636
+ default_filter_chain_->http_connection_manager.http_filters.begin(),
637
+ default_filter_chain_->http_connection_manager.http_filters.end());
638
+ }
639
+ // Reverse the lists of HTTP filters in all the filter chains
640
+ for (auto* filter_chain_data : filter_chain_data_set) {
641
+ std::reverse(
642
+ filter_chain_data->http_connection_manager.http_filters.begin(),
643
+ filter_chain_data->http_connection_manager.http_filters.end());
644
+ }
645
+ // Start watching on referenced RDS resources
646
+ struct WatcherToStart {
647
+ std::string resource_name;
648
+ RefCountedPtr<RouteConfigWatcher> watcher;
649
+ };
650
+ std::vector<WatcherToStart> watchers_to_start;
651
+ watchers_to_start.reserve(resource_names.size());
652
+ {
653
+ MutexLock lock(&mu_);
654
+ for (const auto& resource_name : resource_names) {
655
+ ++rds_resources_yet_to_fetch_;
656
+ auto route_config_watcher =
657
+ MakeRefCounted<RouteConfigWatcher>(resource_name, WeakRef());
658
+ rds_map_.emplace(resource_name, RdsUpdateState{route_config_watcher.get(),
659
+ absl::nullopt});
660
+ watchers_to_start.push_back(
661
+ WatcherToStart{resource_name, std::move(route_config_watcher)});
662
+ }
663
+ if (rds_resources_yet_to_fetch_ != 0) {
664
+ listener_watcher_ = std::move(listener_watcher);
665
+ listener_watcher = nullptr;
666
+ }
667
+ }
668
+ for (auto& watcher_to_start : watchers_to_start) {
669
+ XdsRouteConfigResourceType::StartWatch(xds_client_.get(),
670
+ watcher_to_start.resource_name,
671
+ std::move(watcher_to_start.watcher));
672
+ }
673
+ // Promote this filter chain match manager if all referenced resources are
674
+ // fetched.
675
+ if (listener_watcher != nullptr) {
676
+ listener_watcher->PendingFilterChainMatchManagerReadyLocked(this);
677
+ }
678
+ }
679
+
680
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
681
+ Orphan() {
682
+ MutexLock lock(&mu_);
683
+ // Cancel the RDS watches to clear up the weak refs
684
+ for (const auto& entry : rds_map_) {
685
+ XdsRouteConfigResourceType::CancelWatch(xds_client_.get(), entry.first,
686
+ entry.second.watcher,
687
+ false /* delay_unsubscription */);
688
+ }
689
+ // Also give up the ref on ListenerWatcher since it won't be needed anymore
690
+ listener_watcher_.reset();
691
+ }
692
+
693
+ absl::StatusOr<RefCountedPtr<XdsCertificateProvider>>
694
+ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
695
+ CreateOrGetXdsCertificateProviderFromFilterChainData(
696
+ const XdsListenerResource::FilterChainData* filter_chain) {
697
+ MutexLock lock(&mu_);
698
+ auto it = certificate_providers_map_.find(filter_chain);
699
+ if (it != certificate_providers_map_.end()) {
700
+ return it->second.xds;
701
+ }
702
+ CertificateProviders certificate_providers;
703
+ // Configure root cert.
704
+ absl::string_view root_provider_instance_name =
705
+ filter_chain->downstream_tls_context.common_tls_context
706
+ .certificate_validation_context.ca_certificate_provider_instance
707
+ .instance_name;
708
+ absl::string_view root_provider_cert_name =
709
+ filter_chain->downstream_tls_context.common_tls_context
710
+ .certificate_validation_context.ca_certificate_provider_instance
711
+ .certificate_name;
712
+ if (!root_provider_instance_name.empty()) {
713
+ certificate_providers.root =
714
+ xds_client_->certificate_provider_store()
715
+ .CreateOrGetCertificateProvider(root_provider_instance_name);
716
+ if (certificate_providers.root == nullptr) {
717
+ return absl::NotFoundError(
718
+ absl::StrCat("Certificate provider instance name: \"",
719
+ root_provider_instance_name, "\" not recognized."));
720
+ }
721
+ }
722
+ // Configure identity cert.
723
+ absl::string_view identity_provider_instance_name =
724
+ filter_chain->downstream_tls_context.common_tls_context
725
+ .tls_certificate_provider_instance.instance_name;
726
+ absl::string_view identity_provider_cert_name =
727
+ filter_chain->downstream_tls_context.common_tls_context
728
+ .tls_certificate_provider_instance.certificate_name;
729
+ if (!identity_provider_instance_name.empty()) {
730
+ certificate_providers.instance =
731
+ xds_client_->certificate_provider_store()
732
+ .CreateOrGetCertificateProvider(identity_provider_instance_name);
733
+ if (certificate_providers.instance == nullptr) {
734
+ return absl::NotFoundError(
735
+ absl::StrCat("Certificate provider instance name: \"",
736
+ identity_provider_instance_name, "\" not recognized."));
737
+ }
738
+ }
739
+ certificate_providers.xds = MakeRefCounted<XdsCertificateProvider>();
740
+ certificate_providers.xds->UpdateRootCertNameAndDistributor(
741
+ "", root_provider_cert_name,
742
+ certificate_providers.root == nullptr
743
+ ? nullptr
744
+ : certificate_providers.root->distributor());
745
+ certificate_providers.xds->UpdateIdentityCertNameAndDistributor(
746
+ "", identity_provider_cert_name,
747
+ certificate_providers.instance == nullptr
748
+ ? nullptr
749
+ : certificate_providers.instance->distributor());
750
+ certificate_providers.xds->UpdateRequireClientCertificate(
751
+ "", filter_chain->downstream_tls_context.require_client_certificate);
752
+ auto xds_certificate_provider = certificate_providers.xds;
753
+ certificate_providers_map_.emplace(filter_chain,
754
+ std::move(certificate_providers));
755
+ return xds_certificate_provider;
756
+ }
757
+
758
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
759
+ OnRouteConfigChanged(const std::string& resource_name,
760
+ XdsRouteConfigResource route_config) {
761
+ RefCountedPtr<ListenerWatcher> listener_watcher;
762
+ {
763
+ MutexLock lock(&mu_);
764
+ auto& state = rds_map_[resource_name];
765
+ if (!state.rds_update.has_value()) {
766
+ if (--rds_resources_yet_to_fetch_ == 0) {
767
+ listener_watcher = std::move(listener_watcher_);
768
+ }
769
+ }
770
+ state.rds_update = std::move(route_config);
771
+ }
772
+ // Promote the filter chain match manager object if all the referenced
773
+ // resources are fetched.
774
+ if (listener_watcher != nullptr) {
775
+ listener_watcher->PendingFilterChainMatchManagerReady(this);
776
+ }
777
+ }
778
+
779
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::OnError(
780
+ const std::string& resource_name, grpc_error_handle error) {
781
+ RefCountedPtr<ListenerWatcher> listener_watcher;
782
+ {
783
+ MutexLock lock(&mu_);
784
+ auto& state = rds_map_[resource_name];
785
+ if (!state.rds_update.has_value()) {
786
+ if (--rds_resources_yet_to_fetch_ == 0) {
787
+ listener_watcher = std::move(listener_watcher_);
788
+ }
789
+ state.rds_update = grpc_error_to_absl_status(error);
790
+ } else {
791
+ // Prefer existing good version over current errored version
792
+ if (!state.rds_update->ok()) {
793
+ state.rds_update = grpc_error_to_absl_status(error);
794
+ }
795
+ }
796
+ }
797
+ // Promote the filter chain match manager object if all the referenced
798
+ // resources are fetched.
799
+ if (listener_watcher != nullptr) {
800
+ listener_watcher->PendingFilterChainMatchManagerReady(this);
801
+ }
802
+ GRPC_ERROR_UNREF(error);
106
803
  }
107
804
 
108
- const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForSourcePort(
109
- const XdsApi::LdsUpdate::FilterChainMap::SourcePortsMap& source_ports_map,
805
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
806
+ OnResourceDoesNotExist(const std::string& resource_name) {
807
+ RefCountedPtr<ListenerWatcher> listener_watcher;
808
+ {
809
+ MutexLock lock(&mu_);
810
+ auto& state = rds_map_[resource_name];
811
+ if (!state.rds_update.has_value()) {
812
+ if (--rds_resources_yet_to_fetch_ == 0) {
813
+ listener_watcher = std::move(listener_watcher_);
814
+ }
815
+ }
816
+ state.rds_update =
817
+ absl::NotFoundError("Requested route config does not exist");
818
+ }
819
+ // Promote the filter chain match manager object if all the referenced
820
+ // resources are fetched.
821
+ if (listener_watcher != nullptr) {
822
+ listener_watcher->PendingFilterChainMatchManagerReady(this);
823
+ }
824
+ }
825
+
826
+ const XdsListenerResource::FilterChainData* FindFilterChainDataForSourcePort(
827
+ const XdsListenerResource::FilterChainMap::SourcePortsMap& source_ports_map,
110
828
  absl::string_view port_str) {
111
829
  int port = 0;
112
830
  if (!absl::SimpleAtoi(port_str, &port)) return nullptr;
@@ -122,10 +840,10 @@ const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForSourcePort(
122
840
  return nullptr;
123
841
  }
124
842
 
125
- const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForSourceIp(
126
- const XdsApi::LdsUpdate::FilterChainMap::SourceIpVector& source_ip_vector,
843
+ const XdsListenerResource::FilterChainData* FindFilterChainDataForSourceIp(
844
+ const XdsListenerResource::FilterChainMap::SourceIpVector& source_ip_vector,
127
845
  const grpc_resolved_address* source_ip, absl::string_view port) {
128
- const XdsApi::LdsUpdate::FilterChainMap::SourceIp* best_match = nullptr;
846
+ const XdsListenerResource::FilterChainMap::SourceIp* best_match = nullptr;
129
847
  for (const auto& entry : source_ip_vector) {
130
848
  // Special case for catch-all
131
849
  if (!entry.prefix_range.has_value()) {
@@ -148,8 +866,28 @@ const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForSourceIp(
148
866
  return FindFilterChainDataForSourcePort(best_match->ports_map, port);
149
867
  }
150
868
 
151
- const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForSourceType(
152
- const XdsApi::LdsUpdate::FilterChainMap::ConnectionSourceTypesArray&
869
+ bool IsLoopbackIp(const grpc_resolved_address* address) {
870
+ const grpc_sockaddr* sock_addr =
871
+ reinterpret_cast<const grpc_sockaddr*>(&address->addr);
872
+ if (sock_addr->sa_family == GRPC_AF_INET) {
873
+ const grpc_sockaddr_in* addr4 =
874
+ reinterpret_cast<const grpc_sockaddr_in*>(sock_addr);
875
+ if (addr4->sin_addr.s_addr == grpc_htonl(INADDR_LOOPBACK)) {
876
+ return true;
877
+ }
878
+ } else if (sock_addr->sa_family == GRPC_AF_INET6) {
879
+ const grpc_sockaddr_in6* addr6 =
880
+ reinterpret_cast<const grpc_sockaddr_in6*>(sock_addr);
881
+ if (memcmp(&addr6->sin6_addr, &in6addr_loopback,
882
+ sizeof(in6addr_loopback)) == 0) {
883
+ return true;
884
+ }
885
+ }
886
+ return false;
887
+ }
888
+
889
+ const XdsListenerResource::FilterChainData* FindFilterChainDataForSourceType(
890
+ const XdsListenerResource::FilterChainMap::ConnectionSourceTypesArray&
153
891
  source_types_array,
154
892
  grpc_endpoint* tcp, absl::string_view destination_ip) {
155
893
  auto source_uri = URI::Parse(grpc_endpoint_get_peer(tcp));
@@ -173,34 +911,34 @@ const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForSourceType(
173
911
  }
174
912
  // Use kAny only if kSameIporLoopback and kExternal are empty
175
913
  if (source_types_array[static_cast<int>(
176
- XdsApi::LdsUpdate::FilterChainMap::
914
+ XdsListenerResource::FilterChainMap::
177
915
  ConnectionSourceType::kSameIpOrLoopback)]
178
916
  .empty() &&
179
- source_types_array[static_cast<int>(XdsApi::LdsUpdate::FilterChainMap::
917
+ source_types_array[static_cast<int>(XdsListenerResource::FilterChainMap::
180
918
  ConnectionSourceType::kExternal)]
181
919
  .empty()) {
182
920
  return FindFilterChainDataForSourceIp(
183
921
  source_types_array[static_cast<int>(
184
- XdsApi::LdsUpdate::FilterChainMap::ConnectionSourceType::kAny)],
922
+ XdsListenerResource::FilterChainMap::ConnectionSourceType::kAny)],
185
923
  &source_addr, port);
186
924
  }
187
925
  if (IsLoopbackIp(&source_addr) || host == destination_ip) {
188
926
  return FindFilterChainDataForSourceIp(
189
927
  source_types_array[static_cast<int>(
190
- XdsApi::LdsUpdate::FilterChainMap::ConnectionSourceType::
928
+ XdsListenerResource::FilterChainMap::ConnectionSourceType::
191
929
  kSameIpOrLoopback)],
192
930
  &source_addr, port);
193
931
  } else {
194
932
  return FindFilterChainDataForSourceIp(
195
933
  source_types_array[static_cast<int>(
196
- XdsApi::LdsUpdate::FilterChainMap::ConnectionSourceType::
934
+ XdsListenerResource::FilterChainMap::ConnectionSourceType::
197
935
  kExternal)],
198
936
  &source_addr, port);
199
937
  }
200
938
  }
201
939
 
202
- const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForDestinationIp(
203
- const XdsApi::LdsUpdate::FilterChainMap::DestinationIpVector
940
+ const XdsListenerResource::FilterChainData* FindFilterChainDataForDestinationIp(
941
+ const XdsListenerResource::FilterChainMap::DestinationIpVector
204
942
  destination_ip_vector,
205
943
  grpc_endpoint* tcp) {
206
944
  auto destination_uri = URI::Parse(grpc_endpoint_get_local_address(tcp));
@@ -222,7 +960,8 @@ const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForDestinationIp(
222
960
  GRPC_ERROR_UNREF(error);
223
961
  return nullptr;
224
962
  }
225
- const XdsApi::LdsUpdate::FilterChainMap::DestinationIp* best_match = nullptr;
963
+ const XdsListenerResource::FilterChainMap::DestinationIp* best_match =
964
+ nullptr;
226
965
  for (const auto& entry : destination_ip_vector) {
227
966
  // Special case for catch-all
228
967
  if (!entry.prefix_range.has_value()) {
@@ -247,73 +986,9 @@ const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForDestinationIp(
247
986
  host);
248
987
  }
249
988
 
250
- absl::StatusOr<RefCountedPtr<XdsCertificateProvider>>
251
- FilterChainMatchManager::CreateOrGetXdsCertificateProviderFromFilterChainData(
252
- const XdsApi::LdsUpdate::FilterChainData* filter_chain) {
253
- MutexLock lock(&mu_);
254
- auto it = certificate_providers_map_.find(filter_chain);
255
- if (it != certificate_providers_map_.end()) {
256
- return it->second.xds;
257
- }
258
- CertificateProviders certificate_providers;
259
- // Configure root cert.
260
- absl::string_view root_provider_instance_name =
261
- filter_chain->downstream_tls_context.common_tls_context
262
- .certificate_validation_context.ca_certificate_provider_instance
263
- .instance_name;
264
- absl::string_view root_provider_cert_name =
265
- filter_chain->downstream_tls_context.common_tls_context
266
- .certificate_validation_context.ca_certificate_provider_instance
267
- .certificate_name;
268
- if (!root_provider_instance_name.empty()) {
269
- certificate_providers.root =
270
- xds_client_->certificate_provider_store()
271
- .CreateOrGetCertificateProvider(root_provider_instance_name);
272
- if (certificate_providers.root == nullptr) {
273
- return absl::NotFoundError(
274
- absl::StrCat("Certificate provider instance name: \"",
275
- root_provider_instance_name, "\" not recognized."));
276
- }
277
- }
278
- // Configure identity cert.
279
- absl::string_view identity_provider_instance_name =
280
- filter_chain->downstream_tls_context.common_tls_context
281
- .tls_certificate_provider_instance.instance_name;
282
- absl::string_view identity_provider_cert_name =
283
- filter_chain->downstream_tls_context.common_tls_context
284
- .tls_certificate_provider_instance.certificate_name;
285
- if (!identity_provider_instance_name.empty()) {
286
- certificate_providers.instance =
287
- xds_client_->certificate_provider_store()
288
- .CreateOrGetCertificateProvider(identity_provider_instance_name);
289
- if (certificate_providers.instance == nullptr) {
290
- return absl::NotFoundError(
291
- absl::StrCat("Certificate provider instance name: \"",
292
- identity_provider_instance_name, "\" not recognized."));
293
- }
294
- }
295
- certificate_providers.xds = MakeRefCounted<XdsCertificateProvider>();
296
- certificate_providers.xds->UpdateRootCertNameAndDistributor(
297
- "", root_provider_cert_name,
298
- certificate_providers.root == nullptr
299
- ? nullptr
300
- : certificate_providers.root->distributor());
301
- certificate_providers.xds->UpdateIdentityCertNameAndDistributor(
302
- "", identity_provider_cert_name,
303
- certificate_providers.instance == nullptr
304
- ? nullptr
305
- : certificate_providers.instance->distributor());
306
- certificate_providers.xds->UpdateRequireClientCertificate(
307
- "", filter_chain->downstream_tls_context.require_client_certificate);
308
- auto xds_certificate_provider = certificate_providers.xds;
309
- certificate_providers_map_.emplace(filter_chain,
310
- std::move(certificate_providers));
311
- return xds_certificate_provider;
312
- }
313
-
314
- absl::StatusOr<grpc_channel_args*>
315
- FilterChainMatchManager::UpdateChannelArgsForConnection(grpc_channel_args* args,
316
- grpc_endpoint* tcp) {
989
+ absl::StatusOr<grpc_channel_args*> XdsServerConfigFetcher::ListenerWatcher::
990
+ FilterChainMatchManager::UpdateChannelArgsForConnection(
991
+ grpc_channel_args* args, grpc_endpoint* tcp) {
317
992
  const auto* filter_chain = FindFilterChainDataForDestinationIp(
318
993
  filter_chain_map_.destination_ip_vector, tcp);
319
994
  if (filter_chain == nullptr && default_filter_chain_.has_value()) {
@@ -323,199 +998,289 @@ FilterChainMatchManager::UpdateChannelArgsForConnection(grpc_channel_args* args,
323
998
  grpc_channel_args_destroy(args);
324
999
  return absl::UnavailableError("No matching filter chain found");
325
1000
  }
326
- // Nothing to update if credentials are not xDS.
1001
+ absl::InlinedVector<grpc_arg, 3> args_to_add;
1002
+ RefCountedPtr<ServerConfigSelectorProvider> server_config_selector_provider;
1003
+ RefCountedPtr<XdsChannelStackModifier> channel_stack_modifier;
1004
+ RefCountedPtr<XdsCertificateProvider> xds_certificate_provider;
1005
+ // Add config selector filter
1006
+ if (XdsRbacEnabled()) {
1007
+ std::vector<const grpc_channel_filter*> filters;
1008
+ // Iterate the list of HTTP filters in reverse since in Core, received data
1009
+ // flows *up* the stack.
1010
+ for (const auto& http_filter :
1011
+ filter_chain->http_connection_manager.http_filters) {
1012
+ // Find filter. This is guaranteed to succeed, because it's checked
1013
+ // at config validation time in the XdsApi code.
1014
+ const XdsHttpFilterImpl* filter_impl =
1015
+ XdsHttpFilterRegistry::GetFilterForType(
1016
+ http_filter.config.config_proto_type_name);
1017
+ GPR_ASSERT(filter_impl != nullptr);
1018
+ // Some filters like the router filter are no-op filters and do not have
1019
+ // an implementation.
1020
+ if (filter_impl->channel_filter() != nullptr) {
1021
+ filters.push_back(filter_impl->channel_filter());
1022
+ }
1023
+ }
1024
+ filters.push_back(&kServerConfigSelectorFilter);
1025
+ channel_stack_modifier =
1026
+ MakeRefCounted<XdsChannelStackModifier>(std::move(filters));
1027
+ if (filter_chain->http_connection_manager.rds_update.has_value()) {
1028
+ server_config_selector_provider =
1029
+ MakeRefCounted<StaticXdsServerConfigSelectorProvider>(
1030
+ filter_chain->http_connection_manager.rds_update.value(),
1031
+ filter_chain->http_connection_manager.http_filters);
1032
+ } else {
1033
+ absl::StatusOr<XdsRouteConfigResource> initial_resource;
1034
+ {
1035
+ MutexLock lock(&mu_);
1036
+ initial_resource =
1037
+ rds_map_[filter_chain->http_connection_manager.route_config_name]
1038
+ .rds_update.value();
1039
+ }
1040
+ server_config_selector_provider =
1041
+ MakeRefCounted<DynamicXdsServerConfigSelectorProvider>(
1042
+ xds_client_,
1043
+ filter_chain->http_connection_manager.route_config_name,
1044
+ std::move(initial_resource),
1045
+ filter_chain->http_connection_manager.http_filters);
1046
+ }
1047
+ args_to_add.emplace_back(server_config_selector_provider->MakeChannelArg());
1048
+ args_to_add.emplace_back(channel_stack_modifier->MakeChannelArg());
1049
+ }
1050
+ // Add XdsCertificateProvider if credentials are xDS.
327
1051
  grpc_server_credentials* server_creds =
328
1052
  grpc_find_server_credentials_in_args(args);
329
- if (server_creds == nullptr || server_creds->type() != kCredentialsTypeXds) {
330
- return args;
1053
+ if (server_creds != nullptr && server_creds->type() == kCredentialsTypeXds) {
1054
+ absl::StatusOr<RefCountedPtr<XdsCertificateProvider>> result =
1055
+ CreateOrGetXdsCertificateProviderFromFilterChainData(filter_chain);
1056
+ if (!result.ok()) {
1057
+ grpc_channel_args_destroy(args);
1058
+ return result.status();
1059
+ }
1060
+ xds_certificate_provider = std::move(*result);
1061
+ GPR_ASSERT(xds_certificate_provider != nullptr);
1062
+ args_to_add.emplace_back(xds_certificate_provider->MakeChannelArg());
331
1063
  }
332
- absl::StatusOr<RefCountedPtr<XdsCertificateProvider>> result =
333
- CreateOrGetXdsCertificateProviderFromFilterChainData(filter_chain);
334
- if (!result.ok()) {
1064
+ if (!args_to_add.empty()) {
1065
+ grpc_channel_args* updated_args = grpc_channel_args_copy_and_add(
1066
+ args, args_to_add.data(), args_to_add.size());
335
1067
  grpc_channel_args_destroy(args);
336
- return result.status();
337
- }
338
- RefCountedPtr<XdsCertificateProvider> xds_certificate_provider =
339
- std::move(*result);
340
- GPR_ASSERT(xds_certificate_provider != nullptr);
341
- grpc_arg arg_to_add = xds_certificate_provider->MakeChannelArg();
342
- grpc_channel_args* updated_args =
343
- grpc_channel_args_copy_and_add(args, &arg_to_add, 1);
344
- grpc_channel_args_destroy(args);
345
- return updated_args;
1068
+ args = updated_args;
1069
+ }
1070
+ return args;
346
1071
  }
347
1072
 
348
- class XdsServerConfigFetcher : public grpc_server_config_fetcher {
349
- public:
350
- explicit XdsServerConfigFetcher(RefCountedPtr<XdsClient> xds_client,
351
- grpc_server_xds_status_notifier notifier)
352
- : xds_client_(std::move(xds_client)), serving_status_notifier_(notifier) {
353
- GPR_ASSERT(xds_client_ != nullptr);
354
- }
1073
+ //
1074
+ // XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::XdsServerConfigSelector
1075
+ //
355
1076
 
356
- void StartWatch(std::string listening_address, grpc_channel_args* args,
357
- std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
358
- watcher) override {
359
- grpc_server_config_fetcher::WatcherInterface* watcher_ptr = watcher.get();
360
- auto listener_watcher = absl::make_unique<ListenerWatcher>(
361
- std::move(watcher), args, xds_client_, serving_status_notifier_,
362
- listening_address);
363
- auto* listener_watcher_ptr = listener_watcher.get();
364
- listening_address = absl::StrReplaceAll(
365
- xds_client_->bootstrap().server_listener_resource_name_template(),
366
- {{"%s", listening_address}});
367
- xds_client_->WatchListenerData(listening_address,
368
- std::move(listener_watcher));
369
- MutexLock lock(&mu_);
370
- auto& watcher_state = watchers_[watcher_ptr];
371
- watcher_state.listening_address = listening_address;
372
- watcher_state.listener_watcher = listener_watcher_ptr;
1077
+ absl::StatusOr<
1078
+ RefCountedPtr<XdsServerConfigFetcher::ListenerWatcher::
1079
+ FilterChainMatchManager::XdsServerConfigSelector>>
1080
+ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1081
+ XdsServerConfigSelector::Create(
1082
+ XdsRouteConfigResource rds_update,
1083
+ const std::vector<
1084
+ XdsListenerResource::HttpConnectionManager::HttpFilter>&
1085
+ http_filters) {
1086
+ auto config_selector = MakeRefCounted<XdsServerConfigSelector>();
1087
+ for (auto& vhost : rds_update.virtual_hosts) {
1088
+ config_selector->virtual_hosts_.emplace_back();
1089
+ auto& virtual_host = config_selector->virtual_hosts_.back();
1090
+ virtual_host.domains = std::move(vhost.domains);
1091
+ for (auto& route : vhost.routes) {
1092
+ virtual_host.routes.emplace_back();
1093
+ auto& config_selector_route = virtual_host.routes.back();
1094
+ config_selector_route.matchers = std::move(route.matchers);
1095
+ config_selector_route.unsupported_action =
1096
+ absl::get_if<XdsRouteConfigResource::Route::NonForwardingAction>(
1097
+ &route.action) == nullptr;
1098
+ XdsRouting::GeneratePerHttpFilterConfigsResult result =
1099
+ XdsRouting::GeneratePerHTTPFilterConfigs(http_filters, vhost, route,
1100
+ nullptr, nullptr);
1101
+ if (result.error != GRPC_ERROR_NONE) {
1102
+ return grpc_error_to_absl_status(result.error);
1103
+ }
1104
+ std::vector<std::string> fields;
1105
+ fields.reserve(result.per_filter_configs.size());
1106
+ for (const auto& p : result.per_filter_configs) {
1107
+ fields.emplace_back(absl::StrCat(" \"", p.first, "\": [\n",
1108
+ absl::StrJoin(p.second, ",\n"),
1109
+ "\n ]"));
1110
+ }
1111
+ if (!fields.empty()) {
1112
+ std::string json = absl::StrCat(
1113
+ "{\n"
1114
+ " \"methodConfig\": [ {\n"
1115
+ " \"name\": [\n"
1116
+ " {}\n"
1117
+ " ],\n"
1118
+ " ",
1119
+ absl::StrJoin(fields, ",\n"),
1120
+ "\n } ]\n"
1121
+ "}");
1122
+ grpc_error_handle error = GRPC_ERROR_NONE;
1123
+ config_selector_route.method_config =
1124
+ ServiceConfig::Create(result.args, json.c_str(), &error);
1125
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
1126
+ }
1127
+ grpc_channel_args_destroy(result.args);
1128
+ }
373
1129
  }
1130
+ return config_selector;
1131
+ }
374
1132
 
375
- void CancelWatch(
376
- grpc_server_config_fetcher::WatcherInterface* watcher) override {
377
- MutexLock lock(&mu_);
378
- auto it = watchers_.find(watcher);
379
- if (it != watchers_.end()) {
380
- // Cancel the watch on the listener before erasing
381
- xds_client_->CancelListenerDataWatch(it->second.listening_address,
382
- it->second.listener_watcher,
383
- false /* delay_unsubscription */);
384
- watchers_.erase(it);
1133
+ ServerConfigSelector::CallConfig XdsServerConfigFetcher::ListenerWatcher::
1134
+ FilterChainMatchManager::XdsServerConfigSelector::GetCallConfig(
1135
+ grpc_metadata_batch* metadata) {
1136
+ CallConfig call_config;
1137
+ if (metadata->get_pointer(HttpPathMetadata()) == nullptr) {
1138
+ call_config.error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("No path found");
1139
+ return call_config;
1140
+ }
1141
+ absl::string_view path =
1142
+ metadata->get_pointer(HttpPathMetadata())->as_string_view();
1143
+ if (metadata->get_pointer(HttpAuthorityMetadata()) == nullptr) {
1144
+ call_config.error =
1145
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("No authority found");
1146
+ return call_config;
1147
+ }
1148
+ absl::string_view authority =
1149
+ metadata->get_pointer(HttpAuthorityMetadata())->as_string_view();
1150
+ auto vhost_index = XdsRouting::FindVirtualHostForDomain(
1151
+ VirtualHostListIterator(&virtual_hosts_), authority);
1152
+ if (!vhost_index.has_value()) {
1153
+ call_config.error =
1154
+ grpc_error_set_int(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
1155
+ "could not find VirtualHost for ", authority,
1156
+ " in RouteConfiguration")),
1157
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
1158
+ return call_config;
1159
+ }
1160
+ auto& virtual_host = virtual_hosts_[vhost_index.value()];
1161
+ auto route_index = XdsRouting::GetRouteForRequest(
1162
+ VirtualHost::RouteListIterator(&virtual_host.routes), path, metadata);
1163
+ if (route_index.has_value()) {
1164
+ auto& route = virtual_host.routes[route_index.value()];
1165
+ // Found the matching route
1166
+ if (route.unsupported_action) {
1167
+ call_config.error = grpc_error_set_int(
1168
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1169
+ "Matching route has unsupported action"),
1170
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
1171
+ return call_config;
1172
+ }
1173
+ if (route.method_config != nullptr) {
1174
+ call_config.method_configs =
1175
+ route.method_config->GetMethodParsedConfigVector(grpc_empty_slice());
1176
+ call_config.service_config = route.method_config;
385
1177
  }
1178
+ return call_config;
386
1179
  }
1180
+ call_config.error = grpc_error_set_int(
1181
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("No route matched"),
1182
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
1183
+ return call_config;
1184
+ }
387
1185
 
388
- // Return the interested parties from the xds client so that it can be polled.
389
- grpc_pollset_set* interested_parties() override {
390
- return xds_client_->interested_parties();
391
- }
1186
+ //
1187
+ // XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::DynamicXdsServerConfigSelectorProvider
1188
+ //
392
1189
 
393
- private:
394
- class ListenerWatcher : public XdsClient::ListenerWatcherInterface {
395
- public:
396
- explicit ListenerWatcher(
397
- std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
398
- server_config_watcher,
399
- grpc_channel_args* args, RefCountedPtr<XdsClient> xds_client,
400
- grpc_server_xds_status_notifier serving_status_notifier,
401
- std::string listening_address)
402
- : server_config_watcher_(std::move(server_config_watcher)),
403
- args_(args),
404
- xds_client_(std::move(xds_client)),
405
- serving_status_notifier_(serving_status_notifier),
406
- listening_address_(std::move(listening_address)) {}
407
-
408
- ~ListenerWatcher() override { grpc_channel_args_destroy(args_); }
409
-
410
- // Deleted due to special handling required for args_. Copy the channel args
411
- // if we ever need these.
412
- ListenerWatcher(const ListenerWatcher&) = delete;
413
- ListenerWatcher& operator=(const ListenerWatcher&) = delete;
414
-
415
- void OnListenerChanged(XdsApi::LdsUpdate listener) override {
416
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_server_config_fetcher_trace)) {
417
- gpr_log(
418
- GPR_INFO,
419
- "[ListenerWatcher %p] Received LDS update from xds client %p: %s",
420
- this, xds_client_.get(), listener.ToString().c_str());
421
- }
422
- if (listener.address != listening_address_) {
423
- OnFatalError(absl::FailedPreconditionError(
424
- "Address in LDS update does not match listening address"));
425
- return;
426
- }
427
- if (filter_chain_match_manager_ == nullptr) {
428
- if (serving_status_notifier_.on_serving_status_update != nullptr) {
429
- serving_status_notifier_.on_serving_status_update(
430
- serving_status_notifier_.user_data, listening_address_.c_str(),
431
- {GRPC_STATUS_OK, ""});
432
- } else {
433
- gpr_log(GPR_INFO,
434
- "xDS Listener resource obtained; will start serving on %s",
435
- listening_address_.c_str());
436
- }
437
- }
438
- if (filter_chain_match_manager_ == nullptr ||
439
- !(listener.filter_chain_map ==
440
- filter_chain_match_manager_->filter_chain_map() &&
441
- listener.default_filter_chain ==
442
- filter_chain_match_manager_->default_filter_chain())) {
443
- filter_chain_match_manager_ = MakeRefCounted<FilterChainMatchManager>(
444
- xds_client_, std::move(listener.filter_chain_map),
445
- std::move(listener.default_filter_chain));
446
- server_config_watcher_->UpdateConnectionManager(
447
- filter_chain_match_manager_);
448
- }
449
- }
1190
+ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1191
+ DynamicXdsServerConfigSelectorProvider::
1192
+ DynamicXdsServerConfigSelectorProvider(
1193
+ RefCountedPtr<XdsClient> xds_client, std::string resource_name,
1194
+ absl::StatusOr<XdsRouteConfigResource> initial_resource,
1195
+ std::vector<XdsListenerResource::HttpConnectionManager::HttpFilter>
1196
+ http_filters)
1197
+ : xds_client_(std::move(xds_client)),
1198
+ resource_name_(std::move(resource_name)),
1199
+ http_filters_(std::move(http_filters)),
1200
+ resource_(std::move(initial_resource)) {
1201
+ GPR_ASSERT(!resource_name_.empty());
1202
+ // RouteConfigWatcher is being created here instead of in Watch() to avoid
1203
+ // deadlocks from invoking XdsRouteConfigResourceType::StartWatch whilst in a
1204
+ // critical region.
1205
+ auto route_config_watcher = MakeRefCounted<RouteConfigWatcher>(WeakRef());
1206
+ route_config_watcher_ = route_config_watcher.get();
1207
+ XdsRouteConfigResourceType::StartWatch(xds_client_.get(), resource_name_,
1208
+ std::move(route_config_watcher));
1209
+ }
450
1210
 
451
- void OnError(grpc_error_handle error) override {
452
- if (filter_chain_match_manager_ != nullptr) {
453
- gpr_log(GPR_ERROR,
454
- "ListenerWatcher:%p XdsClient reports error: %s for %s; "
455
- "ignoring in favor of existing resource",
456
- this, grpc_error_std_string(error).c_str(),
457
- listening_address_.c_str());
458
- } else {
459
- if (serving_status_notifier_.on_serving_status_update != nullptr) {
460
- serving_status_notifier_.on_serving_status_update(
461
- serving_status_notifier_.user_data, listening_address_.c_str(),
462
- {GRPC_STATUS_UNAVAILABLE, grpc_error_std_string(error).c_str()});
463
- } else {
464
- gpr_log(
465
- GPR_ERROR,
466
- "ListenerWatcher:%p error obtaining xDS Listener resource: %s; "
467
- "not serving on %s",
468
- this, grpc_error_std_string(error).c_str(),
469
- listening_address_.c_str());
470
- }
471
- }
472
- GRPC_ERROR_UNREF(error);
473
- }
1211
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1212
+ DynamicXdsServerConfigSelectorProvider::Orphan() {
1213
+ XdsRouteConfigResourceType::CancelWatch(xds_client_.get(), resource_name_,
1214
+ route_config_watcher_,
1215
+ false /* delay_unsubscription */);
1216
+ }
474
1217
 
475
- void OnFatalError(absl::Status status) {
476
- gpr_log(
477
- GPR_ERROR,
478
- "ListenerWatcher:%p Encountered fatal error %s; not serving on %s",
479
- this, status.ToString().c_str(), listening_address_.c_str());
480
- if (filter_chain_match_manager_ != nullptr) {
481
- // The server has started listening already, so we need to gracefully
482
- // stop serving.
483
- server_config_watcher_->StopServing();
484
- filter_chain_match_manager_.reset();
485
- }
486
- if (serving_status_notifier_.on_serving_status_update != nullptr) {
487
- serving_status_notifier_.on_serving_status_update(
488
- serving_status_notifier_.user_data, listening_address_.c_str(),
489
- {static_cast<grpc_status_code>(status.raw_code()),
490
- std::string(status.message()).c_str()});
491
- }
492
- }
1218
+ absl::StatusOr<RefCountedPtr<ServerConfigSelector>>
1219
+ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1220
+ DynamicXdsServerConfigSelectorProvider::Watch(
1221
+ std::unique_ptr<
1222
+ ServerConfigSelectorProvider::ServerConfigSelectorWatcher>
1223
+ watcher) {
1224
+ absl::StatusOr<XdsRouteConfigResource> resource;
1225
+ {
1226
+ MutexLock lock(&mu_);
1227
+ GPR_ASSERT(watcher_ == nullptr);
1228
+ watcher_ = std::move(watcher);
1229
+ resource = resource_;
1230
+ }
1231
+ if (!resource.ok()) {
1232
+ return resource.status();
1233
+ }
1234
+ return XdsServerConfigSelector::Create(resource.value(), http_filters_);
1235
+ }
493
1236
 
494
- void OnResourceDoesNotExist() override {
495
- OnFatalError(absl::NotFoundError("Requested listener does not exist"));
496
- }
1237
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1238
+ DynamicXdsServerConfigSelectorProvider::CancelWatch() {
1239
+ MutexLock lock(&mu_);
1240
+ watcher_.reset();
1241
+ }
497
1242
 
498
- private:
499
- std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
500
- server_config_watcher_;
501
- grpc_channel_args* args_;
502
- RefCountedPtr<XdsClient> xds_client_;
503
- grpc_server_xds_status_notifier serving_status_notifier_;
504
- std::string listening_address_;
505
- RefCountedPtr<FilterChainMatchManager> filter_chain_match_manager_;
506
- };
1243
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1244
+ DynamicXdsServerConfigSelectorProvider::OnRouteConfigChanged(
1245
+ XdsRouteConfigResource rds_update) {
1246
+ MutexLock lock(&mu_);
1247
+ resource_ = std::move(rds_update);
1248
+ if (watcher_ == nullptr) {
1249
+ return;
1250
+ }
1251
+ // Currently server_config_selector_filter does not call into
1252
+ // DynamicXdsServerConfigSelectorProvider while holding a lock, but if that
1253
+ // ever changes, we would want to invoke the update outside the critical
1254
+ // region with the use of a WorkSerializer.
1255
+ watcher_->OnServerConfigSelectorUpdate(
1256
+ XdsServerConfigSelector::Create(*resource_, http_filters_));
1257
+ }
507
1258
 
508
- struct WatcherState {
509
- std::string listening_address;
510
- ListenerWatcher* listener_watcher = nullptr;
511
- };
1259
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1260
+ DynamicXdsServerConfigSelectorProvider::OnError(grpc_error_handle error) {
1261
+ MutexLock lock(&mu_);
1262
+ // Prefer existing good update.
1263
+ if (resource_.ok()) {
1264
+ GRPC_ERROR_UNREF(error);
1265
+ return;
1266
+ }
1267
+ resource_ = grpc_error_to_absl_status(error);
1268
+ GRPC_ERROR_UNREF(error);
1269
+ if (watcher_ == nullptr) {
1270
+ return;
1271
+ }
1272
+ watcher_->OnServerConfigSelectorUpdate(resource_.status());
1273
+ }
512
1274
 
513
- RefCountedPtr<XdsClient> xds_client_;
514
- grpc_server_xds_status_notifier serving_status_notifier_;
515
- Mutex mu_;
516
- std::map<grpc_server_config_fetcher::WatcherInterface*, WatcherState>
517
- watchers_ ABSL_GUARDED_BY(mu_);
518
- };
1275
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1276
+ DynamicXdsServerConfigSelectorProvider::OnResourceDoesNotExist() {
1277
+ MutexLock lock(&mu_);
1278
+ resource_ = absl::NotFoundError("Requested route config does not exist");
1279
+ if (watcher_ == nullptr) {
1280
+ return;
1281
+ }
1282
+ watcher_->OnServerConfigSelectorUpdate(resource_.status());
1283
+ }
519
1284
 
520
1285
  } // namespace
521
1286
  } // namespace grpc_core
@@ -524,10 +1289,17 @@ grpc_server_config_fetcher* grpc_server_config_fetcher_xds_create(
524
1289
  grpc_server_xds_status_notifier notifier, const grpc_channel_args* args) {
525
1290
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
526
1291
  grpc_core::ExecCtx exec_ctx;
527
- GRPC_API_TRACE("grpc_server_config_fetcher_xds_create()", 0, ());
1292
+ args = grpc_core::CoreConfiguration::Get()
1293
+ .channel_args_preconditioning()
1294
+ .PreconditionChannelArgs(args);
1295
+ GRPC_API_TRACE(
1296
+ "grpc_server_config_fetcher_xds_create(notifier={on_serving_status_"
1297
+ "update=%p, user_data=%p}, args=%p)",
1298
+ 3, (notifier.on_serving_status_update, notifier.user_data, args));
528
1299
  grpc_error_handle error = GRPC_ERROR_NONE;
529
1300
  grpc_core::RefCountedPtr<grpc_core::XdsClient> xds_client =
530
1301
  grpc_core::XdsClient::GetOrCreate(args, &error);
1302
+ grpc_channel_args_destroy(args);
531
1303
  if (error != GRPC_ERROR_NONE) {
532
1304
  gpr_log(GPR_ERROR, "Failed to create xds client: %s",
533
1305
  grpc_error_std_string(error).c_str());