grpc 1.42.0 → 1.43.1

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

Potentially problematic release.


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

Files changed (739) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +85 -34
  3. data/include/grpc/event_engine/event_engine.h +37 -13
  4. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -31
  5. data/include/grpc/event_engine/memory_allocator.h +27 -11
  6. data/include/grpc/event_engine/memory_request.h +57 -0
  7. data/include/grpc/grpc_security.h +276 -145
  8. data/include/grpc/grpc_security_constants.h +1 -14
  9. data/include/grpc/impl/codegen/port_platform.h +7 -3
  10. data/src/core/ext/filters/client_channel/backend_metric.cc +6 -7
  11. data/src/core/ext/filters/client_channel/backend_metric.h +3 -2
  12. data/src/core/ext/filters/client_channel/client_channel.cc +81 -40
  13. data/src/core/ext/filters/client_channel/client_channel.h +5 -4
  14. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -2
  15. data/src/core/ext/filters/client_channel/dynamic_filters.cc +4 -4
  16. data/src/core/ext/filters/client_channel/health/health_check_client.h +1 -1
  17. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +12 -14
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +1 -2
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -2
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -2
  21. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +2 -3
  22. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +27 -80
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +82 -34
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +47 -91
  25. data/src/core/ext/filters/client_channel/lb_policy.h +75 -59
  26. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +3 -3
  27. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +2 -2
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +8 -12
  29. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -3
  30. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +6 -12
  31. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +222 -294
  32. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -7
  33. data/src/core/ext/filters/client_channel/resolver_registry.h +1 -2
  34. data/src/core/ext/filters/client_channel/subchannel.cc +4 -4
  35. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
  36. data/src/core/ext/filters/http/client/http_client_filter.cc +14 -30
  37. data/src/core/ext/filters/http/http_filters_plugin.cc +3 -5
  38. data/src/core/ext/filters/http/server/http_server_filter.cc +11 -28
  39. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +67 -0
  40. data/src/core/ext/filters/server_config_selector/server_config_selector.h +70 -0
  41. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +265 -0
  42. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.h +32 -0
  43. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +4 -20
  44. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +0 -2
  45. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +8 -5
  46. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +11 -14
  47. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +6 -3
  48. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +54 -79
  49. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +2 -3
  50. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +9 -13
  51. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +6 -6
  52. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +53 -62
  53. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -2
  54. data/src/core/ext/transport/chttp2/transport/context_list.cc +2 -3
  55. data/src/core/ext/transport/chttp2/transport/context_list.h +2 -3
  56. data/src/core/ext/transport/chttp2/transport/flow_control.cc +8 -8
  57. data/src/core/ext/transport/chttp2/transport/flow_control.h +2 -2
  58. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +83 -19
  59. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +33 -1
  60. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +66 -92
  61. data/src/core/ext/transport/chttp2/transport/internal.h +8 -4
  62. data/src/core/ext/transport/inproc/inproc_transport.cc +16 -7
  63. data/src/core/ext/transport/inproc/inproc_transport.h +1 -1
  64. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +197 -165
  65. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +2 -0
  66. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +41 -0
  67. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +18 -0
  68. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +26 -2
  69. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -0
  70. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +107 -82
  71. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +2 -0
  72. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +188 -160
  73. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +2 -0
  74. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +35 -22
  75. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +2 -0
  76. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +253 -218
  77. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +2 -0
  78. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +16 -5
  79. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +2 -0
  80. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +36 -25
  81. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +2 -0
  82. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +56 -39
  83. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +2 -0
  84. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +16 -5
  85. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +2 -0
  86. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +162 -128
  87. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +2 -0
  88. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +51 -36
  89. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +2 -0
  90. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +15 -4
  91. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +2 -0
  92. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +25 -13
  93. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +2 -0
  94. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +114 -90
  95. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +2 -0
  96. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +89 -71
  97. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +2 -0
  98. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +17 -6
  99. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +2 -0
  100. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +117 -93
  101. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +2 -0
  102. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +13 -2
  103. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +2 -0
  104. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +21 -9
  105. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +2 -0
  106. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.c +18 -7
  107. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +2 -0
  108. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +22 -11
  109. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +2 -0
  110. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +17 -6
  111. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +2 -0
  112. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +41 -27
  113. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +2 -0
  114. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +59 -43
  115. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +2 -0
  116. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +58 -43
  117. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +2 -0
  118. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +15 -4
  119. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +2 -0
  120. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +73 -57
  121. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +2 -0
  122. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +81 -64
  123. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +2 -0
  124. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +25 -14
  125. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +2 -0
  126. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +19 -7
  127. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +2 -0
  128. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +63 -45
  129. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +2 -0
  130. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +66 -47
  131. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +2 -0
  132. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +93 -75
  133. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +2 -0
  134. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +41 -28
  135. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +2 -0
  136. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +503 -440
  137. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +2 -0
  138. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +26 -13
  139. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +2 -0
  140. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +21 -9
  141. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +2 -0
  142. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +13 -2
  143. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +2 -0
  144. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +35 -20
  145. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +2 -0
  146. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +44 -31
  147. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +2 -0
  148. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +22 -11
  149. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +2 -0
  150. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +210 -181
  151. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +2 -0
  152. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.c +7 -0
  153. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/cert.upb.h +5 -3
  154. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +64 -48
  155. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +2 -0
  156. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +33 -20
  157. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +2 -0
  158. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +81 -65
  159. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +2 -0
  160. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.c +12 -1
  161. data/src/core/ext/upb-generated/envoy/service/cluster/v3/cds.upb.h +2 -0
  162. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +12 -1
  163. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +2 -0
  164. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +75 -58
  165. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +2 -0
  166. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.c +12 -1
  167. data/src/core/ext/upb-generated/envoy/service/endpoint/v3/eds.upb.h +2 -0
  168. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.c +12 -1
  169. data/src/core/ext/upb-generated/envoy/service/listener/v3/lds.upb.h +2 -0
  170. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +25 -13
  171. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +2 -0
  172. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.c +12 -1
  173. data/src/core/ext/upb-generated/envoy/service/route/v3/rds.upb.h +2 -0
  174. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.c +12 -1
  175. data/src/core/ext/upb-generated/envoy/service/route/v3/srds.upb.h +2 -0
  176. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +61 -46
  177. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +2 -0
  178. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +26 -12
  179. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +2 -0
  180. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +22 -10
  181. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +2 -0
  182. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +17 -6
  183. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +2 -0
  184. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +16 -5
  185. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +2 -0
  186. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +15 -4
  187. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +2 -0
  188. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +27 -14
  189. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +2 -0
  190. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +25 -13
  191. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +2 -0
  192. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +20 -8
  193. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +2 -0
  194. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +30 -17
  195. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +2 -0
  196. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +38 -21
  197. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +2 -0
  198. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +41 -26
  199. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +2 -0
  200. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.c +7 -0
  201. data/src/core/ext/upb-generated/envoy/type/v3/http.upb.h +2 -0
  202. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.c +17 -5
  203. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +2 -0
  204. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +22 -9
  205. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +2 -0
  206. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +15 -4
  207. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +2 -0
  208. data/src/core/ext/upb-generated/google/api/annotations.upb.c +20 -0
  209. data/src/core/ext/upb-generated/google/api/annotations.upb.h +7 -0
  210. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +116 -93
  211. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +2 -0
  212. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.c +102 -0
  213. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/eval.upb.h +306 -0
  214. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.c +56 -0
  215. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/explain.upb.h +135 -0
  216. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +122 -98
  217. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +2 -0
  218. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.c +115 -0
  219. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/value.upb.h +371 -0
  220. data/src/core/ext/upb-generated/google/api/http.upb.c +35 -22
  221. data/src/core/ext/upb-generated/google/api/http.upb.h +2 -0
  222. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +14 -3
  223. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +2 -0
  224. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +247 -210
  225. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +2 -0
  226. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +14 -3
  227. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +2 -0
  228. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +12 -1
  229. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +2 -0
  230. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +37 -23
  231. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +2 -0
  232. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +14 -3
  233. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +2 -0
  234. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +37 -18
  235. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +2 -0
  236. data/src/core/ext/upb-generated/google/rpc/status.upb.c +17 -6
  237. data/src/core/ext/upb-generated/google/rpc/status.upb.h +2 -0
  238. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.c +26 -14
  239. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +2 -0
  240. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +105 -83
  241. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +2 -0
  242. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +20 -8
  243. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +2 -0
  244. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +16 -4
  245. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +2 -0
  246. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +65 -47
  247. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -36
  248. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +26 -13
  249. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +2 -0
  250. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +67 -7
  251. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +27 -0
  252. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +27 -3
  253. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -0
  254. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +19 -0
  255. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +7 -0
  256. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +27 -3
  257. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -0
  258. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +26 -2
  259. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -0
  260. data/src/core/ext/upb-generated/validate/validate.upb.c +320 -251
  261. data/src/core/ext/upb-generated/validate/validate.upb.h +20 -0
  262. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +54 -9
  263. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +17 -0
  264. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +13 -2
  265. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +2 -0
  266. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +24 -12
  267. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +2 -0
  268. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +19 -7
  269. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +2 -0
  270. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +18 -7
  271. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +2 -0
  272. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +27 -15
  273. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +2 -0
  274. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +18 -7
  275. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +2 -0
  276. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +28 -15
  277. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +2 -0
  278. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +16 -5
  279. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +2 -0
  280. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +2 -49
  281. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +2 -2
  282. data/src/core/ext/upbdefs-generated/envoy/annotations/resource.upbdefs.c +2 -7
  283. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +2 -35
  284. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +2 -41
  285. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/circuit_breaker.upbdefs.c +2 -11
  286. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +2 -55
  287. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/filter.upbdefs.c +2 -7
  288. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/outlier_detection.upbdefs.c +2 -7
  289. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/address.upbdefs.c +2 -19
  290. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/backoff.upbdefs.c +2 -7
  291. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +2 -53
  292. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +2 -15
  293. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/event_service_config.upbdefs.c +2 -7
  294. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/extension.upbdefs.c +2 -9
  295. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/grpc_service.upbdefs.c +2 -33
  296. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/health_check.upbdefs.c +2 -21
  297. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/http_uri.upbdefs.c +2 -7
  298. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +2 -33
  299. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/proxy_protocol.upbdefs.c +2 -7
  300. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +2 -9
  301. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/socket_option.upbdefs.c +2 -7
  302. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +2 -7
  303. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +2 -7
  304. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint.upbdefs.c +2 -13
  305. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/endpoint_components.upbdefs.c +2 -17
  306. data/src/core/ext/upbdefs-generated/envoy/config/endpoint/v3/load_report.upbdefs.c +2 -15
  307. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/api_listener.upbdefs.c +2 -7
  308. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +2 -17
  309. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +2 -19
  310. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +2 -7
  311. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +2 -9
  312. data/src/core/ext/upbdefs-generated/envoy/config/metrics/v3/stats.upbdefs.c +2 -21
  313. data/src/core/ext/upbdefs-generated/envoy/config/overload/v3/overload.upbdefs.c +2 -23
  314. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +2 -11
  315. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +2 -111
  316. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/scoped_route.upbdefs.c +2 -11
  317. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/http_tracer.upbdefs.c +2 -9
  318. data/src/core/ext/upbdefs-generated/envoy/extensions/clusters/aggregate/v3/cluster.upbdefs.c +2 -7
  319. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/common/fault/v3/fault.upbdefs.c +2 -15
  320. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +2 -11
  321. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +2 -7
  322. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +2 -43
  323. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/cert.upbdefs.c +2 -2
  324. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +2 -17
  325. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/secret.upbdefs.c +2 -11
  326. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +2 -17
  327. data/src/core/ext/upbdefs-generated/envoy/service/cluster/v3/cds.upbdefs.c +2 -7
  328. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/ads.upbdefs.c +2 -7
  329. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +2 -19
  330. data/src/core/ext/upbdefs-generated/envoy/service/endpoint/v3/eds.upbdefs.c +2 -7
  331. data/src/core/ext/upbdefs-generated/envoy/service/listener/v3/lds.upbdefs.c +2 -7
  332. data/src/core/ext/upbdefs-generated/envoy/service/load_stats/v3/lrs.upbdefs.c +2 -9
  333. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/rds.upbdefs.c +2 -7
  334. data/src/core/ext/upbdefs-generated/envoy/service/route/v3/srds.upbdefs.c +2 -7
  335. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +2 -15
  336. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +2 -13
  337. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/metadata.upbdefs.c +2 -9
  338. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/node.upbdefs.c +2 -7
  339. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/number.upbdefs.c +2 -7
  340. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/path.upbdefs.c +2 -7
  341. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +2 -11
  342. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/string.upbdefs.c +2 -9
  343. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/struct.upbdefs.c +2 -9
  344. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/value.upbdefs.c +2 -11
  345. data/src/core/ext/upbdefs-generated/envoy/type/metadata/v3/metadata.upbdefs.c +2 -19
  346. data/src/core/ext/upbdefs-generated/envoy/type/tracing/v3/custom_tag.upbdefs.c +2 -15
  347. data/src/core/ext/upbdefs-generated/envoy/type/v3/http.upbdefs.c +2 -2
  348. data/src/core/ext/upbdefs-generated/envoy/type/v3/percent.upbdefs.c +2 -9
  349. data/src/core/ext/upbdefs-generated/envoy/type/v3/range.upbdefs.c +2 -11
  350. data/src/core/ext/upbdefs-generated/envoy/type/v3/semantic_version.upbdefs.c +2 -7
  351. data/src/core/ext/upbdefs-generated/google/api/annotations.upbdefs.c +2 -2
  352. data/src/core/ext/upbdefs-generated/google/api/http.upbdefs.c +2 -11
  353. data/src/core/ext/upbdefs-generated/google/protobuf/any.upbdefs.c +2 -7
  354. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +2 -59
  355. data/src/core/ext/upbdefs-generated/google/protobuf/duration.upbdefs.c +2 -7
  356. data/src/core/ext/upbdefs-generated/google/protobuf/empty.upbdefs.c +2 -7
  357. data/src/core/ext/upbdefs-generated/google/protobuf/struct.upbdefs.c +2 -13
  358. data/src/core/ext/upbdefs-generated/google/protobuf/timestamp.upbdefs.c +2 -7
  359. data/src/core/ext/upbdefs-generated/google/protobuf/wrappers.upbdefs.c +2 -23
  360. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +2 -7
  361. data/src/core/ext/upbdefs-generated/udpa/annotations/migrate.upbdefs.c +2 -11
  362. data/src/core/ext/upbdefs-generated/udpa/annotations/security.upbdefs.c +2 -7
  363. data/src/core/ext/upbdefs-generated/udpa/annotations/sensitive.upbdefs.c +2 -2
  364. data/src/core/ext/upbdefs-generated/udpa/annotations/status.upbdefs.c +2 -7
  365. data/src/core/ext/upbdefs-generated/udpa/annotations/versioning.upbdefs.c +2 -7
  366. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +2 -51
  367. data/src/core/ext/upbdefs-generated/xds/annotations/v3/status.upbdefs.c +2 -13
  368. data/src/core/ext/upbdefs-generated/xds/core/v3/authority.upbdefs.c +2 -7
  369. data/src/core/ext/upbdefs-generated/xds/core/v3/collection_entry.upbdefs.c +2 -9
  370. data/src/core/ext/upbdefs-generated/xds/core/v3/context_params.upbdefs.c +2 -9
  371. data/src/core/ext/upbdefs-generated/xds/core/v3/resource.upbdefs.c +2 -7
  372. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_locator.upbdefs.c +2 -9
  373. data/src/core/ext/upbdefs-generated/xds/core/v3/resource_name.upbdefs.c +2 -7
  374. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +2 -7
  375. data/src/core/ext/xds/certificate_provider_registry.cc +1 -1
  376. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  377. data/src/core/ext/xds/xds_api.cc +409 -304
  378. data/src/core/ext/xds/xds_api.h +3 -1
  379. data/src/core/ext/xds/xds_bootstrap.cc +6 -3
  380. data/src/core/ext/xds/xds_certificate_provider.h +1 -2
  381. data/src/core/ext/xds/xds_channel_stack_modifier.cc +3 -4
  382. data/src/core/ext/xds/xds_client.cc +395 -291
  383. data/src/core/ext/xds/xds_client.h +47 -38
  384. data/src/core/ext/xds/xds_routing.cc +247 -0
  385. data/src/core/ext/xds/xds_routing.h +98 -0
  386. data/src/core/ext/xds/xds_server_config_fetcher.cc +975 -261
  387. data/src/core/lib/avl/avl.h +389 -88
  388. data/src/core/lib/backoff/backoff.cc +2 -2
  389. data/src/core/lib/channel/channel_args.cc +17 -17
  390. data/src/core/lib/channel/channel_args.h +11 -10
  391. data/src/core/lib/channel/channel_args_preconditioning.cc +47 -0
  392. data/src/core/lib/channel/channel_args_preconditioning.h +62 -0
  393. data/src/core/lib/channel/channel_stack_builder.cc +0 -2
  394. data/src/core/lib/channel/channel_trace.cc +6 -6
  395. data/src/core/lib/channel/channelz.cc +1 -1
  396. data/src/core/lib/compression/compression_args.cc +7 -5
  397. data/src/core/lib/compression/compression_args.h +6 -4
  398. data/src/core/lib/config/core_configuration.cc +3 -1
  399. data/src/core/lib/config/core_configuration.h +11 -0
  400. data/src/core/lib/debug/trace.h +2 -2
  401. data/src/core/lib/event_engine/{endpoint_config.cc → channel_args_endpoint_config.cc} +2 -1
  402. data/src/core/lib/event_engine/{endpoint_config_internal.h → channel_args_endpoint_config.h} +3 -3
  403. data/src/core/lib/event_engine/event_engine.cc +0 -13
  404. data/src/core/lib/event_engine/event_engine_factory.cc +49 -0
  405. data/src/core/lib/event_engine/event_engine_factory.h +33 -0
  406. data/src/core/lib/event_engine/memory_allocator.cc +70 -0
  407. data/src/core/lib/gpr/tls.h +6 -0
  408. data/src/core/lib/gprpp/cpp_impl_of.h +45 -0
  409. data/src/core/lib/gprpp/global_config_env.cc +7 -7
  410. data/src/core/lib/gprpp/global_config_env.h +2 -2
  411. data/src/core/lib/gprpp/manual_constructor.h +2 -3
  412. data/src/core/lib/gprpp/orphanable.h +1 -1
  413. data/src/core/lib/gprpp/ref_counted.h +1 -1
  414. data/src/core/lib/gprpp/ref_counted_ptr.h +2 -4
  415. data/src/core/lib/gprpp/status_helper.h +1 -1
  416. data/src/core/lib/gprpp/table.h +13 -1
  417. data/src/core/lib/http/httpcli.cc +30 -26
  418. data/src/core/lib/http/httpcli.h +14 -12
  419. data/src/core/lib/iomgr/buffer_list.cc +9 -9
  420. data/src/core/lib/iomgr/buffer_list.h +13 -13
  421. data/src/core/lib/iomgr/call_combiner.cc +2 -3
  422. data/src/core/lib/iomgr/endpoint.h +0 -1
  423. data/src/core/lib/iomgr/endpoint_cfstream.cc +7 -24
  424. data/src/core/lib/iomgr/endpoint_cfstream.h +4 -4
  425. data/src/core/lib/iomgr/endpoint_pair_posix.cc +9 -11
  426. data/src/core/lib/iomgr/endpoint_pair_windows.cc +5 -14
  427. data/src/core/lib/iomgr/event_engine/endpoint.cc +2 -3
  428. data/src/core/lib/iomgr/event_engine/iomgr.cc +5 -25
  429. data/src/core/lib/iomgr/event_engine/resolver.cc +3 -2
  430. data/src/core/lib/iomgr/event_engine/tcp.cc +7 -5
  431. data/src/core/lib/iomgr/event_engine/timer.cc +4 -3
  432. data/src/core/lib/iomgr/exec_ctx.h +11 -11
  433. data/src/core/lib/iomgr/executor.cc +12 -15
  434. data/src/core/lib/iomgr/executor.h +1 -1
  435. data/src/core/lib/iomgr/tcp_client.cc +2 -4
  436. data/src/core/lib/iomgr/tcp_client.h +1 -3
  437. data/src/core/lib/iomgr/tcp_client_cfstream.cc +1 -9
  438. data/src/core/lib/iomgr/tcp_client_custom.cc +4 -10
  439. data/src/core/lib/iomgr/tcp_client_posix.cc +7 -23
  440. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  441. data/src/core/lib/iomgr/tcp_client_windows.cc +1 -10
  442. data/src/core/lib/iomgr/tcp_custom.cc +9 -36
  443. data/src/core/lib/iomgr/tcp_custom.h +0 -1
  444. data/src/core/lib/iomgr/tcp_posix.cc +28 -33
  445. data/src/core/lib/iomgr/tcp_posix.h +1 -3
  446. data/src/core/lib/iomgr/tcp_server.cc +4 -6
  447. data/src/core/lib/iomgr/tcp_server.h +6 -8
  448. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -15
  449. data/src/core/lib/iomgr/tcp_server_posix.cc +18 -22
  450. data/src/core/lib/iomgr/tcp_server_utils_posix.h +19 -18
  451. data/src/core/lib/iomgr/tcp_server_windows.cc +5 -12
  452. data/src/core/lib/iomgr/tcp_windows.cc +2 -7
  453. data/src/core/lib/iomgr/tcp_windows.h +1 -2
  454. data/src/core/lib/iomgr/unix_sockets_posix.cc +1 -1
  455. data/src/core/lib/iomgr/unix_sockets_posix.h +1 -1
  456. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +1 -1
  457. data/src/core/lib/iomgr/work_serializer.cc +115 -44
  458. data/src/core/lib/iomgr/work_serializer.h +16 -4
  459. data/src/core/lib/json/json_reader.cc +83 -35
  460. data/src/core/lib/json/json_util.cc +1 -1
  461. data/src/core/lib/promise/activity.cc +115 -0
  462. data/src/core/lib/promise/activity.h +499 -0
  463. data/src/core/lib/promise/context.h +86 -0
  464. data/src/core/lib/promise/detail/basic_seq.h +407 -0
  465. data/src/core/lib/promise/detail/promise_factory.h +189 -0
  466. data/src/core/lib/promise/detail/promise_like.h +85 -0
  467. data/src/core/lib/promise/detail/status.h +44 -0
  468. data/src/core/lib/promise/detail/switch.h +1455 -0
  469. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +48 -0
  470. data/src/core/lib/promise/loop.h +108 -0
  471. data/src/core/lib/promise/map.h +88 -0
  472. data/src/core/lib/promise/poll.h +60 -0
  473. data/src/core/lib/promise/race.h +84 -0
  474. data/src/core/lib/promise/seq.h +71 -0
  475. data/src/core/lib/resource_quota/api.cc +108 -0
  476. data/src/core/lib/resource_quota/api.h +41 -0
  477. data/src/core/lib/resource_quota/memory_quota.cc +454 -0
  478. data/src/core/lib/resource_quota/memory_quota.h +421 -0
  479. data/src/core/lib/resource_quota/resource_quota.cc +33 -0
  480. data/src/core/lib/resource_quota/resource_quota.h +58 -0
  481. data/src/core/lib/resource_quota/thread_quota.cc +43 -0
  482. data/src/core/lib/resource_quota/thread_quota.h +57 -0
  483. data/src/core/lib/resource_quota/trace.cc +19 -0
  484. data/src/core/lib/resource_quota/trace.h +24 -0
  485. data/src/core/lib/security/authorization/evaluate_args.cc +13 -19
  486. data/src/core/lib/security/authorization/evaluate_args.h +2 -1
  487. data/src/core/lib/security/authorization/sdk_server_authz_filter.cc +3 -1
  488. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +11 -12
  489. data/src/core/lib/security/credentials/external/external_account_credentials.cc +9 -10
  490. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +3 -4
  491. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +4 -6
  492. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
  493. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +4 -6
  494. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +18 -22
  495. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +11 -12
  496. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -8
  497. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +201 -0
  498. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.h +106 -0
  499. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +11 -90
  500. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +19 -82
  501. data/src/core/lib/security/credentials/tls/tls_credentials.cc +21 -10
  502. data/src/core/lib/security/credentials/xds/xds_credentials.cc +28 -33
  503. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +3 -3
  504. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +2 -2
  505. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +3 -4
  506. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  507. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +7 -7
  508. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -2
  509. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -1
  510. data/src/core/lib/security/security_connector/ssl_utils.cc +10 -2
  511. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  512. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +344 -195
  513. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +64 -41
  514. data/src/core/lib/security/transport/security_handshaker.cc +2 -2
  515. data/src/core/lib/slice/percent_encoding.cc +30 -86
  516. data/src/core/lib/slice/percent_encoding.h +5 -11
  517. data/src/core/lib/slice/slice.cc +7 -7
  518. data/src/core/lib/slice/slice.h +341 -0
  519. data/src/core/lib/slice/slice_buffer.cc +4 -0
  520. data/src/core/lib/slice/slice_intern.cc +1 -1
  521. data/src/core/lib/slice/slice_refcount.h +5 -1
  522. data/src/core/lib/slice/slice_refcount_base.h +19 -11
  523. data/src/core/lib/slice/static_slice.cc +331 -483
  524. data/src/core/lib/slice/static_slice.h +101 -132
  525. data/src/core/lib/surface/builtins.cc +1 -1
  526. data/src/core/lib/surface/call.cc +85 -59
  527. data/src/core/lib/surface/channel.cc +4 -29
  528. data/src/core/lib/surface/channel.h +2 -12
  529. data/src/core/lib/surface/completion_queue.cc +2 -2
  530. data/src/core/lib/surface/init.cc +0 -1
  531. data/src/core/lib/surface/lame_client.cc +24 -17
  532. data/src/core/lib/surface/server.cc +22 -22
  533. data/src/core/lib/surface/server.h +8 -9
  534. data/src/core/lib/surface/validate_metadata.cc +2 -2
  535. data/src/core/lib/surface/version.cc +2 -2
  536. data/src/core/lib/transport/bdp_estimator.cc +1 -1
  537. data/src/core/lib/transport/byte_stream.cc +4 -0
  538. data/src/core/lib/transport/metadata.h +4 -4
  539. data/src/core/lib/transport/metadata_batch.cc +5 -0
  540. data/src/core/lib/transport/metadata_batch.h +174 -99
  541. data/src/core/lib/transport/parsed_metadata.cc +35 -0
  542. data/src/core/lib/transport/parsed_metadata.h +180 -61
  543. data/src/core/lib/transport/pid_controller.cc +4 -4
  544. data/src/core/lib/transport/static_metadata.cc +529 -614
  545. data/src/core/lib/transport/static_metadata.h +0 -18
  546. data/src/core/lib/transport/transport.cc +4 -26
  547. data/src/core/lib/transport/transport.h +0 -1
  548. data/src/core/lib/transport/transport_op_string.cc +1 -1
  549. data/src/core/lib/uri/uri_parser.cc +19 -19
  550. data/src/core/lib/uri/uri_parser.h +2 -0
  551. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -2
  552. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  553. data/src/core/tsi/local_transport_security.cc +15 -15
  554. data/src/core/tsi/ssl_transport_security.cc +30 -1
  555. data/src/core/tsi/ssl_transport_security.h +1 -0
  556. data/src/ruby/ext/grpc/extconf.rb +1 -1
  557. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +6 -10
  558. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +9 -15
  559. data/src/ruby/lib/grpc/version.rb +1 -1
  560. data/third_party/abseil-cpp/absl/algorithm/container.h +101 -91
  561. data/third_party/abseil-cpp/absl/base/attributes.h +64 -31
  562. data/third_party/abseil-cpp/absl/base/config.h +67 -37
  563. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +1 -26
  564. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -1
  565. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +2 -0
  566. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +69 -0
  567. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +4 -4
  568. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +16 -0
  569. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +4 -4
  570. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  571. data/third_party/abseil-cpp/absl/container/fixed_array.h +0 -5
  572. data/third_party/abseil-cpp/absl/container/inlined_vector.h +105 -97
  573. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +17 -15
  574. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +18 -102
  575. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +37 -78
  576. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +388 -423
  577. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +3 -2
  578. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -8
  579. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +251 -120
  580. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +11 -1
  581. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.cc +12 -11
  582. data/third_party/abseil-cpp/absl/debugging/internal/elf_mem_image.h +6 -2
  583. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +12 -5
  584. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +110 -0
  585. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +234 -0
  586. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +25 -7
  587. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +8 -2
  588. data/third_party/abseil-cpp/absl/debugging/internal/vdso_support.cc +21 -3
  589. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +2 -0
  590. data/third_party/abseil-cpp/absl/debugging/symbolize.cc +2 -0
  591. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +14 -0
  592. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +72 -0
  593. data/third_party/abseil-cpp/absl/functional/function_ref.h +4 -1
  594. data/third_party/abseil-cpp/absl/hash/hash.h +22 -0
  595. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +15 -16
  596. data/third_party/abseil-cpp/absl/hash/internal/hash.h +88 -37
  597. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.cc → low_level_hash.cc} +23 -11
  598. data/third_party/abseil-cpp/absl/hash/internal/{wyhash.h → low_level_hash.h} +14 -12
  599. data/third_party/abseil-cpp/absl/memory/memory.h +1 -1
  600. data/third_party/abseil-cpp/absl/meta/type_traits.h +32 -2
  601. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -10
  602. data/third_party/abseil-cpp/absl/numeric/int128.h +146 -73
  603. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +19 -25
  604. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +73 -70
  605. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.cc +4 -4
  606. data/third_party/abseil-cpp/absl/{base → profiling}/internal/exponential_biased.h +6 -6
  607. data/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h +230 -0
  608. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +5 -5
  609. data/third_party/abseil-cpp/absl/status/status.cc +9 -17
  610. data/third_party/abseil-cpp/absl/status/status.h +19 -15
  611. data/third_party/abseil-cpp/absl/status/statusor.cc +34 -2
  612. data/third_party/abseil-cpp/absl/status/statusor.h +31 -21
  613. data/third_party/abseil-cpp/absl/strings/charconv.cc +3 -3
  614. data/third_party/abseil-cpp/absl/strings/charconv.h +3 -2
  615. data/third_party/abseil-cpp/absl/strings/cord.cc +453 -359
  616. data/third_party/abseil-cpp/absl/strings/cord.h +197 -70
  617. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +1 -1
  618. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +6 -0
  619. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +140 -63
  620. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +1128 -0
  621. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.h +939 -0
  622. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.cc +185 -0
  623. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_navigator.h +265 -0
  624. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.cc +68 -0
  625. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree_reader.h +211 -0
  626. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.cc +129 -0
  627. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_consume.h +50 -0
  628. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +7 -7
  629. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +55 -181
  630. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +42 -24
  631. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +4 -0
  632. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.cc +96 -0
  633. data/third_party/abseil-cpp/absl/strings/internal/cordz_functions.h +85 -0
  634. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.cc +139 -0
  635. data/third_party/abseil-cpp/absl/strings/internal/cordz_handle.h +131 -0
  636. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +445 -0
  637. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.h +298 -0
  638. data/third_party/abseil-cpp/absl/strings/internal/cordz_statistics.h +87 -0
  639. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_scope.h +71 -0
  640. data/third_party/abseil-cpp/absl/strings/internal/cordz_update_tracker.h +121 -0
  641. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +48 -2
  642. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +8 -0
  643. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +3 -4
  644. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +1 -1
  645. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +6 -6
  646. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +36 -18
  647. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +62 -73
  648. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +24 -16
  649. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +35 -35
  650. data/third_party/abseil-cpp/absl/strings/numbers.cc +1 -1
  651. data/third_party/abseil-cpp/absl/strings/numbers.h +34 -0
  652. data/third_party/abseil-cpp/absl/strings/str_cat.cc +4 -4
  653. data/third_party/abseil-cpp/absl/strings/str_format.h +1 -2
  654. data/third_party/abseil-cpp/absl/strings/string_view.cc +16 -21
  655. data/third_party/abseil-cpp/absl/strings/string_view.h +120 -39
  656. data/third_party/abseil-cpp/absl/strings/substitute.cc +2 -1
  657. data/third_party/abseil-cpp/absl/strings/substitute.h +99 -74
  658. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.cc +25 -15
  659. data/third_party/abseil-cpp/absl/synchronization/blocking_counter.h +5 -3
  660. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -1
  661. data/third_party/abseil-cpp/absl/synchronization/mutex.h +3 -3
  662. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -3
  663. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +93 -20
  664. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +1 -1
  665. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +2 -1
  666. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +83 -21
  667. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +49 -0
  668. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +1 -1
  669. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +2 -3
  670. data/third_party/abseil-cpp/absl/time/time.h +67 -36
  671. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +1 -1
  672. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +2 -2
  673. data/third_party/abseil-cpp/absl/types/span.h +3 -3
  674. data/third_party/boringssl-with-bazel/err_data.c +681 -677
  675. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bitstr.c +19 -11
  676. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +41 -30
  677. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +1 -1
  678. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +59 -47
  679. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn_pack.c +24 -28
  680. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_int.c +5 -0
  681. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +28 -0
  682. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +48 -272
  683. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_typ.c +8 -6
  684. data/third_party/boringssl-with-bazel/src/crypto/bytestring/ber.c +3 -1
  685. data/third_party/boringssl-with-bazel/src/crypto/evp/evp_asn1.c +2 -2
  686. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +7 -7
  687. data/third_party/boringssl-with-bazel/src/crypto/mem.c +18 -0
  688. data/third_party/boringssl-with-bazel/src/crypto/pool/internal.h +5 -1
  689. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +59 -23
  690. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +2 -18
  691. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +8 -2
  692. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +216 -11
  693. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_cache.c +1 -1
  694. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_data.c +1 -1
  695. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_lib.c +1 -1
  696. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_map.c +1 -1
  697. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_node.c +1 -1
  698. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_tree.c +1 -1
  699. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +1 -0
  700. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +0 -1
  701. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +21 -4
  702. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +971 -253
  703. data/third_party/boringssl-with-bazel/src/include/openssl/asn1t.h +3 -3
  704. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +0 -1
  705. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +4 -12
  706. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +17 -41
  707. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +12 -27
  708. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +8 -10
  709. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +29 -55
  710. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +3 -9
  711. data/third_party/boringssl-with-bazel/src/include/openssl/pool.h +7 -1
  712. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +24 -28
  713. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +6 -9
  714. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +12 -43
  715. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +4 -3
  716. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3 -3
  717. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +4 -0
  718. data/third_party/upb/upb/decode.c +309 -178
  719. data/third_party/upb/upb/decode_fast.c +1 -1
  720. data/third_party/upb/upb/decode_internal.h +1 -0
  721. data/third_party/upb/upb/def.c +330 -85
  722. data/third_party/upb/upb/def.h +45 -14
  723. data/third_party/upb/upb/def.hpp +17 -4
  724. data/third_party/upb/upb/encode.c +100 -40
  725. data/third_party/upb/upb/msg.c +22 -9
  726. data/third_party/upb/upb/msg_internal.h +90 -8
  727. data/third_party/upb/upb/reflection.c +98 -58
  728. data/third_party/upb/upb/reflection.h +6 -2
  729. data/third_party/upb/upb/text_encode.c +3 -3
  730. data/third_party/upb/upb/upb.c +8 -0
  731. metadata +116 -56
  732. data/src/core/lib/avl/avl.cc +0 -306
  733. data/src/core/lib/gprpp/match.h +0 -73
  734. data/src/core/lib/gprpp/overload.h +0 -59
  735. data/src/core/lib/iomgr/event_engine/iomgr.h +0 -42
  736. data/src/core/lib/iomgr/resource_quota.cc +0 -1106
  737. data/src/core/lib/iomgr/resource_quota.h +0 -226
  738. data/third_party/boringssl-with-bazel/src/crypto/asn1/f_enum.c +0 -93
  739. data/third_party/boringssl-with-bazel/src/crypto/x509v3/pcy_int.h +0 -217
@@ -18,41 +18,142 @@
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_routing.h"
25
30
  #include "src/core/lib/address_utils/sockaddr_utils.h"
26
31
  #include "src/core/lib/channel/channel_args.h"
32
+ #include "src/core/lib/config/core_configuration.h"
27
33
  #include "src/core/lib/gprpp/host_port.h"
28
34
  #include "src/core/lib/iomgr/sockaddr.h"
29
35
  #include "src/core/lib/iomgr/socket_utils.h"
30
36
  #include "src/core/lib/security/credentials/xds/xds_credentials.h"
37
+ #include "src/core/lib/slice/slice_utils.h"
31
38
  #include "src/core/lib/surface/api_trace.h"
32
39
  #include "src/core/lib/surface/server.h"
40
+ #include "src/core/lib/transport/error_utils.h"
33
41
  #include "src/core/lib/uri/uri_parser.h"
34
42
 
35
43
  namespace grpc_core {
44
+ namespace {
36
45
 
37
46
  TraceFlag grpc_xds_server_config_fetcher_trace(false,
38
47
  "xds_server_config_fetcher");
39
48
 
40
- namespace {
49
+ // A server config fetcher that fetches the information for configuring server
50
+ // listeners from the xDS control plane.
51
+ class XdsServerConfigFetcher : public grpc_server_config_fetcher {
52
+ public:
53
+ XdsServerConfigFetcher(RefCountedPtr<XdsClient> xds_client,
54
+ grpc_server_xds_status_notifier notifier);
55
+
56
+ void StartWatch(std::string listening_address,
57
+ std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
58
+ watcher) override;
59
+
60
+ void CancelWatch(
61
+ grpc_server_config_fetcher::WatcherInterface* watcher) override;
62
+
63
+ // Return the interested parties from the xds client so that it can be polled.
64
+ grpc_pollset_set* interested_parties() override {
65
+ return xds_client_->interested_parties();
66
+ }
67
+
68
+ private:
69
+ class ListenerWatcher;
70
+
71
+ RefCountedPtr<XdsClient> xds_client_;
72
+ grpc_server_xds_status_notifier serving_status_notifier_;
73
+ Mutex mu_;
74
+ std::map<grpc_server_config_fetcher::WatcherInterface*, ListenerWatcher*>
75
+ listener_watchers_ ABSL_GUARDED_BY(mu_);
76
+ };
77
+
78
+ // A watcher implementation for listening on LDS updates from the xDS control
79
+ // plane. When a good LDS update is received, it creates a
80
+ // FilterChainMatchManager object that would replace the existing (if any)
81
+ // FilterChainMatchManager object after all referenced RDS resources are
82
+ // fetched. Note that a good update also causes the server listener to start
83
+ // listening if it isn't already. If an error LDS update is received (NACKed
84
+ // resource, timeouts), the previous good FilterChainMatchManager, if any,
85
+ // continues to be used. If there isn't any previous good update or if the
86
+ // update received was a fatal error (resource does not exist), the server
87
+ // listener is made to stop listening.
88
+ class XdsServerConfigFetcher::ListenerWatcher
89
+ : public XdsClient::ListenerWatcherInterface {
90
+ public:
91
+ ListenerWatcher(RefCountedPtr<XdsClient> xds_client,
92
+ std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
93
+ server_config_watcher,
94
+ grpc_server_xds_status_notifier serving_status_notifier,
95
+ std::string listening_address);
96
+
97
+ void OnListenerChanged(XdsApi::LdsUpdate listener) override;
98
+
99
+ void OnError(grpc_error_handle error) override;
100
+
101
+ void OnResourceDoesNotExist() override;
102
+
103
+ const std::string& listening_address() const { return listening_address_; }
41
104
 
42
- class FilterChainMatchManager
105
+ private:
106
+ class FilterChainMatchManager;
107
+
108
+ void OnFatalError(absl::Status status) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
109
+
110
+ // Invoked by FilterChainMatchManager that is done fetching all referenced RDS
111
+ // resources. If the calling FilterChainMatchManager is the
112
+ // pending_filter_chain_match_manager_, it is promoted to be the
113
+ // filter_chain_match_manager_ in use.
114
+ void PendingFilterChainMatchManagerReady(
115
+ FilterChainMatchManager* filter_chain_match_manager) {
116
+ MutexLock lock(&mu_);
117
+ PendingFilterChainMatchManagerReadyLocked(filter_chain_match_manager);
118
+ }
119
+ void PendingFilterChainMatchManagerReadyLocked(
120
+ FilterChainMatchManager* filter_chain_match_manager)
121
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&mu_);
122
+
123
+ const RefCountedPtr<XdsClient> xds_client_;
124
+ const std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
125
+ server_config_watcher_;
126
+ const grpc_server_xds_status_notifier serving_status_notifier_;
127
+ const std::string listening_address_;
128
+ Mutex mu_;
129
+ RefCountedPtr<FilterChainMatchManager> filter_chain_match_manager_
130
+ ABSL_GUARDED_BY(mu_);
131
+ RefCountedPtr<FilterChainMatchManager> pending_filter_chain_match_manager_
132
+ ABSL_GUARDED_BY(mu_);
133
+ };
134
+
135
+ // A connection manager used by the server listener code to inject channel args
136
+ // to be used for each incoming connection. This implementation chooses the
137
+ // appropriate filter chain from the xDS Listener resource and injects channel
138
+ // args that configure the right mTLS certs and cause the right set of HTTP
139
+ // filters to be injected.
140
+ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager
43
141
  : public grpc_server_config_fetcher::ConnectionManager {
44
142
  public:
45
143
  FilterChainMatchManager(
46
144
  RefCountedPtr<XdsClient> xds_client,
47
145
  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
+ absl::optional<XdsApi::LdsUpdate::FilterChainData> default_filter_chain);
52
147
 
53
148
  absl::StatusOr<grpc_channel_args*> UpdateChannelArgsForConnection(
54
149
  grpc_channel_args* args, grpc_endpoint* tcp) override;
55
150
 
151
+ void Orphan() override;
152
+
153
+ // Invoked by ListenerWatcher to start fetching referenced RDS resources.
154
+ void StartRdsWatch(RefCountedPtr<ListenerWatcher> listener_watcher)
155
+ ABSL_EXCLUSIVE_LOCKS_REQUIRED(&ListenerWatcher::mu_);
156
+
56
157
  const XdsApi::LdsUpdate::FilterChainMap& filter_chain_map() const {
57
158
  return filter_chain_map_;
58
159
  }
@@ -72,37 +173,608 @@ class FilterChainMatchManager
72
173
  RefCountedPtr<XdsCertificateProvider> xds;
73
174
  };
74
175
 
176
+ class RouteConfigWatcher;
177
+ struct RdsUpdateState {
178
+ RouteConfigWatcher* watcher;
179
+ absl::optional<absl::StatusOr<XdsApi::RdsUpdate>> rds_update;
180
+ };
181
+
182
+ class XdsServerConfigSelector;
183
+ class StaticXdsServerConfigSelectorProvider;
184
+ class DynamicXdsServerConfigSelectorProvider;
185
+
75
186
  absl::StatusOr<RefCountedPtr<XdsCertificateProvider>>
76
187
  CreateOrGetXdsCertificateProviderFromFilterChainData(
77
188
  const XdsApi::LdsUpdate::FilterChainData* filter_chain);
78
189
 
79
- const RefCountedPtr<XdsClient> xds_client_;
190
+ // Helper functions invoked by RouteConfigWatcher when there are updates to
191
+ // RDS resources.
192
+ void OnRouteConfigChanged(const std::string& resource_name,
193
+ XdsApi::RdsUpdate route_config);
194
+ void OnError(const std::string& resource_name, grpc_error_handle error);
195
+ void OnResourceDoesNotExist(const std::string& resource_name);
196
+
197
+ RefCountedPtr<XdsClient> xds_client_;
198
+ // This ref is only kept around till the FilterChainMatchManager becomes
199
+ // ready.
200
+ RefCountedPtr<ListenerWatcher> listener_watcher_;
80
201
  const XdsApi::LdsUpdate::FilterChainMap filter_chain_map_;
81
202
  const absl::optional<XdsApi::LdsUpdate::FilterChainData>
82
203
  default_filter_chain_;
83
204
  Mutex mu_;
205
+ size_t rds_resources_yet_to_fetch_ ABSL_GUARDED_BY(mu_) = 0;
206
+ std::map<std::string /* resource_name */, RdsUpdateState> rds_map_
207
+ ABSL_GUARDED_BY(mu_);
84
208
  std::map<const XdsApi::LdsUpdate::FilterChainData*, CertificateProviders>
85
209
  certificate_providers_map_ ABSL_GUARDED_BY(mu_);
86
210
  };
87
211
 
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;
212
+ // A watcher implementation for listening on RDS updates referenced to by a
213
+ // FilterChainMatchManager object. After all referenced RDS resources are
214
+ // fetched (errors are allowed), the FilterChainMatchManager tries to replace
215
+ // the current object. The watcher continues to update the referenced RDS
216
+ // resources so that new XdsServerConfigSelectorProvider objects are created
217
+ // with the latest updates and new connections do not need to wait for the RDS
218
+ // resources to be fetched.
219
+ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
220
+ RouteConfigWatcher : public XdsClient::RouteConfigWatcherInterface {
221
+ public:
222
+ RouteConfigWatcher(
223
+ std::string resource_name,
224
+ WeakRefCountedPtr<FilterChainMatchManager> filter_chain_match_manager)
225
+ : resource_name_(std::move(resource_name)),
226
+ filter_chain_match_manager_(std::move(filter_chain_match_manager)) {}
227
+
228
+ void OnRouteConfigChanged(XdsApi::RdsUpdate route_config) override {
229
+ filter_chain_match_manager_->OnRouteConfigChanged(resource_name_,
230
+ std::move(route_config));
231
+ }
232
+
233
+ void OnError(grpc_error_handle error) override {
234
+ filter_chain_match_manager_->OnError(resource_name_, error);
235
+ }
236
+
237
+ void OnResourceDoesNotExist() override {
238
+ filter_chain_match_manager_->OnResourceDoesNotExist(resource_name_);
239
+ }
240
+
241
+ private:
242
+ std::string resource_name_;
243
+ WeakRefCountedPtr<FilterChainMatchManager> filter_chain_match_manager_;
244
+ };
245
+
246
+ // An implementation of ServerConfigSelector used by
247
+ // StaticXdsServerConfigSelectorProvider and
248
+ // DynamicXdsServerConfigSelectorProvider to parse the RDS update and get
249
+ // per-call configuration based on incoming metadata.
250
+ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
251
+ XdsServerConfigSelector : public ServerConfigSelector {
252
+ public:
253
+ static absl::StatusOr<RefCountedPtr<XdsServerConfigSelector>> Create(
254
+ XdsApi::RdsUpdate rds_update,
255
+ const std::vector<XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter>&
256
+ http_filters);
257
+ ~XdsServerConfigSelector() override = default;
258
+
259
+ CallConfig GetCallConfig(grpc_metadata_batch* metadata) override;
260
+
261
+ private:
262
+ struct VirtualHost {
263
+ struct Route {
264
+ // true if an action other than kNonForwardingAction is configured.
265
+ bool unsupported_action;
266
+ XdsApi::Route::Matchers matchers;
267
+ RefCountedPtr<ServiceConfig> method_config;
268
+ };
269
+
270
+ class RouteListIterator : public XdsRouting::RouteListIterator {
271
+ public:
272
+ explicit RouteListIterator(const std::vector<Route>* routes)
273
+ : routes_(routes) {}
274
+
275
+ size_t Size() const override { return routes_->size(); }
276
+
277
+ const XdsApi::Route::Matchers& GetMatchersForRoute(
278
+ size_t index) const override {
279
+ return (*routes_)[index].matchers;
280
+ }
281
+
282
+ private:
283
+ const std::vector<Route>* routes_;
284
+ };
285
+
286
+ std::vector<std::string> domains;
287
+ std::vector<Route> routes;
288
+ };
289
+
290
+ class VirtualHostListIterator : public XdsRouting::VirtualHostListIterator {
291
+ public:
292
+ explicit VirtualHostListIterator(
293
+ const std::vector<VirtualHost>* virtual_hosts)
294
+ : virtual_hosts_(virtual_hosts) {}
295
+
296
+ size_t Size() const override { return virtual_hosts_->size(); }
297
+
298
+ const std::vector<std::string>& GetDomainsForVirtualHost(
299
+ size_t index) const override {
300
+ return (*virtual_hosts_)[index].domains;
96
301
  }
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;
302
+
303
+ private:
304
+ const std::vector<VirtualHost>* virtual_hosts_;
305
+ };
306
+
307
+ std::vector<VirtualHost> virtual_hosts_;
308
+ };
309
+
310
+ // An XdsServerConfigSelectorProvider implementation for when the
311
+ // RouteConfiguration is available inline.
312
+ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
313
+ StaticXdsServerConfigSelectorProvider
314
+ : public ServerConfigSelectorProvider {
315
+ public:
316
+ StaticXdsServerConfigSelectorProvider(
317
+ absl::StatusOr<XdsApi::RdsUpdate> static_resource,
318
+ std::vector<XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter>
319
+ http_filters)
320
+ : static_resource_(std::move(static_resource)),
321
+ http_filters_(std::move(http_filters)) {}
322
+
323
+ absl::StatusOr<RefCountedPtr<ServerConfigSelector>> Watch(
324
+ std::unique_ptr<ServerConfigSelectorProvider::ServerConfigSelectorWatcher>
325
+ watcher) override {
326
+ GPR_ASSERT(watcher_ == nullptr);
327
+ watcher_ = std::move(watcher);
328
+ if (!static_resource_.ok()) {
329
+ return static_resource_.status();
103
330
  }
331
+ return XdsServerConfigSelector::Create(static_resource_.value(),
332
+ http_filters_);
333
+ }
334
+
335
+ void CancelWatch() override { watcher_.reset(); }
336
+
337
+ private:
338
+ absl::StatusOr<XdsApi::RdsUpdate> static_resource_;
339
+ std::vector<XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter>
340
+ http_filters_;
341
+ std::unique_ptr<ServerConfigSelectorProvider::ServerConfigSelectorWatcher>
342
+ watcher_;
343
+ };
344
+
345
+ // An XdsServerConfigSelectorProvider implementation for when the
346
+ // RouteConfiguration is to be fetched separately via RDS.
347
+ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
348
+ DynamicXdsServerConfigSelectorProvider
349
+ : public ServerConfigSelectorProvider {
350
+ public:
351
+ DynamicXdsServerConfigSelectorProvider(
352
+ RefCountedPtr<XdsClient> xds_client, std::string resource_name,
353
+ absl::StatusOr<XdsApi::RdsUpdate> initial_resource,
354
+ std::vector<XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter>
355
+ http_filters);
356
+
357
+ absl::StatusOr<RefCountedPtr<ServerConfigSelector>> Watch(
358
+ std::unique_ptr<ServerConfigSelectorProvider::ServerConfigSelectorWatcher>
359
+ watcher) override;
360
+ void CancelWatch() override;
361
+
362
+ private:
363
+ class RouteConfigWatcher;
364
+
365
+ void OnRouteConfigChanged(XdsApi::RdsUpdate rds_update);
366
+ void OnError(grpc_error_handle error);
367
+ void OnResourceDoesNotExist();
368
+
369
+ RefCountedPtr<XdsClient> xds_client_;
370
+ std::string resource_name_;
371
+ std::vector<XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter>
372
+ http_filters_;
373
+ RouteConfigWatcher* route_config_watcher_ = nullptr;
374
+ Mutex mu_;
375
+ std::unique_ptr<ServerConfigSelectorProvider::ServerConfigSelectorWatcher>
376
+ watcher_ ABSL_GUARDED_BY(mu_);
377
+ absl::StatusOr<XdsApi::RdsUpdate> resource_ ABSL_GUARDED_BY(mu_);
378
+ };
379
+
380
+ // A watcher implementation for updating the RDS resource used by
381
+ // DynamicXdsServerConfigSelectorProvider
382
+ class XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
383
+ DynamicXdsServerConfigSelectorProvider::RouteConfigWatcher
384
+ : public XdsClient::RouteConfigWatcherInterface {
385
+ public:
386
+ explicit RouteConfigWatcher(
387
+ RefCountedPtr<DynamicXdsServerConfigSelectorProvider> parent)
388
+ : parent_(std::move(parent)) {}
389
+
390
+ void OnRouteConfigChanged(XdsApi::RdsUpdate route_config) override {
391
+ parent_->OnRouteConfigChanged(std::move(route_config));
392
+ }
393
+
394
+ void OnError(grpc_error_handle error) override { parent_->OnError(error); }
395
+
396
+ void OnResourceDoesNotExist() override { parent_->OnResourceDoesNotExist(); }
397
+
398
+ private:
399
+ RefCountedPtr<DynamicXdsServerConfigSelectorProvider> parent_;
400
+ };
401
+
402
+ //
403
+ // XdsServerConfigFetcher
404
+ //
405
+
406
+ XdsServerConfigFetcher::XdsServerConfigFetcher(
407
+ RefCountedPtr<XdsClient> xds_client,
408
+ grpc_server_xds_status_notifier notifier)
409
+ : xds_client_(std::move(xds_client)), serving_status_notifier_(notifier) {
410
+ GPR_ASSERT(xds_client_ != nullptr);
411
+ }
412
+
413
+ void XdsServerConfigFetcher::StartWatch(
414
+ std::string listening_address,
415
+ std::unique_ptr<grpc_server_config_fetcher::WatcherInterface> watcher) {
416
+ grpc_server_config_fetcher::WatcherInterface* watcher_ptr = watcher.get();
417
+ auto listener_watcher = MakeRefCounted<ListenerWatcher>(
418
+ xds_client_, std::move(watcher), serving_status_notifier_,
419
+ listening_address);
420
+ auto* listener_watcher_ptr = listener_watcher.get();
421
+ xds_client_->WatchListenerData(
422
+ absl::StrReplaceAll(
423
+ xds_client_->bootstrap().server_listener_resource_name_template(),
424
+ {{"%s", listening_address}}),
425
+ std::move(listener_watcher));
426
+ MutexLock lock(&mu_);
427
+ listener_watchers_.emplace(watcher_ptr, listener_watcher_ptr);
428
+ }
429
+
430
+ void XdsServerConfigFetcher::CancelWatch(
431
+ grpc_server_config_fetcher::WatcherInterface* watcher) {
432
+ MutexLock lock(&mu_);
433
+ auto it = listener_watchers_.find(watcher);
434
+ if (it != listener_watchers_.end()) {
435
+ // Cancel the watch on the listener before erasing
436
+ xds_client_->CancelListenerDataWatch(
437
+ absl::StrReplaceAll(
438
+ xds_client_->bootstrap().server_listener_resource_name_template(),
439
+ {{"%s", it->second->listening_address()}}),
440
+ it->second, false /* delay_unsubscription */);
441
+ listener_watchers_.erase(it);
442
+ }
443
+ }
444
+
445
+ //
446
+ // XdsServerConfigFetcher::ListenerWatcher
447
+ //
448
+
449
+ XdsServerConfigFetcher::ListenerWatcher::ListenerWatcher(
450
+ RefCountedPtr<XdsClient> xds_client,
451
+ std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
452
+ server_config_watcher,
453
+ grpc_server_xds_status_notifier serving_status_notifier,
454
+ std::string listening_address)
455
+ : xds_client_(std::move(xds_client)),
456
+ server_config_watcher_(std::move(server_config_watcher)),
457
+ serving_status_notifier_(serving_status_notifier),
458
+ listening_address_(std::move(listening_address)) {}
459
+
460
+ void XdsServerConfigFetcher::ListenerWatcher::OnListenerChanged(
461
+ XdsApi::LdsUpdate listener) {
462
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_server_config_fetcher_trace)) {
463
+ gpr_log(GPR_INFO,
464
+ "[ListenerWatcher %p] Received LDS update from xds client %p: %s",
465
+ this, xds_client_.get(), listener.ToString().c_str());
466
+ }
467
+ if (listener.address != listening_address_) {
468
+ MutexLock lock(&mu_);
469
+ OnFatalError(absl::FailedPreconditionError(
470
+ "Address in LDS update does not match listening address"));
471
+ return;
472
+ }
473
+ auto new_filter_chain_match_manager = MakeRefCounted<FilterChainMatchManager>(
474
+ xds_client_, std::move(listener.filter_chain_map),
475
+ std::move(listener.default_filter_chain));
476
+ MutexLock lock(&mu_);
477
+ if (filter_chain_match_manager_ == nullptr ||
478
+ !(new_filter_chain_match_manager->filter_chain_map() ==
479
+ filter_chain_match_manager_->filter_chain_map() &&
480
+ new_filter_chain_match_manager->default_filter_chain() ==
481
+ filter_chain_match_manager_->default_filter_chain())) {
482
+ pending_filter_chain_match_manager_ =
483
+ std::move(new_filter_chain_match_manager);
484
+ if (XdsRbacEnabled()) {
485
+ pending_filter_chain_match_manager_->StartRdsWatch(Ref());
486
+ } else {
487
+ PendingFilterChainMatchManagerReadyLocked(
488
+ pending_filter_chain_match_manager_.get());
489
+ }
490
+ }
491
+ }
492
+
493
+ void XdsServerConfigFetcher::ListenerWatcher::OnError(grpc_error_handle error) {
494
+ MutexLock lock(&mu_);
495
+ if (filter_chain_match_manager_ != nullptr ||
496
+ pending_filter_chain_match_manager_ != nullptr) {
497
+ gpr_log(GPR_ERROR,
498
+ "ListenerWatcher:%p XdsClient reports error: %s for %s; "
499
+ "ignoring in favor of existing resource",
500
+ this, grpc_error_std_string(error).c_str(),
501
+ listening_address_.c_str());
502
+ } else {
503
+ if (serving_status_notifier_.on_serving_status_update != nullptr) {
504
+ serving_status_notifier_.on_serving_status_update(
505
+ serving_status_notifier_.user_data, listening_address_.c_str(),
506
+ {GRPC_STATUS_UNAVAILABLE, grpc_error_std_string(error).c_str()});
507
+ } else {
508
+ gpr_log(GPR_ERROR,
509
+ "ListenerWatcher:%p error obtaining xDS Listener resource: %s; "
510
+ "not serving on %s",
511
+ this, grpc_error_std_string(error).c_str(),
512
+ listening_address_.c_str());
513
+ }
514
+ }
515
+ GRPC_ERROR_UNREF(error);
516
+ }
517
+
518
+ void XdsServerConfigFetcher::ListenerWatcher::OnFatalError(
519
+ absl::Status status) {
520
+ pending_filter_chain_match_manager_.reset();
521
+ if (filter_chain_match_manager_ != nullptr) {
522
+ // The server has started listening already, so we need to gracefully
523
+ // stop serving.
524
+ server_config_watcher_->StopServing();
525
+ filter_chain_match_manager_.reset();
526
+ }
527
+ if (serving_status_notifier_.on_serving_status_update != nullptr) {
528
+ serving_status_notifier_.on_serving_status_update(
529
+ serving_status_notifier_.user_data, listening_address_.c_str(),
530
+ {static_cast<grpc_status_code>(status.raw_code()),
531
+ std::string(status.message()).c_str()});
532
+ } else {
533
+ gpr_log(GPR_ERROR,
534
+ "ListenerWatcher:%p Encountered fatal error %s; not serving on %s",
535
+ this, status.ToString().c_str(), listening_address_.c_str());
536
+ }
537
+ }
538
+
539
+ void XdsServerConfigFetcher::ListenerWatcher::OnResourceDoesNotExist() {
540
+ MutexLock lock(&mu_);
541
+ OnFatalError(absl::NotFoundError("Requested listener does not exist"));
542
+ }
543
+
544
+ void XdsServerConfigFetcher::ListenerWatcher::
545
+ PendingFilterChainMatchManagerReadyLocked(
546
+ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager*
547
+ filter_chain_match_manager) {
548
+ if (pending_filter_chain_match_manager_ != filter_chain_match_manager) {
549
+ // This FilterChainMatchManager is no longer the current pending resource.
550
+ // It should get cleaned up eventually. Ignore this update.
551
+ return;
552
+ }
553
+ // Let the logger know about the update if there was no previous good update.
554
+ if (filter_chain_match_manager_ == nullptr) {
555
+ if (serving_status_notifier_.on_serving_status_update != nullptr) {
556
+ serving_status_notifier_.on_serving_status_update(
557
+ serving_status_notifier_.user_data, listening_address_.c_str(),
558
+ {GRPC_STATUS_OK, ""});
559
+ } else {
560
+ gpr_log(GPR_INFO,
561
+ "xDS Listener resource obtained; will start serving on %s",
562
+ listening_address_.c_str());
563
+ }
564
+ }
565
+ // Promote the pending FilterChainMatchManager
566
+ filter_chain_match_manager_ = std::move(pending_filter_chain_match_manager_);
567
+ // TODO(yashykt): Right now, the server_config_watcher_ does not invoke
568
+ // XdsServerConfigFetcher while holding a lock, but that might change in the
569
+ // future in which case we would want to execute this update outside the
570
+ // critical region through a WorkSerializer similar to XdsClient.
571
+ server_config_watcher_->UpdateConnectionManager(filter_chain_match_manager_);
572
+ }
573
+
574
+ //
575
+ // XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager
576
+ //
577
+
578
+ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
579
+ FilterChainMatchManager(
580
+ RefCountedPtr<XdsClient> xds_client,
581
+ XdsApi::LdsUpdate::FilterChainMap filter_chain_map,
582
+ absl::optional<XdsApi::LdsUpdate::FilterChainData> default_filter_chain)
583
+ : xds_client_(std::move(xds_client)),
584
+ filter_chain_map_(std::move(filter_chain_map)),
585
+ default_filter_chain_(std::move(default_filter_chain)) {}
586
+
587
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
588
+ StartRdsWatch(RefCountedPtr<ListenerWatcher> listener_watcher) {
589
+ // Get the set of RDS resources to watch on
590
+ std::set<std::string> resource_names;
591
+ for (const auto& destination_ip : filter_chain_map_.destination_ip_vector) {
592
+ for (const auto& source_type : destination_ip.source_types_array) {
593
+ for (const auto& source_ip : source_type) {
594
+ for (const auto& source_port_pair : source_ip.ports_map) {
595
+ if (!source_port_pair.second.data->http_connection_manager
596
+ .route_config_name.empty()) {
597
+ resource_names.insert(
598
+ source_port_pair.second.data->http_connection_manager
599
+ .route_config_name);
600
+ }
601
+ }
602
+ }
603
+ }
604
+ }
605
+ if (default_filter_chain_.has_value() &&
606
+ !default_filter_chain_->http_connection_manager.route_config_name
607
+ .empty()) {
608
+ resource_names.insert(
609
+ default_filter_chain_->http_connection_manager.route_config_name);
610
+ }
611
+ // Start watching on referenced RDS resources
612
+ {
613
+ MutexLock lock(&mu_);
614
+ for (const auto& resource_name : resource_names) {
615
+ ++rds_resources_yet_to_fetch_;
616
+ auto route_config_watcher =
617
+ MakeRefCounted<RouteConfigWatcher>(resource_name, WeakRef());
618
+ rds_map_.emplace(resource_name, RdsUpdateState{route_config_watcher.get(),
619
+ absl::nullopt});
620
+ xds_client_->WatchRouteConfigData(resource_name,
621
+ std::move(route_config_watcher));
622
+ }
623
+ if (rds_resources_yet_to_fetch_ != 0) {
624
+ listener_watcher_ = std::move(listener_watcher);
625
+ listener_watcher = nullptr;
626
+ }
627
+ }
628
+ // Promote this filter chain match manager if all referenced resources are
629
+ // fetched.
630
+ if (listener_watcher != nullptr) {
631
+ listener_watcher->PendingFilterChainMatchManagerReadyLocked(this);
632
+ }
633
+ }
634
+
635
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
636
+ Orphan() {
637
+ MutexLock lock(&mu_);
638
+ // Cancel the RDS watches to clear up the weak refs
639
+ for (const auto& entry : rds_map_) {
640
+ xds_client_->CancelRouteConfigDataWatch(entry.first, entry.second.watcher,
641
+ false /* delay_unsubscription */);
642
+ }
643
+ // Also give up the ref on ListenerWatcher since it won't be needed anymore
644
+ listener_watcher_.reset();
645
+ }
646
+
647
+ absl::StatusOr<RefCountedPtr<XdsCertificateProvider>>
648
+ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
649
+ CreateOrGetXdsCertificateProviderFromFilterChainData(
650
+ const XdsApi::LdsUpdate::FilterChainData* filter_chain) {
651
+ MutexLock lock(&mu_);
652
+ auto it = certificate_providers_map_.find(filter_chain);
653
+ if (it != certificate_providers_map_.end()) {
654
+ return it->second.xds;
655
+ }
656
+ CertificateProviders certificate_providers;
657
+ // Configure root cert.
658
+ absl::string_view root_provider_instance_name =
659
+ filter_chain->downstream_tls_context.common_tls_context
660
+ .certificate_validation_context.ca_certificate_provider_instance
661
+ .instance_name;
662
+ absl::string_view root_provider_cert_name =
663
+ filter_chain->downstream_tls_context.common_tls_context
664
+ .certificate_validation_context.ca_certificate_provider_instance
665
+ .certificate_name;
666
+ if (!root_provider_instance_name.empty()) {
667
+ certificate_providers.root =
668
+ xds_client_->certificate_provider_store()
669
+ .CreateOrGetCertificateProvider(root_provider_instance_name);
670
+ if (certificate_providers.root == nullptr) {
671
+ return absl::NotFoundError(
672
+ absl::StrCat("Certificate provider instance name: \"",
673
+ root_provider_instance_name, "\" not recognized."));
674
+ }
675
+ }
676
+ // Configure identity cert.
677
+ absl::string_view identity_provider_instance_name =
678
+ filter_chain->downstream_tls_context.common_tls_context
679
+ .tls_certificate_provider_instance.instance_name;
680
+ absl::string_view identity_provider_cert_name =
681
+ filter_chain->downstream_tls_context.common_tls_context
682
+ .tls_certificate_provider_instance.certificate_name;
683
+ if (!identity_provider_instance_name.empty()) {
684
+ certificate_providers.instance =
685
+ xds_client_->certificate_provider_store()
686
+ .CreateOrGetCertificateProvider(identity_provider_instance_name);
687
+ if (certificate_providers.instance == nullptr) {
688
+ return absl::NotFoundError(
689
+ absl::StrCat("Certificate provider instance name: \"",
690
+ identity_provider_instance_name, "\" not recognized."));
691
+ }
692
+ }
693
+ certificate_providers.xds = MakeRefCounted<XdsCertificateProvider>();
694
+ certificate_providers.xds->UpdateRootCertNameAndDistributor(
695
+ "", root_provider_cert_name,
696
+ certificate_providers.root == nullptr
697
+ ? nullptr
698
+ : certificate_providers.root->distributor());
699
+ certificate_providers.xds->UpdateIdentityCertNameAndDistributor(
700
+ "", identity_provider_cert_name,
701
+ certificate_providers.instance == nullptr
702
+ ? nullptr
703
+ : certificate_providers.instance->distributor());
704
+ certificate_providers.xds->UpdateRequireClientCertificate(
705
+ "", filter_chain->downstream_tls_context.require_client_certificate);
706
+ auto xds_certificate_provider = certificate_providers.xds;
707
+ certificate_providers_map_.emplace(filter_chain,
708
+ std::move(certificate_providers));
709
+ return xds_certificate_provider;
710
+ }
711
+
712
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
713
+ OnRouteConfigChanged(const std::string& resource_name,
714
+ XdsApi::RdsUpdate route_config) {
715
+ RefCountedPtr<ListenerWatcher> listener_watcher;
716
+ {
717
+ MutexLock lock(&mu_);
718
+ auto& state = rds_map_[resource_name];
719
+ if (!state.rds_update.has_value()) {
720
+ if (--rds_resources_yet_to_fetch_ == 0) {
721
+ listener_watcher = std::move(listener_watcher_);
722
+ }
723
+ }
724
+ state.rds_update = std::move(route_config);
725
+ }
726
+ // Promote the filter chain match manager object if all the referenced
727
+ // resources are fetched.
728
+ if (listener_watcher != nullptr) {
729
+ listener_watcher->PendingFilterChainMatchManagerReady(this);
730
+ }
731
+ }
732
+
733
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::OnError(
734
+ const std::string& resource_name, grpc_error_handle error) {
735
+ RefCountedPtr<ListenerWatcher> listener_watcher;
736
+ {
737
+ MutexLock lock(&mu_);
738
+ auto& state = rds_map_[resource_name];
739
+ if (!state.rds_update.has_value()) {
740
+ if (--rds_resources_yet_to_fetch_ == 0) {
741
+ listener_watcher = std::move(listener_watcher_);
742
+ }
743
+ state.rds_update = grpc_error_to_absl_status(error);
744
+ } else {
745
+ // Prefer existing good version over current errored version
746
+ if (!state.rds_update->ok()) {
747
+ state.rds_update = grpc_error_to_absl_status(error);
748
+ }
749
+ }
750
+ }
751
+ // Promote the filter chain match manager object if all the referenced
752
+ // resources are fetched.
753
+ if (listener_watcher != nullptr) {
754
+ listener_watcher->PendingFilterChainMatchManagerReady(this);
755
+ }
756
+ GRPC_ERROR_UNREF(error);
757
+ }
758
+
759
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
760
+ OnResourceDoesNotExist(const std::string& resource_name) {
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 =
771
+ absl::NotFoundError("Requested route config does not exist");
772
+ }
773
+ // Promote the filter chain match manager object if all the referenced
774
+ // resources are fetched.
775
+ if (listener_watcher != nullptr) {
776
+ listener_watcher->PendingFilterChainMatchManagerReady(this);
104
777
  }
105
- return false;
106
778
  }
107
779
 
108
780
  const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForSourcePort(
@@ -148,6 +820,26 @@ const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForSourceIp(
148
820
  return FindFilterChainDataForSourcePort(best_match->ports_map, port);
149
821
  }
150
822
 
823
+ bool IsLoopbackIp(const grpc_resolved_address* address) {
824
+ const grpc_sockaddr* sock_addr =
825
+ reinterpret_cast<const grpc_sockaddr*>(&address->addr);
826
+ if (sock_addr->sa_family == GRPC_AF_INET) {
827
+ const grpc_sockaddr_in* addr4 =
828
+ reinterpret_cast<const grpc_sockaddr_in*>(sock_addr);
829
+ if (addr4->sin_addr.s_addr == grpc_htonl(INADDR_LOOPBACK)) {
830
+ return true;
831
+ }
832
+ } else if (sock_addr->sa_family == GRPC_AF_INET6) {
833
+ const grpc_sockaddr_in6* addr6 =
834
+ reinterpret_cast<const grpc_sockaddr_in6*>(sock_addr);
835
+ if (memcmp(&addr6->sin6_addr, &in6addr_loopback,
836
+ sizeof(in6addr_loopback)) == 0) {
837
+ return true;
838
+ }
839
+ }
840
+ return false;
841
+ }
842
+
151
843
  const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForSourceType(
152
844
  const XdsApi::LdsUpdate::FilterChainMap::ConnectionSourceTypesArray&
153
845
  source_types_array,
@@ -247,73 +939,9 @@ const XdsApi::LdsUpdate::FilterChainData* FindFilterChainDataForDestinationIp(
247
939
  host);
248
940
  }
249
941
 
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) {
942
+ absl::StatusOr<grpc_channel_args*> XdsServerConfigFetcher::ListenerWatcher::
943
+ FilterChainMatchManager::UpdateChannelArgsForConnection(
944
+ grpc_channel_args* args, grpc_endpoint* tcp) {
317
945
  const auto* filter_chain = FindFilterChainDataForDestinationIp(
318
946
  filter_chain_map_.destination_ip_vector, tcp);
319
947
  if (filter_chain == nullptr && default_filter_chain_.has_value()) {
@@ -323,195 +951,279 @@ FilterChainMatchManager::UpdateChannelArgsForConnection(grpc_channel_args* args,
323
951
  grpc_channel_args_destroy(args);
324
952
  return absl::UnavailableError("No matching filter chain found");
325
953
  }
326
- // Nothing to update if credentials are not xDS.
954
+ absl::InlinedVector<grpc_arg, 3> args_to_add;
955
+ RefCountedPtr<ServerConfigSelectorProvider> server_config_selector_provider;
956
+ RefCountedPtr<XdsChannelStackModifier> channel_stack_modifier;
957
+ RefCountedPtr<XdsCertificateProvider> xds_certificate_provider;
958
+ // Add config selector filter
959
+ if (XdsRbacEnabled()) {
960
+ std::vector<const grpc_channel_filter*> filters;
961
+ // Iterate the list of HTTP filters in reverse since in Core, received data
962
+ // flows *up* the stack.
963
+ for (auto reverse_iterator =
964
+ filter_chain->http_connection_manager.http_filters.rbegin();
965
+ reverse_iterator !=
966
+ filter_chain->http_connection_manager.http_filters.rend();
967
+ ++reverse_iterator) {
968
+ // Find filter. This is guaranteed to succeed, because it's checked
969
+ // at config validation time in the XdsApi code.
970
+ const XdsHttpFilterImpl* filter_impl =
971
+ XdsHttpFilterRegistry::GetFilterForType(
972
+ reverse_iterator->config.config_proto_type_name);
973
+ GPR_ASSERT(filter_impl != nullptr);
974
+ // Some filters like the router filter are no-op filters and do not have
975
+ // an implementation.
976
+ if (filter_impl->channel_filter() != nullptr) {
977
+ filters.push_back(filter_impl->channel_filter());
978
+ }
979
+ }
980
+ filters.push_back(&kServerConfigSelectorFilter);
981
+ channel_stack_modifier =
982
+ MakeRefCounted<XdsChannelStackModifier>(std::move(filters));
983
+ if (filter_chain->http_connection_manager.rds_update.has_value()) {
984
+ server_config_selector_provider =
985
+ MakeRefCounted<StaticXdsServerConfigSelectorProvider>(
986
+ filter_chain->http_connection_manager.rds_update.value(),
987
+ filter_chain->http_connection_manager.http_filters);
988
+ } else {
989
+ absl::StatusOr<XdsApi::RdsUpdate> initial_resource;
990
+ {
991
+ MutexLock lock(&mu_);
992
+ initial_resource =
993
+ rds_map_[filter_chain->http_connection_manager.route_config_name]
994
+ .rds_update.value();
995
+ }
996
+ server_config_selector_provider =
997
+ MakeRefCounted<DynamicXdsServerConfigSelectorProvider>(
998
+ xds_client_,
999
+ filter_chain->http_connection_manager.route_config_name,
1000
+ std::move(initial_resource),
1001
+ filter_chain->http_connection_manager.http_filters);
1002
+ }
1003
+ args_to_add.emplace_back(server_config_selector_provider->MakeChannelArg());
1004
+ args_to_add.emplace_back(channel_stack_modifier->MakeChannelArg());
1005
+ }
1006
+ // Add XdsCertificateProvider if credentials are xDS.
327
1007
  grpc_server_credentials* server_creds =
328
1008
  grpc_find_server_credentials_in_args(args);
329
- if (server_creds == nullptr || server_creds->type() != kCredentialsTypeXds) {
330
- return args;
1009
+ if (server_creds != nullptr && server_creds->type() == kCredentialsTypeXds) {
1010
+ absl::StatusOr<RefCountedPtr<XdsCertificateProvider>> result =
1011
+ CreateOrGetXdsCertificateProviderFromFilterChainData(filter_chain);
1012
+ if (!result.ok()) {
1013
+ grpc_channel_args_destroy(args);
1014
+ return result.status();
1015
+ }
1016
+ xds_certificate_provider = std::move(*result);
1017
+ GPR_ASSERT(xds_certificate_provider != nullptr);
1018
+ args_to_add.emplace_back(xds_certificate_provider->MakeChannelArg());
331
1019
  }
332
- absl::StatusOr<RefCountedPtr<XdsCertificateProvider>> result =
333
- CreateOrGetXdsCertificateProviderFromFilterChainData(filter_chain);
334
- if (!result.ok()) {
1020
+ if (!args_to_add.empty()) {
1021
+ grpc_channel_args* updated_args = grpc_channel_args_copy_and_add(
1022
+ args, args_to_add.data(), args_to_add.size());
335
1023
  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;
346
- }
347
-
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
- }
355
-
356
- void StartWatch(std::string listening_address,
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), 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;
373
- }
374
-
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);
385
- }
1024
+ args = updated_args;
386
1025
  }
1026
+ return args;
1027
+ }
387
1028
 
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
- }
1029
+ //
1030
+ // XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::XdsServerConfigSelector
1031
+ //
392
1032
 
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
- 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
- xds_client_(std::move(xds_client)),
404
- serving_status_notifier_(serving_status_notifier),
405
- listening_address_(std::move(listening_address)) {}
406
-
407
- // Deleted due to special handling required for args_. Copy the channel args
408
- // if we ever need these.
409
- ListenerWatcher(const ListenerWatcher&) = delete;
410
- ListenerWatcher& operator=(const ListenerWatcher&) = delete;
411
-
412
- void OnListenerChanged(XdsApi::LdsUpdate listener) override {
413
- if (GRPC_TRACE_FLAG_ENABLED(grpc_xds_server_config_fetcher_trace)) {
414
- gpr_log(
415
- GPR_INFO,
416
- "[ListenerWatcher %p] Received LDS update from xds client %p: %s",
417
- this, xds_client_.get(), listener.ToString().c_str());
418
- }
419
- if (listener.address != listening_address_) {
420
- OnFatalError(absl::FailedPreconditionError(
421
- "Address in LDS update does not match listening address"));
422
- return;
1033
+ absl::StatusOr<
1034
+ RefCountedPtr<XdsServerConfigFetcher::ListenerWatcher::
1035
+ FilterChainMatchManager::XdsServerConfigSelector>>
1036
+ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1037
+ XdsServerConfigSelector::Create(
1038
+ XdsApi::RdsUpdate rds_update,
1039
+ const std::vector<XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter>&
1040
+ http_filters) {
1041
+ auto config_selector = MakeRefCounted<XdsServerConfigSelector>();
1042
+ for (auto& vhost : rds_update.virtual_hosts) {
1043
+ config_selector->virtual_hosts_.emplace_back();
1044
+ auto& virtual_host = config_selector->virtual_hosts_.back();
1045
+ virtual_host.domains = std::move(vhost.domains);
1046
+ for (auto& route : vhost.routes) {
1047
+ virtual_host.routes.emplace_back();
1048
+ auto& config_selector_route = virtual_host.routes.back();
1049
+ config_selector_route.matchers = std::move(route.matchers);
1050
+ config_selector_route.unsupported_action =
1051
+ absl::get_if<XdsApi::Route::NonForwardingAction>(&route.action) ==
1052
+ nullptr;
1053
+ XdsRouting::GeneratePerHttpFilterConfigsResult result =
1054
+ XdsRouting::GeneratePerHTTPFilterConfigs(http_filters, vhost, route,
1055
+ nullptr, nullptr);
1056
+ if (result.error != GRPC_ERROR_NONE) {
1057
+ return grpc_error_to_absl_status(result.error);
423
1058
  }
424
- if (filter_chain_match_manager_ == nullptr) {
425
- if (serving_status_notifier_.on_serving_status_update != nullptr) {
426
- serving_status_notifier_.on_serving_status_update(
427
- serving_status_notifier_.user_data, listening_address_.c_str(),
428
- {GRPC_STATUS_OK, ""});
429
- } else {
430
- gpr_log(GPR_INFO,
431
- "xDS Listener resource obtained; will start serving on %s",
432
- listening_address_.c_str());
433
- }
1059
+ std::vector<std::string> fields;
1060
+ fields.reserve(result.per_filter_configs.size());
1061
+ for (const auto& p : result.per_filter_configs) {
1062
+ fields.emplace_back(absl::StrCat(" \"", p.first, "\": [\n",
1063
+ absl::StrJoin(p.second, ",\n"),
1064
+ "\n ]"));
434
1065
  }
435
- if (filter_chain_match_manager_ == nullptr ||
436
- !(listener.filter_chain_map ==
437
- filter_chain_match_manager_->filter_chain_map() &&
438
- listener.default_filter_chain ==
439
- filter_chain_match_manager_->default_filter_chain())) {
440
- filter_chain_match_manager_ = MakeRefCounted<FilterChainMatchManager>(
441
- xds_client_, std::move(listener.filter_chain_map),
442
- std::move(listener.default_filter_chain));
443
- server_config_watcher_->UpdateConnectionManager(
444
- filter_chain_match_manager_);
1066
+ if (!fields.empty()) {
1067
+ std::string json = absl::StrCat(
1068
+ "{\n"
1069
+ " \"methodConfig\": [ {\n"
1070
+ " \"name\": [\n"
1071
+ " {}\n"
1072
+ " ],\n"
1073
+ " ",
1074
+ absl::StrJoin(fields, ",\n"),
1075
+ "\n } ]\n"
1076
+ "}");
1077
+ grpc_error_handle error = GRPC_ERROR_NONE;
1078
+ config_selector_route.method_config =
1079
+ ServiceConfig::Create(result.args, json.c_str(), &error);
1080
+ GPR_ASSERT(error == GRPC_ERROR_NONE);
445
1081
  }
1082
+ grpc_channel_args_destroy(result.args);
446
1083
  }
1084
+ }
1085
+ return config_selector;
1086
+ }
447
1087
 
448
- void OnError(grpc_error_handle error) override {
449
- if (filter_chain_match_manager_ != nullptr) {
450
- gpr_log(GPR_ERROR,
451
- "ListenerWatcher:%p XdsClient reports error: %s for %s; "
452
- "ignoring in favor of existing resource",
453
- this, grpc_error_std_string(error).c_str(),
454
- listening_address_.c_str());
455
- } else {
456
- if (serving_status_notifier_.on_serving_status_update != nullptr) {
457
- serving_status_notifier_.on_serving_status_update(
458
- serving_status_notifier_.user_data, listening_address_.c_str(),
459
- {GRPC_STATUS_UNAVAILABLE, grpc_error_std_string(error).c_str()});
460
- } else {
461
- gpr_log(
462
- GPR_ERROR,
463
- "ListenerWatcher:%p error obtaining xDS Listener resource: %s; "
464
- "not serving on %s",
465
- this, grpc_error_std_string(error).c_str(),
466
- listening_address_.c_str());
467
- }
468
- }
469
- GRPC_ERROR_UNREF(error);
1088
+ ServerConfigSelector::CallConfig XdsServerConfigFetcher::ListenerWatcher::
1089
+ FilterChainMatchManager::XdsServerConfigSelector::GetCallConfig(
1090
+ grpc_metadata_batch* metadata) {
1091
+ CallConfig call_config;
1092
+ if (metadata->legacy_index()->named.path == nullptr) {
1093
+ call_config.error = GRPC_ERROR_CREATE_FROM_STATIC_STRING("No path found");
1094
+ return call_config;
1095
+ }
1096
+ absl::string_view path = StringViewFromSlice(
1097
+ GRPC_MDVALUE(metadata->legacy_index()->named.path->md));
1098
+ if (metadata->legacy_index()->named.authority == nullptr) {
1099
+ call_config.error =
1100
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("No authority found");
1101
+ return call_config;
1102
+ }
1103
+ absl::string_view authority = StringViewFromSlice(
1104
+ GRPC_MDVALUE(metadata->legacy_index()->named.authority->md));
1105
+ auto vhost_index = XdsRouting::FindVirtualHostForDomain(
1106
+ VirtualHostListIterator(&virtual_hosts_), authority);
1107
+ if (!vhost_index.has_value()) {
1108
+ call_config.error =
1109
+ grpc_error_set_int(GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
1110
+ "could not find VirtualHost for ", authority,
1111
+ " in RouteConfiguration")),
1112
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
1113
+ return call_config;
1114
+ }
1115
+ auto& virtual_host = virtual_hosts_[vhost_index.value()];
1116
+ auto route_index = XdsRouting::GetRouteForRequest(
1117
+ VirtualHost::RouteListIterator(&virtual_host.routes), path, metadata);
1118
+ if (route_index.has_value()) {
1119
+ auto& route = virtual_host.routes[route_index.value()];
1120
+ // Found the matching route
1121
+ if (route.unsupported_action) {
1122
+ call_config.error = grpc_error_set_int(
1123
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1124
+ "Matching route has unsupported action"),
1125
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
1126
+ return call_config;
470
1127
  }
471
-
472
- void OnFatalError(absl::Status status) {
473
- gpr_log(
474
- GPR_ERROR,
475
- "ListenerWatcher:%p Encountered fatal error %s; not serving on %s",
476
- this, status.ToString().c_str(), listening_address_.c_str());
477
- if (filter_chain_match_manager_ != nullptr) {
478
- // The server has started listening already, so we need to gracefully
479
- // stop serving.
480
- server_config_watcher_->StopServing();
481
- filter_chain_match_manager_.reset();
482
- }
483
- if (serving_status_notifier_.on_serving_status_update != nullptr) {
484
- serving_status_notifier_.on_serving_status_update(
485
- serving_status_notifier_.user_data, listening_address_.c_str(),
486
- {static_cast<grpc_status_code>(status.raw_code()),
487
- std::string(status.message()).c_str()});
488
- }
1128
+ if (route.method_config != nullptr) {
1129
+ call_config.method_configs =
1130
+ route.method_config->GetMethodParsedConfigVector(grpc_empty_slice());
1131
+ call_config.service_config = route.method_config;
489
1132
  }
1133
+ return call_config;
1134
+ }
1135
+ call_config.error = grpc_error_set_int(
1136
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("No route matched"),
1137
+ GRPC_ERROR_INT_GRPC_STATUS, GRPC_STATUS_UNAVAILABLE);
1138
+ return call_config;
1139
+ }
490
1140
 
491
- void OnResourceDoesNotExist() override {
492
- OnFatalError(absl::NotFoundError("Requested listener does not exist"));
493
- }
1141
+ //
1142
+ // XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::DynamicXdsServerConfigSelectorProvider
1143
+ //
494
1144
 
495
- private:
496
- std::unique_ptr<grpc_server_config_fetcher::WatcherInterface>
497
- server_config_watcher_;
498
- RefCountedPtr<XdsClient> xds_client_;
499
- grpc_server_xds_status_notifier serving_status_notifier_;
500
- std::string listening_address_;
501
- RefCountedPtr<FilterChainMatchManager> filter_chain_match_manager_;
502
- };
1145
+ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1146
+ DynamicXdsServerConfigSelectorProvider::
1147
+ DynamicXdsServerConfigSelectorProvider(
1148
+ RefCountedPtr<XdsClient> xds_client, std::string resource_name,
1149
+ absl::StatusOr<XdsApi::RdsUpdate> initial_resource,
1150
+ std::vector<XdsApi::LdsUpdate::HttpConnectionManager::HttpFilter>
1151
+ http_filters)
1152
+ : xds_client_(std::move(xds_client)),
1153
+ resource_name_(std::move(resource_name)),
1154
+ http_filters_(std::move(http_filters)),
1155
+ resource_(std::move(initial_resource)) {
1156
+ GPR_ASSERT(!resource_name_.empty());
1157
+ auto route_config_watcher = MakeRefCounted<RouteConfigWatcher>(Ref());
1158
+ route_config_watcher_ = route_config_watcher.get();
1159
+ xds_client_->WatchRouteConfigData(resource_name_,
1160
+ std::move(route_config_watcher));
1161
+ }
503
1162
 
504
- struct WatcherState {
505
- std::string listening_address;
506
- ListenerWatcher* listener_watcher = nullptr;
507
- };
1163
+ absl::StatusOr<RefCountedPtr<ServerConfigSelector>>
1164
+ XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1165
+ DynamicXdsServerConfigSelectorProvider::Watch(
1166
+ std::unique_ptr<
1167
+ ServerConfigSelectorProvider::ServerConfigSelectorWatcher>
1168
+ watcher) {
1169
+ absl::StatusOr<XdsApi::RdsUpdate> resource;
1170
+ {
1171
+ MutexLock lock(&mu_);
1172
+ GPR_ASSERT(watcher_ == nullptr);
1173
+ watcher_ = std::move(watcher);
1174
+ resource = resource_;
1175
+ }
1176
+ if (!resource.ok()) {
1177
+ return resource.status();
1178
+ }
1179
+ return XdsServerConfigSelector::Create(resource.value(), http_filters_);
1180
+ }
508
1181
 
509
- RefCountedPtr<XdsClient> xds_client_;
510
- grpc_server_xds_status_notifier serving_status_notifier_;
511
- Mutex mu_;
512
- std::map<grpc_server_config_fetcher::WatcherInterface*, WatcherState>
513
- watchers_ ABSL_GUARDED_BY(mu_);
514
- };
1182
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1183
+ DynamicXdsServerConfigSelectorProvider::CancelWatch() {
1184
+ xds_client_->CancelRouteConfigDataWatch(resource_name_, route_config_watcher_,
1185
+ false /* delay_unsubscription */);
1186
+ MutexLock lock(&mu_);
1187
+ watcher_.reset();
1188
+ }
1189
+
1190
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1191
+ DynamicXdsServerConfigSelectorProvider::OnRouteConfigChanged(
1192
+ XdsApi::RdsUpdate rds_update) {
1193
+ MutexLock lock(&mu_);
1194
+ resource_ = std::move(rds_update);
1195
+ if (watcher_ == nullptr) {
1196
+ return;
1197
+ }
1198
+ watcher_->OnServerConfigSelectorUpdate(
1199
+ XdsServerConfigSelector::Create(*resource_, http_filters_));
1200
+ }
1201
+
1202
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1203
+ DynamicXdsServerConfigSelectorProvider::OnError(grpc_error_handle error) {
1204
+ MutexLock lock(&mu_);
1205
+ // Prefer existing good update.
1206
+ if (resource_.ok()) {
1207
+ GRPC_ERROR_UNREF(error);
1208
+ return;
1209
+ }
1210
+ resource_ = grpc_error_to_absl_status(error);
1211
+ GRPC_ERROR_UNREF(error);
1212
+ if (watcher_ == nullptr) {
1213
+ return;
1214
+ }
1215
+ watcher_->OnServerConfigSelectorUpdate(resource_.status());
1216
+ }
1217
+
1218
+ void XdsServerConfigFetcher::ListenerWatcher::FilterChainMatchManager::
1219
+ DynamicXdsServerConfigSelectorProvider::OnResourceDoesNotExist() {
1220
+ MutexLock lock(&mu_);
1221
+ resource_ = absl::NotFoundError("Requested route config does not exist");
1222
+ if (watcher_ == nullptr) {
1223
+ return;
1224
+ }
1225
+ watcher_->OnServerConfigSelectorUpdate(resource_.status());
1226
+ }
515
1227
 
516
1228
  } // namespace
517
1229
  } // namespace grpc_core
@@ -520,7 +1232,9 @@ grpc_server_config_fetcher* grpc_server_config_fetcher_xds_create(
520
1232
  grpc_server_xds_status_notifier notifier, const grpc_channel_args* args) {
521
1233
  grpc_core::ApplicationCallbackExecCtx callback_exec_ctx;
522
1234
  grpc_core::ExecCtx exec_ctx;
523
- args = grpc_channel_args_remove_grpc_internal(args);
1235
+ args = grpc_core::CoreConfiguration::Get()
1236
+ .channel_args_preconditioning()
1237
+ .PreconditionChannelArgs(args);
524
1238
  GRPC_API_TRACE("grpc_server_config_fetcher_xds_create()", 0, ());
525
1239
  grpc_error_handle error = GRPC_ERROR_NONE;
526
1240
  grpc_core::RefCountedPtr<grpc_core::XdsClient> xds_client =