grpc 1.37.1 → 1.40.0.pre1

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

Potentially problematic release.


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

Files changed (738) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +112 -59
  3. data/include/grpc/event_engine/README.md +38 -0
  4. data/include/grpc/event_engine/endpoint_config.h +48 -0
  5. data/include/grpc/event_engine/event_engine.h +330 -0
  6. data/include/grpc/event_engine/port.h +41 -0
  7. data/include/grpc/event_engine/slice_allocator.h +66 -0
  8. data/include/grpc/grpc.h +11 -4
  9. data/include/grpc/grpc_security.h +32 -0
  10. data/include/grpc/grpc_security_constants.h +15 -0
  11. data/include/grpc/impl/codegen/grpc_types.h +44 -19
  12. data/include/grpc/impl/codegen/port_platform.h +46 -0
  13. data/include/grpc/module.modulemap +14 -14
  14. data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
  15. data/src/core/ext/filters/client_channel/channel_connectivity.cc +177 -202
  16. data/src/core/ext/filters/client_channel/client_channel.cc +975 -3282
  17. data/src/core/ext/filters/client_channel/client_channel.h +513 -55
  18. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -1
  19. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +4 -1
  20. data/src/core/ext/filters/client_channel/config_selector.h +20 -7
  21. data/src/core/ext/filters/client_channel/connector.h +1 -1
  22. data/src/core/ext/filters/client_channel/dynamic_filters.cc +9 -10
  23. data/src/core/ext/filters/client_channel/dynamic_filters.h +3 -3
  24. data/src/core/ext/filters/client_channel/health/health_check_client.cc +28 -27
  25. data/src/core/ext/filters/client_channel/health/health_check_client.h +30 -29
  26. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +24 -21
  27. data/src/core/ext/filters/client_channel/http_proxy.cc +16 -1
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +6 -6
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +53 -51
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +2 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +14 -23
  33. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +16 -16
  34. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +734 -0
  35. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +10 -0
  36. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +10 -17
  37. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +1 -1
  38. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +17 -20
  39. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +53 -65
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +36 -44
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +33 -55
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +151 -163
  43. data/src/core/ext/filters/client_channel/lb_policy.cc +2 -16
  44. data/src/core/ext/filters/client_channel/lb_policy.h +70 -46
  45. data/src/core/ext/filters/client_channel/lb_policy_factory.h +1 -1
  46. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +4 -4
  47. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  48. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +24 -18
  49. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +1 -1
  50. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_event_engine.cc +31 -0
  51. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +3 -3
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +14 -14
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +33 -24
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_event_engine.cc +28 -0
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_libuv.cc +1 -1
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  59. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +18 -12
  60. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +20 -28
  61. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +7 -5
  62. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +20 -13
  63. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -1
  64. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +158 -102
  65. data/src/core/ext/filters/client_channel/resolver.h +2 -2
  66. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +32 -239
  67. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +20 -49
  68. data/src/core/ext/filters/client_channel/retry_filter.cc +2598 -0
  69. data/src/core/ext/filters/client_channel/retry_filter.h +30 -0
  70. data/src/core/ext/filters/client_channel/retry_service_config.cc +316 -0
  71. data/src/core/ext/filters/client_channel/retry_service_config.h +96 -0
  72. data/src/core/ext/filters/client_channel/server_address.cc +1 -1
  73. data/src/core/ext/filters/client_channel/service_config.cc +15 -14
  74. data/src/core/ext/filters/client_channel/service_config.h +7 -6
  75. data/src/core/ext/filters/client_channel/service_config_call_data.h +45 -5
  76. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +5 -4
  77. data/src/core/ext/filters/client_channel/service_config_parser.cc +6 -6
  78. data/src/core/ext/filters/client_channel/service_config_parser.h +7 -4
  79. data/src/core/ext/filters/client_channel/subchannel.cc +17 -16
  80. data/src/core/ext/filters/client_channel/subchannel.h +7 -6
  81. data/src/core/ext/filters/client_idle/client_idle_filter.cc +17 -16
  82. data/src/core/ext/filters/deadline/deadline_filter.cc +10 -10
  83. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +19 -18
  84. data/src/core/ext/filters/fault_injection/service_config_parser.cc +5 -5
  85. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  86. data/src/core/ext/filters/http/client/http_client_filter.cc +33 -23
  87. data/src/core/ext/filters/http/client_authority_filter.cc +3 -3
  88. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +23 -22
  89. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +21 -21
  90. data/src/core/ext/filters/http/server/http_server_filter.cc +27 -23
  91. data/src/core/ext/filters/max_age/max_age_filter.cc +12 -10
  92. data/src/core/ext/filters/message_size/message_size_filter.cc +14 -11
  93. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  94. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +4 -3
  95. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +7 -7
  96. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +7 -7
  97. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +2 -2
  98. data/src/core/ext/transport/chttp2/client/insecure/channel_create_posix.cc +3 -2
  99. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +3 -3
  100. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +49 -46
  101. data/src/core/ext/transport/chttp2/server/chttp2_server.h +2 -2
  102. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2.cc +3 -4
  103. data/src/core/ext/transport/chttp2/server/insecure/server_chttp2_posix.cc +5 -4
  104. data/src/core/ext/transport/chttp2/server/secure/server_secure_chttp2.cc +3 -4
  105. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +1 -1
  106. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.cc +66 -0
  107. data/src/core/ext/transport/chttp2/transport/chttp2_slice_allocator.h +74 -0
  108. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +141 -126
  109. data/src/core/ext/transport/chttp2/transport/context_list.cc +4 -5
  110. data/src/core/ext/transport/chttp2/transport/context_list.h +4 -4
  111. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  112. data/src/core/ext/transport/chttp2/transport/flow_control.h +9 -9
  113. data/src/core/ext/transport/chttp2/transport/frame_data.cc +12 -12
  114. data/src/core/ext/transport/chttp2/transport/frame_data.h +10 -10
  115. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +15 -16
  116. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +6 -6
  117. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +7 -8
  118. data/src/core/ext/transport/chttp2/transport/frame_ping.h +7 -6
  119. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +7 -7
  120. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +6 -6
  121. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +11 -10
  122. data/src/core/ext/transport/chttp2/transport/frame_settings.h +6 -6
  123. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -6
  124. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +4 -6
  125. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +652 -736
  126. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +195 -74
  127. data/src/core/ext/transport/chttp2/transport/hpack_table.cc +4 -3
  128. data/src/core/ext/transport/chttp2/transport/hpack_table.h +4 -4
  129. data/src/core/ext/transport/chttp2/transport/incoming_metadata.cc +2 -2
  130. data/src/core/ext/transport/chttp2/transport/incoming_metadata.h +2 -2
  131. data/src/core/ext/transport/chttp2/transport/internal.h +33 -28
  132. data/src/core/ext/transport/chttp2/transport/parsing.cc +129 -106
  133. data/src/core/ext/transport/chttp2/transport/varint.cc +6 -4
  134. data/src/core/ext/transport/chttp2/transport/writing.cc +7 -3
  135. data/src/core/ext/transport/inproc/inproc_transport.cc +72 -60
  136. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +56 -35
  137. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +180 -76
  138. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +35 -27
  139. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +97 -48
  140. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +45 -9
  141. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +67 -7
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +66 -9
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +227 -0
  144. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +46 -0
  145. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +121 -0
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +1 -0
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +35 -0
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +90 -0
  149. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +32 -24
  150. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +120 -73
  151. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +4 -2
  152. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +15 -0
  153. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +48 -0
  154. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +171 -0
  155. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +8 -6
  156. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +27 -19
  157. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +1 -0
  158. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +24 -7
  159. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +57 -0
  160. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +29 -17
  161. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +72 -0
  162. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +3 -2
  163. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +4 -0
  164. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +6 -5
  165. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +15 -11
  166. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +85 -43
  167. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +274 -91
  168. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +11 -8
  169. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +30 -13
  170. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +33 -5
  171. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +115 -0
  172. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +60 -0
  173. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +181 -0
  174. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +1 -0
  175. data/src/core/ext/upb-generated/validate/validate.upb.c +82 -66
  176. data/src/core/ext/upb-generated/validate/validate.upb.h +220 -124
  177. data/src/core/ext/upbdefs-generated/envoy/annotations/deprecation.upbdefs.c +15 -7
  178. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +53 -52
  179. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +318 -277
  180. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.h +5 -0
  181. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +437 -410
  182. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +198 -170
  183. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.h +10 -0
  184. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/config_source.upbdefs.c +9 -8
  185. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +219 -163
  186. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.h +15 -0
  187. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.c +59 -0
  188. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/resolver.upbdefs.h +40 -0
  189. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +29 -25
  190. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.c +52 -0
  191. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/udp_socket_config.upbdefs.h +35 -0
  192. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +135 -125
  193. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  194. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener_components.upbdefs.c +131 -123
  195. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.c +90 -0
  196. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/quic_config.upbdefs.h +35 -0
  197. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +32 -24
  198. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +69 -55
  199. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +5 -0
  200. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +684 -664
  201. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +5 -0
  202. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/fault/v3/fault.upbdefs.c +13 -10
  203. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/router/v3/router.upbdefs.c +13 -10
  204. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +441 -375
  205. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.h +10 -0
  206. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +122 -114
  207. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/tls.upbdefs.c +1 -1
  208. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +112 -79
  209. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.h +5 -0
  210. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.c +64 -0
  211. data/src/core/ext/upbdefs-generated/envoy/type/http/v3/path_transformation.upbdefs.h +50 -0
  212. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +35 -32
  213. data/src/core/ext/upbdefs-generated/google/rpc/status.upbdefs.c +4 -4
  214. data/src/core/ext/upbdefs-generated/validate/validate.upbdefs.c +182 -160
  215. data/src/core/ext/xds/certificate_provider_factory.h +1 -1
  216. data/src/core/ext/xds/certificate_provider_store.h +3 -3
  217. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +3 -3
  218. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +2 -2
  219. data/src/core/ext/xds/xds_api.cc +665 -317
  220. data/src/core/ext/xds/xds_api.h +52 -14
  221. data/src/core/ext/xds/xds_bootstrap.cc +101 -160
  222. data/src/core/ext/xds/xds_bootstrap.h +19 -24
  223. data/src/core/ext/xds/xds_certificate_provider.cc +4 -4
  224. data/src/core/ext/xds/xds_certificate_provider.h +4 -4
  225. data/src/core/ext/xds/xds_channel_args.h +5 -2
  226. data/src/core/ext/xds/xds_client.cc +370 -215
  227. data/src/core/ext/xds/xds_client.h +38 -28
  228. data/src/core/ext/xds/xds_client_stats.h +3 -2
  229. data/src/core/ext/xds/xds_http_filters.cc +3 -2
  230. data/src/core/ext/xds/xds_http_filters.h +3 -0
  231. data/src/core/ext/xds/xds_server_config_fetcher.cc +34 -20
  232. data/src/core/lib/{iomgr → address_utils}/parse_address.cc +17 -17
  233. data/src/core/lib/{iomgr → address_utils}/parse_address.h +7 -7
  234. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.cc +16 -20
  235. data/src/core/lib/{iomgr → address_utils}/sockaddr_utils.h +16 -11
  236. data/src/core/lib/channel/call_tracer.h +85 -0
  237. data/src/core/lib/channel/channel_stack.cc +10 -9
  238. data/src/core/lib/channel/channel_stack.h +11 -10
  239. data/src/core/lib/channel/channel_stack_builder.cc +2 -2
  240. data/src/core/lib/channel/channel_stack_builder.h +1 -1
  241. data/src/core/lib/channel/channelz.cc +21 -13
  242. data/src/core/lib/channel/channelz.h +3 -0
  243. data/src/core/lib/channel/connected_channel.cc +4 -4
  244. data/src/core/lib/channel/context.h +3 -0
  245. data/src/core/lib/channel/handshaker.cc +7 -6
  246. data/src/core/lib/channel/handshaker.h +5 -5
  247. data/src/core/lib/channel/status_util.h +4 -0
  248. data/src/core/lib/compression/stream_compression.h +1 -1
  249. data/src/core/lib/compression/stream_compression_gzip.h +1 -1
  250. data/src/core/lib/compression/stream_compression_identity.h +1 -1
  251. data/src/core/lib/debug/stats.h +1 -1
  252. data/src/core/lib/event_engine/endpoint_config.cc +46 -0
  253. data/src/core/lib/event_engine/endpoint_config_internal.h +42 -0
  254. data/src/core/lib/event_engine/event_engine.cc +50 -0
  255. data/src/core/lib/event_engine/sockaddr.cc +40 -0
  256. data/src/core/lib/event_engine/sockaddr.h +44 -0
  257. data/src/core/lib/gpr/murmur_hash.cc +4 -2
  258. data/src/core/lib/gpr/wrap_memcpy.cc +2 -1
  259. data/src/core/lib/gprpp/manual_constructor.h +1 -1
  260. data/src/core/lib/gprpp/orphanable.h +3 -3
  261. data/src/core/lib/gprpp/ref_counted.h +28 -14
  262. data/src/core/lib/gprpp/status_helper.cc +407 -0
  263. data/src/core/lib/gprpp/status_helper.h +183 -0
  264. data/src/core/lib/gprpp/sync.h +2 -30
  265. data/src/core/lib/http/httpcli.cc +11 -11
  266. data/src/core/lib/http/httpcli_security_connector.cc +11 -7
  267. data/src/core/lib/http/parser.cc +16 -16
  268. data/src/core/lib/http/parser.h +4 -4
  269. data/src/core/lib/iomgr/buffer_list.cc +8 -10
  270. data/src/core/lib/iomgr/buffer_list.h +4 -5
  271. data/src/core/lib/iomgr/call_combiner.cc +15 -12
  272. data/src/core/lib/iomgr/call_combiner.h +12 -14
  273. data/src/core/lib/iomgr/cfstream_handle.cc +3 -3
  274. data/src/core/lib/iomgr/cfstream_handle.h +1 -1
  275. data/src/core/lib/iomgr/closure.h +7 -6
  276. data/src/core/lib/iomgr/combiner.cc +14 -12
  277. data/src/core/lib/iomgr/combiner.h +2 -2
  278. data/src/core/lib/iomgr/endpoint.cc +1 -1
  279. data/src/core/lib/iomgr/endpoint.h +2 -2
  280. data/src/core/lib/iomgr/endpoint_cfstream.cc +11 -13
  281. data/src/core/lib/iomgr/endpoint_pair_event_engine.cc +33 -0
  282. data/src/core/lib/iomgr/endpoint_pair_windows.cc +1 -1
  283. data/src/core/lib/iomgr/error.cc +168 -61
  284. data/src/core/lib/iomgr/error.h +217 -106
  285. data/src/core/lib/iomgr/error_cfstream.cc +3 -2
  286. data/src/core/lib/iomgr/error_cfstream.h +2 -2
  287. data/src/core/lib/iomgr/error_internal.h +5 -1
  288. data/src/core/lib/iomgr/ev_apple.cc +5 -5
  289. data/src/core/lib/iomgr/ev_apple.h +1 -1
  290. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -19
  291. data/src/core/lib/iomgr/ev_epollex_linux.cc +48 -45
  292. data/src/core/lib/iomgr/ev_poll_posix.cc +26 -23
  293. data/src/core/lib/iomgr/ev_posix.cc +9 -8
  294. data/src/core/lib/iomgr/ev_posix.h +9 -9
  295. data/src/core/lib/iomgr/event_engine/closure.cc +54 -0
  296. data/src/core/lib/iomgr/event_engine/closure.h +33 -0
  297. data/src/core/lib/iomgr/event_engine/endpoint.cc +192 -0
  298. data/src/core/lib/iomgr/event_engine/endpoint.h +53 -0
  299. data/src/core/lib/iomgr/event_engine/iomgr.cc +105 -0
  300. data/src/core/lib/iomgr/event_engine/iomgr.h +24 -0
  301. data/src/core/lib/iomgr/event_engine/pollset.cc +87 -0
  302. data/src/core/lib/iomgr/event_engine/pollset.h +25 -0
  303. data/src/core/lib/iomgr/event_engine/promise.h +51 -0
  304. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +41 -0
  305. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +35 -0
  306. data/src/core/lib/iomgr/event_engine/resolver.cc +110 -0
  307. data/src/core/lib/iomgr/event_engine/tcp.cc +263 -0
  308. data/src/core/lib/iomgr/event_engine/timer.cc +57 -0
  309. data/src/core/lib/iomgr/exec_ctx.cc +12 -4
  310. data/src/core/lib/iomgr/exec_ctx.h +4 -5
  311. data/src/core/lib/iomgr/executor/threadpool.cc +2 -3
  312. data/src/core/lib/iomgr/executor/threadpool.h +2 -2
  313. data/src/core/lib/iomgr/executor.cc +8 -8
  314. data/src/core/lib/iomgr/executor.h +2 -2
  315. data/src/core/lib/iomgr/iomgr.cc +2 -2
  316. data/src/core/lib/iomgr/iomgr.h +1 -1
  317. data/src/core/lib/iomgr/iomgr_custom.cc +1 -1
  318. data/src/core/lib/iomgr/iomgr_internal.cc +2 -2
  319. data/src/core/lib/iomgr/iomgr_internal.h +3 -3
  320. data/src/core/lib/iomgr/iomgr_posix.cc +3 -1
  321. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +42 -12
  322. data/src/core/lib/iomgr/iomgr_windows.cc +1 -1
  323. data/src/core/lib/iomgr/load_file.cc +4 -4
  324. data/src/core/lib/iomgr/load_file.h +2 -2
  325. data/src/core/lib/iomgr/lockfree_event.cc +5 -5
  326. data/src/core/lib/iomgr/lockfree_event.h +1 -1
  327. data/src/core/lib/iomgr/pollset.cc +5 -5
  328. data/src/core/lib/iomgr/pollset.h +9 -9
  329. data/src/core/lib/iomgr/pollset_custom.cc +7 -7
  330. data/src/core/lib/iomgr/pollset_custom.h +3 -1
  331. data/src/core/lib/iomgr/pollset_uv.cc +3 -1
  332. data/src/core/lib/iomgr/pollset_uv.h +5 -1
  333. data/src/core/lib/iomgr/pollset_windows.cc +5 -5
  334. data/src/core/lib/iomgr/port.h +7 -5
  335. data/src/core/lib/iomgr/python_util.h +2 -2
  336. data/src/core/lib/iomgr/resolve_address.cc +8 -4
  337. data/src/core/lib/iomgr/resolve_address.h +12 -6
  338. data/src/core/lib/iomgr/resolve_address_custom.cc +10 -9
  339. data/src/core/lib/iomgr/resolve_address_custom.h +3 -3
  340. data/src/core/lib/iomgr/resolve_address_posix.cc +3 -3
  341. data/src/core/lib/iomgr/resolve_address_windows.cc +4 -4
  342. data/src/core/lib/iomgr/resource_quota.cc +13 -10
  343. data/src/core/lib/iomgr/sockaddr.h +1 -0
  344. data/src/core/lib/iomgr/socket_mutator.cc +15 -2
  345. data/src/core/lib/iomgr/socket_mutator.h +26 -2
  346. data/src/core/lib/iomgr/socket_utils_common_posix.cc +24 -22
  347. data/src/core/lib/iomgr/socket_utils_posix.h +20 -20
  348. data/src/core/lib/iomgr/tcp_client_cfstream.cc +4 -4
  349. data/src/core/lib/iomgr/tcp_client_custom.cc +5 -6
  350. data/src/core/lib/iomgr/tcp_client_posix.cc +22 -19
  351. data/src/core/lib/iomgr/tcp_client_posix.h +3 -4
  352. data/src/core/lib/iomgr/tcp_client_windows.cc +7 -5
  353. data/src/core/lib/iomgr/tcp_custom.cc +14 -16
  354. data/src/core/lib/iomgr/tcp_custom.h +13 -12
  355. data/src/core/lib/iomgr/tcp_posix.cc +78 -73
  356. data/src/core/lib/iomgr/tcp_posix.h +8 -0
  357. data/src/core/lib/iomgr/tcp_server.cc +6 -6
  358. data/src/core/lib/iomgr/tcp_server.h +12 -11
  359. data/src/core/lib/iomgr/tcp_server_custom.cc +26 -25
  360. data/src/core/lib/iomgr/tcp_server_posix.cc +29 -21
  361. data/src/core/lib/iomgr/tcp_server_utils_posix.h +13 -12
  362. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +21 -18
  363. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +9 -9
  364. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +4 -4
  365. data/src/core/lib/iomgr/tcp_server_windows.cc +26 -25
  366. data/src/core/lib/iomgr/tcp_uv.cc +25 -23
  367. data/src/core/lib/iomgr/tcp_windows.cc +13 -13
  368. data/src/core/lib/iomgr/tcp_windows.h +2 -2
  369. data/src/core/lib/iomgr/timer.h +6 -1
  370. data/src/core/lib/iomgr/timer_custom.cc +2 -1
  371. data/src/core/lib/iomgr/timer_custom.h +1 -1
  372. data/src/core/lib/iomgr/timer_generic.cc +6 -6
  373. data/src/core/lib/iomgr/timer_manager.cc +1 -1
  374. data/src/core/lib/iomgr/udp_server.cc +21 -20
  375. data/src/core/lib/iomgr/unix_sockets_posix.cc +3 -3
  376. data/src/core/lib/iomgr/unix_sockets_posix.h +2 -2
  377. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +10 -7
  378. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +3 -3
  379. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +4 -4
  380. data/src/core/lib/iomgr/wakeup_fd_posix.cc +3 -3
  381. data/src/core/lib/iomgr/wakeup_fd_posix.h +8 -6
  382. data/src/core/lib/iomgr/work_serializer.h +17 -1
  383. data/src/core/lib/json/json.h +1 -1
  384. data/src/core/lib/json/json_reader.cc +5 -6
  385. data/src/core/lib/matchers/matchers.cc +46 -58
  386. data/src/core/lib/matchers/matchers.h +30 -29
  387. data/src/core/lib/security/authorization/authorization_engine.h +44 -0
  388. data/src/core/lib/security/authorization/authorization_policy_provider.h +32 -0
  389. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +46 -0
  390. data/src/core/lib/security/authorization/evaluate_args.cc +209 -0
  391. data/src/core/lib/security/authorization/evaluate_args.h +91 -0
  392. data/src/core/lib/security/credentials/composite/composite_credentials.cc +4 -4
  393. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -2
  394. data/src/core/lib/security/credentials/credentials.h +2 -2
  395. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +17 -13
  396. data/src/core/lib/security/credentials/external/aws_external_account_credentials.h +13 -11
  397. data/src/core/lib/security/credentials/external/aws_request_signer.cc +2 -1
  398. data/src/core/lib/security/credentials/external/aws_request_signer.h +1 -1
  399. data/src/core/lib/security/credentials/external/external_account_credentials.cc +15 -12
  400. data/src/core/lib/security/credentials/external/external_account_credentials.h +9 -8
  401. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -4
  402. data/src/core/lib/security/credentials/external/file_external_account_credentials.h +4 -3
  403. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +8 -8
  404. data/src/core/lib/security/credentials/external/url_external_account_credentials.h +9 -7
  405. data/src/core/lib/security/credentials/fake/fake_credentials.cc +2 -2
  406. data/src/core/lib/security/credentials/fake/fake_credentials.h +2 -2
  407. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +12 -10
  408. data/src/core/lib/security/credentials/iam/iam_credentials.cc +2 -2
  409. data/src/core/lib/security/credentials/iam/iam_credentials.h +2 -2
  410. data/src/core/lib/security/credentials/jwt/json_token.cc +2 -2
  411. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +3 -3
  412. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +2 -2
  413. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +7 -5
  414. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +21 -19
  415. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +5 -5
  416. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +5 -5
  417. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +2 -2
  418. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +8 -7
  419. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +9 -9
  420. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +68 -13
  421. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +7 -0
  422. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +4 -0
  423. data/src/core/lib/security/credentials/tls/tls_utils.cc +32 -0
  424. data/src/core/lib/security/credentials/tls/tls_utils.h +13 -0
  425. data/src/core/lib/security/credentials/xds/xds_credentials.cc +3 -3
  426. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +13 -3
  427. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +13 -3
  428. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  429. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +12 -2
  430. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +1 -1
  431. data/src/core/lib/security/security_connector/local/local_security_connector.cc +22 -9
  432. data/src/core/lib/security/security_connector/security_connector.h +9 -4
  433. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +16 -6
  434. data/src/core/lib/security/security_connector/ssl_utils.cc +27 -4
  435. data/src/core/lib/security/security_connector/ssl_utils.h +4 -4
  436. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +60 -76
  437. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +66 -48
  438. data/src/core/lib/security/transport/client_auth_filter.cc +18 -10
  439. data/src/core/lib/security/transport/secure_endpoint.cc +4 -4
  440. data/src/core/lib/security/transport/security_handshaker.cc +45 -36
  441. data/src/core/lib/security/transport/server_auth_filter.cc +17 -18
  442. data/src/core/lib/security/transport/tsi_error.cc +2 -1
  443. data/src/core/lib/security/transport/tsi_error.h +2 -1
  444. data/src/core/lib/security/util/json_util.cc +2 -2
  445. data/src/core/lib/security/util/json_util.h +1 -1
  446. data/src/core/lib/slice/slice_internal.h +1 -0
  447. data/src/core/lib/surface/call.cc +72 -52
  448. data/src/core/lib/surface/call.h +13 -2
  449. data/src/core/lib/surface/channel.cc +6 -6
  450. data/src/core/lib/surface/channel.h +3 -2
  451. data/src/core/lib/surface/channel_ping.cc +1 -1
  452. data/src/core/lib/surface/completion_queue.cc +68 -69
  453. data/src/core/lib/surface/completion_queue.h +3 -2
  454. data/src/core/lib/surface/completion_queue_factory.cc +1 -2
  455. data/src/core/lib/surface/init.cc +1 -3
  456. data/src/core/lib/surface/init.h +10 -1
  457. data/src/core/lib/surface/lame_client.cc +11 -11
  458. data/src/core/lib/surface/lame_client.h +1 -1
  459. data/src/core/lib/surface/server.cc +31 -23
  460. data/src/core/lib/surface/server.h +19 -18
  461. data/src/core/lib/surface/validate_metadata.cc +7 -7
  462. data/src/core/lib/surface/validate_metadata.h +3 -2
  463. data/src/core/lib/surface/version.cc +2 -2
  464. data/src/core/lib/transport/byte_stream.cc +5 -5
  465. data/src/core/lib/transport/byte_stream.h +8 -8
  466. data/src/core/lib/transport/connectivity_state.cc +1 -1
  467. data/src/core/lib/transport/error_utils.cc +21 -10
  468. data/src/core/lib/transport/error_utils.h +11 -5
  469. data/src/core/lib/transport/metadata_batch.cc +37 -37
  470. data/src/core/lib/transport/metadata_batch.h +19 -18
  471. data/src/core/lib/transport/transport.cc +4 -3
  472. data/src/core/lib/transport/transport.h +6 -4
  473. data/src/core/lib/transport/transport_op_string.cc +6 -6
  474. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -0
  475. data/src/core/tsi/alts/crypt/gsec.h +6 -0
  476. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +5 -4
  477. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +7 -6
  478. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +2 -1
  479. data/src/core/tsi/ssl_transport_security.cc +32 -14
  480. data/src/core/tsi/ssl_transport_security.h +3 -4
  481. data/src/ruby/bin/math_services_pb.rb +1 -1
  482. data/src/ruby/ext/grpc/extconf.rb +2 -0
  483. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +6 -0
  484. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +11 -2
  485. data/src/ruby/lib/grpc/version.rb +1 -1
  486. data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +1 -1
  487. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +6 -6
  488. data/third_party/abseil-cpp/absl/algorithm/container.h +3 -3
  489. data/third_party/abseil-cpp/absl/base/attributes.h +24 -4
  490. data/third_party/abseil-cpp/absl/base/call_once.h +2 -9
  491. data/third_party/abseil-cpp/absl/base/config.h +37 -9
  492. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +24 -10
  493. data/third_party/abseil-cpp/absl/base/internal/direct_mmap.h +4 -1
  494. data/third_party/abseil-cpp/absl/base/internal/endian.h +61 -0
  495. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +2 -3
  496. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +34 -32
  497. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +16 -6
  498. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +11 -2
  499. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +14 -5
  500. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +2 -2
  501. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +3 -3
  502. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +2 -2
  503. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +11 -11
  504. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +5 -5
  505. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +1 -1
  506. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +5 -2
  507. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +43 -42
  508. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +111 -7
  509. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +0 -76
  510. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +1 -3
  511. data/third_party/abseil-cpp/absl/base/log_severity.h +4 -4
  512. data/third_party/abseil-cpp/absl/base/macros.h +11 -0
  513. data/third_party/abseil-cpp/absl/base/optimization.h +10 -7
  514. data/third_party/abseil-cpp/absl/base/options.h +1 -1
  515. data/third_party/abseil-cpp/absl/base/port.h +0 -1
  516. data/third_party/abseil-cpp/absl/base/thread_annotations.h +1 -1
  517. data/third_party/abseil-cpp/absl/container/fixed_array.h +2 -2
  518. data/third_party/abseil-cpp/absl/container/inlined_vector.h +5 -3
  519. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +1 -1
  520. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +5 -1
  521. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +2 -1
  522. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler_force_weak_definition.cc +2 -1
  523. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +141 -66
  524. data/third_party/abseil-cpp/absl/container/internal/layout.h +4 -4
  525. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +14 -1
  526. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +136 -136
  527. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +16 -12
  528. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +5 -2
  529. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_config.h +3 -12
  530. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +6 -1
  531. data/third_party/abseil-cpp/absl/debugging/internal/symbolize.h +3 -5
  532. data/third_party/abseil-cpp/absl/debugging/symbolize_darwin.inc +2 -2
  533. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +2 -2
  534. data/third_party/abseil-cpp/absl/hash/internal/city.cc +15 -12
  535. data/third_party/abseil-cpp/absl/hash/internal/city.h +1 -19
  536. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +25 -10
  537. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -37
  538. data/third_party/abseil-cpp/absl/hash/internal/wyhash.cc +111 -0
  539. data/third_party/abseil-cpp/absl/hash/internal/wyhash.h +48 -0
  540. data/third_party/abseil-cpp/absl/meta/type_traits.h +16 -2
  541. data/third_party/abseil-cpp/absl/numeric/bits.h +177 -0
  542. data/third_party/abseil-cpp/absl/numeric/int128.cc +3 -3
  543. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +358 -0
  544. data/third_party/abseil-cpp/absl/numeric/internal/representation.h +55 -0
  545. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +18 -0
  546. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -7
  547. data/third_party/abseil-cpp/absl/status/status.cc +29 -22
  548. data/third_party/abseil-cpp/absl/status/status.h +81 -20
  549. data/third_party/abseil-cpp/absl/status/statusor.h +3 -3
  550. data/third_party/abseil-cpp/absl/strings/charconv.cc +5 -5
  551. data/third_party/abseil-cpp/absl/strings/cord.cc +326 -371
  552. data/third_party/abseil-cpp/absl/strings/cord.h +182 -64
  553. data/third_party/abseil-cpp/absl/strings/escaping.cc +4 -4
  554. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +6 -6
  555. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.cc +83 -0
  556. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +387 -17
  557. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_flat.h +146 -0
  558. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.cc +897 -0
  559. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring.h +589 -0
  560. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_ring_reader.h +114 -0
  561. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +14 -0
  562. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +14 -0
  563. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +15 -1
  564. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +19 -4
  565. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +14 -0
  566. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +36 -18
  567. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +14 -0
  568. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +14 -0
  569. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +14 -0
  570. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +15 -40
  571. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +64 -0
  572. data/third_party/abseil-cpp/absl/strings/match.cc +6 -3
  573. data/third_party/abseil-cpp/absl/strings/match.h +16 -6
  574. data/third_party/abseil-cpp/absl/strings/numbers.cc +132 -4
  575. data/third_party/abseil-cpp/absl/strings/numbers.h +10 -10
  576. data/third_party/abseil-cpp/absl/strings/str_join.h +1 -1
  577. data/third_party/abseil-cpp/absl/strings/str_split.h +38 -4
  578. data/third_party/abseil-cpp/absl/synchronization/internal/futex.h +154 -0
  579. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.h +2 -1
  580. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.cc +2 -2
  581. data/third_party/abseil-cpp/absl/synchronization/internal/per_thread_sem.h +4 -4
  582. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.cc +1 -65
  583. data/third_party/abseil-cpp/absl/synchronization/internal/waiter.h +2 -6
  584. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +71 -59
  585. data/third_party/abseil-cpp/absl/synchronization/mutex.h +79 -62
  586. data/third_party/abseil-cpp/absl/time/clock.cc +146 -130
  587. data/third_party/abseil-cpp/absl/time/clock.h +2 -2
  588. data/third_party/abseil-cpp/absl/time/duration.cc +3 -2
  589. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +7 -11
  590. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +7 -1
  591. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +4 -4
  592. data/third_party/abseil-cpp/absl/time/time.cc +4 -3
  593. data/third_party/abseil-cpp/absl/time/time.h +26 -24
  594. data/third_party/abseil-cpp/absl/types/internal/variant.h +1 -1
  595. data/third_party/abseil-cpp/absl/types/variant.h +9 -4
  596. data/third_party/boringssl-with-bazel/err_data.c +483 -461
  597. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_bool.c +1 -1
  598. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_object.c +9 -7
  599. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_type.c +18 -8
  600. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_lib.c +1 -2
  601. data/third_party/boringssl-with-bazel/src/crypto/asn1/asn1_locl.h +5 -0
  602. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -1
  603. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_fre.c +1 -1
  604. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/cipher_extra.c +4 -0
  605. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +1 -88
  606. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +14 -3
  607. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +119 -273
  608. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +1 -1
  609. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +1 -1
  610. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +87 -80
  611. data/third_party/boringssl-with-bazel/src/crypto/evp/evp.c +9 -0
  612. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  613. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +1 -1
  614. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c +0 -4
  615. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +11 -3
  616. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +25 -2
  617. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digest.c +7 -0
  618. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +10 -2
  619. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/md32_common.h +87 -160
  620. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +4 -0
  621. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +0 -1
  622. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +0 -4
  623. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +104 -93
  624. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/internal.h +39 -0
  625. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md4/md4.c +52 -65
  626. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/md5/md5.c +52 -66
  627. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +33 -22
  628. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cfb.c +9 -8
  629. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +9 -8
  630. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +17 -13
  631. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +1 -22
  632. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +2 -1
  633. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +1 -4
  634. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +0 -13
  635. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +26 -7
  636. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +26 -24
  637. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +10 -7
  638. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/fips.c +79 -0
  639. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +14 -9
  640. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha1.c +61 -75
  641. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha256.c +80 -103
  642. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +40 -49
  643. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +367 -315
  644. data/third_party/boringssl-with-bazel/src/crypto/internal.h +65 -0
  645. data/third_party/boringssl-with-bazel/src/crypto/mem.c +14 -0
  646. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +3 -3
  647. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +5 -3
  648. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +95 -48
  649. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/passive.c +2 -2
  650. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/rand_extra.c +1 -1
  651. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_asn1.c +1 -2
  652. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +0 -28
  653. data/third_party/boringssl-with-bazel/src/crypto/x509/internal.h +120 -11
  654. data/third_party/boringssl-with-bazel/src/crypto/x509/t_req.c +2 -0
  655. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509a.c +3 -0
  656. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +19 -25
  657. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +3 -2
  658. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +42 -89
  659. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +9 -16
  660. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +2 -0
  661. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +14 -15
  662. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +53 -73
  663. data/third_party/boringssl-with-bazel/src/crypto/x509/x509cset.c +31 -0
  664. data/third_party/boringssl-with-bazel/src/crypto/x509/x509rset.c +3 -0
  665. data/third_party/boringssl-with-bazel/src/crypto/x509/x_algor.c +21 -17
  666. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +3 -0
  667. data/third_party/boringssl-with-bazel/src/crypto/x509/x_attrib.c +7 -25
  668. data/third_party/boringssl-with-bazel/src/crypto/x509/x_crl.c +5 -0
  669. data/third_party/boringssl-with-bazel/src/crypto/x509/x_pubkey.c +25 -22
  670. data/third_party/boringssl-with-bazel/src/crypto/x509/x_req.c +5 -8
  671. data/third_party/boringssl-with-bazel/src/crypto/x509/x_sig.c +5 -0
  672. data/third_party/boringssl-with-bazel/src/crypto/x509/x_val.c +2 -0
  673. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +3 -0
  674. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +7 -0
  675. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +2 -4
  676. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +1 -1
  677. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +1 -0
  678. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +5 -8
  679. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +1 -4
  680. data/third_party/boringssl-with-bazel/src/include/openssl/arm_arch.h +66 -1
  681. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +120 -41
  682. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +47 -7
  683. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +1 -0
  684. data/third_party/boringssl-with-bazel/src/include/openssl/chacha.h +1 -1
  685. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +0 -8
  686. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +24 -4
  687. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +6 -2
  688. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +5 -2
  689. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +33 -0
  690. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +3 -2
  691. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +20 -49
  692. data/third_party/boringssl-with-bazel/src/{crypto/x509/x509_r2x.c → include/openssl/evp_errors.h} +41 -58
  693. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +325 -0
  694. data/third_party/boringssl-with-bazel/src/include/openssl/obj.h +24 -5
  695. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +25 -7
  696. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +9 -1
  697. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +2 -2
  698. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +99 -63
  699. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +283 -85
  700. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +13 -19
  701. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +445 -152
  702. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +451 -435
  703. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +2 -1
  704. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +7 -2
  705. data/third_party/boringssl-with-bazel/src/ssl/d1_srtp.cc +1 -1
  706. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +1133 -0
  707. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +298 -22
  708. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +66 -30
  709. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +189 -86
  710. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +154 -24
  711. data/third_party/boringssl-with-bazel/src/ssl/internal.h +414 -135
  712. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +9 -3
  713. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +2 -2
  714. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +14 -19
  715. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +4 -6
  716. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +23 -26
  717. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +51 -60
  718. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +2 -0
  719. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +8 -31
  720. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +3 -0
  721. data/third_party/boringssl-with-bazel/src/ssl/ssl_transcript.cc +4 -3
  722. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +7 -3
  723. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +664 -702
  724. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +65 -7
  725. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +98 -39
  726. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +141 -94
  727. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +213 -118
  728. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +4 -2
  729. data/third_party/xxhash/xxhash.h +77 -195
  730. metadata +116 -51
  731. data/src/core/lib/gpr/arena.h +0 -47
  732. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +0 -88
  733. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +0 -88
  734. data/third_party/abseil-cpp/absl/base/internal/bits.h +0 -219
  735. data/third_party/abseil-cpp/absl/synchronization/internal/mutex_nonprod.inc +0 -249
  736. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/is_fips.c +0 -29
  737. data/third_party/boringssl-with-bazel/src/crypto/hpke/internal.h +0 -246
  738. data/third_party/boringssl-with-bazel/src/crypto/x509/vpm_int.h +0 -71
@@ -49,7 +49,7 @@ class CertificateProviderFactory {
49
49
  virtual const char* name() const = 0;
50
50
 
51
51
  virtual RefCountedPtr<Config> CreateCertificateProviderConfig(
52
- const Json& config_json, grpc_error** error) = 0;
52
+ const Json& config_json, grpc_error_handle* error) = 0;
53
53
 
54
54
  // Create a CertificateProvider instance from config.
55
55
  virtual RefCountedPtr<grpc_tls_certificate_provider>
@@ -92,7 +92,7 @@ class CertificateProviderStore
92
92
  };
93
93
 
94
94
  RefCountedPtr<CertificateProviderWrapper> CreateCertificateProviderLocked(
95
- absl::string_view key);
95
+ absl::string_view key) ABSL_EXCLUSIVE_LOCKS_REQUIRED(mu_);
96
96
 
97
97
  // Releases a previously created certificate provider from the certificate
98
98
  // provider map if the value matches \a wrapper.
@@ -101,10 +101,10 @@ class CertificateProviderStore
101
101
 
102
102
  Mutex mu_;
103
103
  // Map of plugin configurations
104
- PluginDefinitionMap plugin_config_map_;
104
+ const PluginDefinitionMap plugin_config_map_;
105
105
  // Underlying map for the providers.
106
106
  std::map<absl::string_view, CertificateProviderWrapper*>
107
- certificate_providers_map_;
107
+ certificate_providers_map_ ABSL_GUARDED_BY(mu_);
108
108
  };
109
109
 
110
110
  } // namespace grpc_core
@@ -64,14 +64,14 @@ std::string FileWatcherCertificateProviderFactory::Config::ToString() const {
64
64
 
65
65
  RefCountedPtr<FileWatcherCertificateProviderFactory::Config>
66
66
  FileWatcherCertificateProviderFactory::Config::Parse(const Json& config_json,
67
- grpc_error** error) {
67
+ grpc_error_handle* error) {
68
68
  auto config = MakeRefCounted<FileWatcherCertificateProviderFactory::Config>();
69
69
  if (config_json.type() != Json::Type::OBJECT) {
70
70
  *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
71
71
  "error:config type should be OBJECT.");
72
72
  return nullptr;
73
73
  }
74
- std::vector<grpc_error*> error_list;
74
+ std::vector<grpc_error_handle> error_list;
75
75
  ParseJsonObjectField(config_json.object_value(), "certificate_file",
76
76
  &config->identity_cert_file_, &error_list, false);
77
77
  ParseJsonObjectField(config_json.object_value(), "private_key_file",
@@ -112,7 +112,7 @@ const char* FileWatcherCertificateProviderFactory::name() const {
112
112
 
113
113
  RefCountedPtr<CertificateProviderFactory::Config>
114
114
  FileWatcherCertificateProviderFactory::CreateCertificateProviderConfig(
115
- const Json& config_json, grpc_error** error) {
115
+ const Json& config_json, grpc_error_handle* error) {
116
116
  return FileWatcherCertificateProviderFactory::Config::Parse(config_json,
117
117
  error);
118
118
  }
@@ -31,7 +31,7 @@ class FileWatcherCertificateProviderFactory
31
31
  class Config : public CertificateProviderFactory::Config {
32
32
  public:
33
33
  static RefCountedPtr<Config> Parse(const Json& config_json,
34
- grpc_error** error);
34
+ grpc_error_handle* error);
35
35
 
36
36
  const char* name() const override;
37
37
 
@@ -58,7 +58,7 @@ class FileWatcherCertificateProviderFactory
58
58
 
59
59
  RefCountedPtr<CertificateProviderFactory::Config>
60
60
  CreateCertificateProviderConfig(const Json& config_json,
61
- grpc_error** error) override;
61
+ grpc_error_handle* error) override;
62
62
 
63
63
  RefCountedPtr<grpc_tls_certificate_provider> CreateCertificateProvider(
64
64
  RefCountedPtr<CertificateProviderFactory::Config> config) override;
@@ -90,13 +90,13 @@
90
90
  #include <grpc/support/string_util.h>
91
91
 
92
92
  #include "src/core/ext/xds/xds_api.h"
93
+ #include "src/core/lib/address_utils/sockaddr_utils.h"
93
94
  #include "src/core/lib/gpr/env.h"
94
95
  #include "src/core/lib/gpr/string.h"
95
96
  #include "src/core/lib/gpr/useful.h"
96
97
  #include "src/core/lib/gprpp/host_port.h"
97
98
  #include "src/core/lib/iomgr/error.h"
98
99
  #include "src/core/lib/iomgr/sockaddr.h"
99
- #include "src/core/lib/iomgr/sockaddr_utils.h"
100
100
  #include "src/core/lib/iomgr/socket_utils.h"
101
101
  #include "src/core/lib/slice/slice_utils.h"
102
102
 
@@ -214,6 +214,25 @@ std::string XdsApi::Route::HashPolicy::ToString() const {
214
214
  return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
215
215
  }
216
216
 
217
+ //
218
+ // XdsApi::Route::RetryPolicy
219
+ //
220
+ std::string XdsApi::Route::RetryPolicy::RetryBackOff::ToString() const {
221
+ std::vector<std::string> contents;
222
+ contents.push_back(
223
+ absl::StrCat("RetryBackOff Base: ", base_interval.ToString()));
224
+ contents.push_back(
225
+ absl::StrCat("RetryBackOff max: ", max_interval.ToString()));
226
+ return absl::StrJoin(contents, ",");
227
+ }
228
+
229
+ std::string XdsApi::Route::RetryPolicy::ToString() const {
230
+ std::vector<std::string> contents;
231
+ contents.push_back(absl::StrFormat("num_retries=%d", num_retries));
232
+ contents.push_back(retry_back_off.ToString());
233
+ return absl::StrJoin(contents, ",");
234
+ }
235
+
217
236
  //
218
237
  // XdsApi::Route
219
238
  //
@@ -255,6 +274,10 @@ std::string XdsApi::Route::ToString() const {
255
274
  for (const HashPolicy& hash_policy : hash_policies) {
256
275
  contents.push_back(absl::StrCat("hash_policy=", hash_policy.ToString()));
257
276
  }
277
+ if (retry_policy.has_value()) {
278
+ contents.push_back(
279
+ absl::StrCat("retry_policy={", retry_policy->ToString(), "}"));
280
+ }
258
281
  if (!cluster_name.empty()) {
259
282
  contents.push_back(absl::StrFormat("Cluster name: %s", cluster_name));
260
283
  }
@@ -697,10 +720,24 @@ std::string XdsApi::LdsUpdate::ToString() const {
697
720
  //
698
721
 
699
722
  std::string XdsApi::CdsUpdate::ToString() const {
700
- absl::InlinedVector<std::string, 4> contents;
701
- if (!eds_service_name.empty()) {
702
- contents.push_back(
703
- absl::StrFormat("eds_service_name=%s", eds_service_name));
723
+ absl::InlinedVector<std::string, 8> contents;
724
+ switch (cluster_type) {
725
+ case EDS:
726
+ contents.push_back("cluster_type=EDS");
727
+ if (!eds_service_name.empty()) {
728
+ contents.push_back(
729
+ absl::StrFormat("eds_service_name=%s", eds_service_name));
730
+ }
731
+ break;
732
+ case LOGICAL_DNS:
733
+ contents.push_back("cluster_type=LOGICAL_DNS");
734
+ contents.push_back(absl::StrFormat("dns_hostname=%s", dns_hostname));
735
+ break;
736
+ case AGGREGATE:
737
+ contents.push_back("cluster_type=AGGREGATE");
738
+ contents.push_back(
739
+ absl::StrFormat("prioritized_cluster_names=[%s]",
740
+ absl::StrJoin(prioritized_cluster_names, ", ")));
704
741
  }
705
742
  if (!common_tls_context.Empty()) {
706
743
  contents.push_back(absl::StrFormat("common_tls_context=%s",
@@ -710,6 +747,11 @@ std::string XdsApi::CdsUpdate::ToString() const {
710
747
  contents.push_back(absl::StrFormat("lrs_load_reporting_server_name=%s",
711
748
  lrs_load_reporting_server_name.value()));
712
749
  }
750
+ contents.push_back(absl::StrCat("lb_policy=", lb_policy));
751
+ if (lb_policy == "RING_HASH") {
752
+ contents.push_back(absl::StrCat("min_ring_size=", min_ring_size));
753
+ contents.push_back(absl::StrCat("max_ring_size=", max_ring_size));
754
+ }
713
755
  contents.push_back(
714
756
  absl::StrFormat("max_concurrent_requests=%d", max_concurrent_requests));
715
757
  return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
@@ -830,14 +872,42 @@ bool IsEds(absl::string_view type_url) {
830
872
 
831
873
  } // namespace
832
874
 
875
+ // If gRPC is built with -DGRPC_XDS_USER_AGENT_NAME_SUFFIX="...", that string
876
+ // will be appended to the user agent name reported to the xDS server.
877
+ #ifdef GRPC_XDS_USER_AGENT_NAME_SUFFIX
878
+ #define GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING \
879
+ " " GRPC_XDS_USER_AGENT_NAME_SUFFIX
880
+ #else
881
+ #define GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING ""
882
+ #endif
883
+
884
+ // If gRPC is built with -DGRPC_XDS_USER_AGENT_VERSION_SUFFIX="...", that string
885
+ // will be appended to the user agent version reported to the xDS server.
886
+ #ifdef GRPC_XDS_USER_AGENT_VERSION_SUFFIX
887
+ #define GRPC_XDS_USER_AGENT_VERSION_SUFFIX_STRING \
888
+ " " GRPC_XDS_USER_AGENT_VERSION_SUFFIX
889
+ #else
890
+ #define GRPC_XDS_USER_AGENT_VERSION_SUFFIX_STRING ""
891
+ #endif
892
+
833
893
  XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer,
834
- const XdsBootstrap::Node* node)
894
+ const XdsBootstrap::Node* node,
895
+ const CertificateProviderStore::PluginDefinitionMap*
896
+ certificate_provider_definition_map)
835
897
  : client_(client),
836
898
  tracer_(tracer),
837
899
  node_(node),
900
+ certificate_provider_definition_map_(certificate_provider_definition_map),
838
901
  build_version_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING, " ",
839
- grpc_version_string())),
840
- user_agent_name_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING)) {
902
+ grpc_version_string(),
903
+ GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING,
904
+ GRPC_XDS_USER_AGENT_VERSION_SUFFIX_STRING)),
905
+ user_agent_name_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING,
906
+ GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING)),
907
+ user_agent_version_(
908
+ absl::StrCat("C-core ", grpc_version_string(),
909
+ GRPC_XDS_USER_AGENT_NAME_SUFFIX_STRING,
910
+ GRPC_XDS_USER_AGENT_VERSION_SUFFIX_STRING)) {
841
911
  // Populate upb symtab with xDS proto messages that we want to print
842
912
  // properly in logs.
843
913
  // Note: This won't actually work properly until upb adds support for
@@ -859,11 +929,13 @@ XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer,
859
929
  namespace {
860
930
 
861
931
  struct EncodingContext {
862
- XdsClient* client;
932
+ XdsClient* client; // Used only for logging. Unsafe for dereferencing.
863
933
  TraceFlag* tracer;
864
934
  upb_symtab* symtab;
865
935
  upb_arena* arena;
866
936
  bool use_v3;
937
+ const CertificateProviderStore::PluginDefinitionMap*
938
+ certificate_provider_definition_map;
867
939
  };
868
940
 
869
941
  // Works for both std::string and absl::string_view.
@@ -968,6 +1040,7 @@ void PopulateNode(const EncodingContext& context,
968
1040
  const XdsBootstrap::Node* node,
969
1041
  const std::string& build_version,
970
1042
  const std::string& user_agent_name,
1043
+ const std::string& user_agent_version,
971
1044
  envoy_config_core_v3_Node* node_msg) {
972
1045
  if (node != nullptr) {
973
1046
  if (!node->id.empty()) {
@@ -1007,7 +1080,7 @@ void PopulateNode(const EncodingContext& context,
1007
1080
  envoy_config_core_v3_Node_set_user_agent_name(
1008
1081
  node_msg, StdStringToUpbString(user_agent_name));
1009
1082
  envoy_config_core_v3_Node_set_user_agent_version(
1010
- node_msg, upb_strview_makez(grpc_version_string()));
1083
+ node_msg, StdStringToUpbString(user_agent_version));
1011
1084
  envoy_config_core_v3_Node_add_client_features(
1012
1085
  node_msg, upb_strview_makez("envoy.lb.does_not_support_overprovisioning"),
1013
1086
  context.arena);
@@ -1068,11 +1141,15 @@ absl::string_view TypeUrlExternalToInternal(bool use_v3,
1068
1141
  grpc_slice XdsApi::CreateAdsRequest(
1069
1142
  const XdsBootstrap::XdsServer& server, const std::string& type_url,
1070
1143
  const std::set<absl::string_view>& resource_names,
1071
- const std::string& version, const std::string& nonce, grpc_error* error,
1072
- bool populate_node) {
1144
+ const std::string& version, const std::string& nonce,
1145
+ grpc_error_handle error, bool populate_node) {
1073
1146
  upb::Arena arena;
1074
- const EncodingContext context = {client_, tracer_, symtab_.ptr(), arena.ptr(),
1075
- server.ShouldUseV3()};
1147
+ const EncodingContext context = {client_,
1148
+ tracer_,
1149
+ symtab_.ptr(),
1150
+ arena.ptr(),
1151
+ server.ShouldUseV3(),
1152
+ certificate_provider_definition_map_};
1076
1153
  // Create a request.
1077
1154
  envoy_service_discovery_v3_DiscoveryRequest* request =
1078
1155
  envoy_service_discovery_v3_DiscoveryRequest_new(arena.ptr());
@@ -1092,6 +1169,7 @@ grpc_slice XdsApi::CreateAdsRequest(
1092
1169
  request, StdStringToUpbString(nonce));
1093
1170
  }
1094
1171
  // Set error_detail if it's a NACK.
1172
+ std::string error_string_storage;
1095
1173
  if (error != GRPC_ERROR_NONE) {
1096
1174
  google_rpc_Status* error_detail =
1097
1175
  envoy_service_discovery_v3_DiscoveryRequest_mutable_error_detail(
@@ -1102,8 +1180,8 @@ grpc_slice XdsApi::CreateAdsRequest(
1102
1180
  // generate them in the parsing code, and then use that here.
1103
1181
  google_rpc_Status_set_code(error_detail, GRPC_STATUS_INVALID_ARGUMENT);
1104
1182
  // Error description comes from the error that was passed in.
1105
- upb_strview error_description =
1106
- StdStringToUpbString(absl::string_view(grpc_error_string(error)));
1183
+ error_string_storage = grpc_error_std_string(error);
1184
+ upb_strview error_description = StdStringToUpbString(error_string_storage);
1107
1185
  google_rpc_Status_set_message(error_detail, error_description);
1108
1186
  GRPC_ERROR_UNREF(error);
1109
1187
  }
@@ -1112,7 +1190,8 @@ grpc_slice XdsApi::CreateAdsRequest(
1112
1190
  envoy_config_core_v3_Node* node_msg =
1113
1191
  envoy_service_discovery_v3_DiscoveryRequest_mutable_node(request,
1114
1192
  arena.ptr());
1115
- PopulateNode(context, node_, build_version_, user_agent_name_, node_msg);
1193
+ PopulateNode(context, node_, build_version_, user_agent_name_,
1194
+ user_agent_version_, node_msg);
1116
1195
  }
1117
1196
  // Add resource_names.
1118
1197
  for (const auto& resource_name : resource_names) {
@@ -1197,8 +1276,9 @@ void MaybeLogClusterLoadAssignment(
1197
1276
  }
1198
1277
  }
1199
1278
 
1200
- grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
1201
- XdsApi::Route* route, bool* ignore_route) {
1279
+ grpc_error_handle RoutePathMatchParse(
1280
+ const envoy_config_route_v3_RouteMatch* match, XdsApi::Route* route,
1281
+ bool* ignore_route) {
1202
1282
  auto* case_sensitive_ptr =
1203
1283
  envoy_config_route_v3_RouteMatch_case_sensitive(match);
1204
1284
  bool case_sensitive = true;
@@ -1231,7 +1311,7 @@ grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
1231
1311
  return GRPC_ERROR_NONE;
1232
1312
  }
1233
1313
  }
1234
- type = StringMatcher::Type::PREFIX;
1314
+ type = StringMatcher::Type::kPrefix;
1235
1315
  match_string = std::string(prefix);
1236
1316
  } else if (envoy_config_route_v3_RouteMatch_has_path(match)) {
1237
1317
  absl::string_view path =
@@ -1265,13 +1345,13 @@ grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
1265
1345
  *ignore_route = true;
1266
1346
  return GRPC_ERROR_NONE;
1267
1347
  }
1268
- type = StringMatcher::Type::EXACT;
1348
+ type = StringMatcher::Type::kExact;
1269
1349
  match_string = std::string(path);
1270
1350
  } else if (envoy_config_route_v3_RouteMatch_has_safe_regex(match)) {
1271
1351
  const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
1272
1352
  envoy_config_route_v3_RouteMatch_safe_regex(match);
1273
1353
  GPR_ASSERT(regex_matcher != nullptr);
1274
- type = StringMatcher::Type::SAFE_REGEX;
1354
+ type = StringMatcher::Type::kSafeRegex;
1275
1355
  match_string = UpbStringToStdString(
1276
1356
  envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
1277
1357
  } else {
@@ -1290,7 +1370,7 @@ grpc_error* RoutePathMatchParse(const envoy_config_route_v3_RouteMatch* match,
1290
1370
  return GRPC_ERROR_NONE;
1291
1371
  }
1292
1372
 
1293
- grpc_error* RouteHeaderMatchersParse(
1373
+ grpc_error_handle RouteHeaderMatchersParse(
1294
1374
  const envoy_config_route_v3_RouteMatch* match, XdsApi::Route* route) {
1295
1375
  size_t size;
1296
1376
  const envoy_config_route_v3_HeaderMatcher* const* headers =
@@ -1305,7 +1385,7 @@ grpc_error* RouteHeaderMatchersParse(
1305
1385
  int64_t range_end = 0;
1306
1386
  bool present_match = false;
1307
1387
  if (envoy_config_route_v3_HeaderMatcher_has_exact_match(header)) {
1308
- type = HeaderMatcher::Type::EXACT;
1388
+ type = HeaderMatcher::Type::kExact;
1309
1389
  match_string = UpbStringToStdString(
1310
1390
  envoy_config_route_v3_HeaderMatcher_exact_match(header));
1311
1391
  } else if (envoy_config_route_v3_HeaderMatcher_has_safe_regex_match(
@@ -1313,28 +1393,28 @@ grpc_error* RouteHeaderMatchersParse(
1313
1393
  const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
1314
1394
  envoy_config_route_v3_HeaderMatcher_safe_regex_match(header);
1315
1395
  GPR_ASSERT(regex_matcher != nullptr);
1316
- type = HeaderMatcher::Type::SAFE_REGEX;
1396
+ type = HeaderMatcher::Type::kSafeRegex;
1317
1397
  match_string = UpbStringToStdString(
1318
1398
  envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher));
1319
1399
  } else if (envoy_config_route_v3_HeaderMatcher_has_range_match(header)) {
1320
- type = HeaderMatcher::Type::RANGE;
1400
+ type = HeaderMatcher::Type::kRange;
1321
1401
  const envoy_type_v3_Int64Range* range_matcher =
1322
1402
  envoy_config_route_v3_HeaderMatcher_range_match(header);
1323
1403
  range_start = envoy_type_v3_Int64Range_start(range_matcher);
1324
1404
  range_end = envoy_type_v3_Int64Range_end(range_matcher);
1325
1405
  } else if (envoy_config_route_v3_HeaderMatcher_has_present_match(header)) {
1326
- type = HeaderMatcher::Type::PRESENT;
1406
+ type = HeaderMatcher::Type::kPresent;
1327
1407
  present_match = envoy_config_route_v3_HeaderMatcher_present_match(header);
1328
1408
  } else if (envoy_config_route_v3_HeaderMatcher_has_prefix_match(header)) {
1329
- type = HeaderMatcher::Type::PREFIX;
1409
+ type = HeaderMatcher::Type::kPrefix;
1330
1410
  match_string = UpbStringToStdString(
1331
1411
  envoy_config_route_v3_HeaderMatcher_prefix_match(header));
1332
1412
  } else if (envoy_config_route_v3_HeaderMatcher_has_suffix_match(header)) {
1333
- type = HeaderMatcher::Type::SUFFIX;
1413
+ type = HeaderMatcher::Type::kSuffix;
1334
1414
  match_string = UpbStringToStdString(
1335
1415
  envoy_config_route_v3_HeaderMatcher_suffix_match(header));
1336
1416
  } else if (envoy_config_route_v3_HeaderMatcher_has_contains_match(header)) {
1337
- type = HeaderMatcher::Type::CONTAINS;
1417
+ type = HeaderMatcher::Type::kContains;
1338
1418
  match_string = UpbStringToStdString(
1339
1419
  envoy_config_route_v3_HeaderMatcher_contains_match(header));
1340
1420
  } else {
@@ -1357,7 +1437,7 @@ grpc_error* RouteHeaderMatchersParse(
1357
1437
  return GRPC_ERROR_NONE;
1358
1438
  }
1359
1439
 
1360
- grpc_error* RouteRuntimeFractionParse(
1440
+ grpc_error_handle RouteRuntimeFractionParse(
1361
1441
  const envoy_config_route_v3_RouteMatch* match, XdsApi::Route* route) {
1362
1442
  const envoy_config_core_v3_RuntimeFractionalPercent* runtime_fraction =
1363
1443
  envoy_config_route_v3_RouteMatch_runtime_fraction(match);
@@ -1390,9 +1470,9 @@ grpc_error* RouteRuntimeFractionParse(
1390
1470
  return GRPC_ERROR_NONE;
1391
1471
  }
1392
1472
 
1393
- grpc_error* ExtractHttpFilterTypeName(const EncodingContext& context,
1394
- const google_protobuf_Any* any,
1395
- absl::string_view* filter_type) {
1473
+ grpc_error_handle ExtractHttpFilterTypeName(const EncodingContext& context,
1474
+ const google_protobuf_Any* any,
1475
+ absl::string_view* filter_type) {
1396
1476
  *filter_type = UpbStringToAbsl(google_protobuf_Any_type_url(any));
1397
1477
  if (*filter_type == "type.googleapis.com/udpa.type.v1.TypedStruct") {
1398
1478
  upb_strview any_value = google_protobuf_Any_value(any);
@@ -1410,7 +1490,7 @@ grpc_error* ExtractHttpFilterTypeName(const EncodingContext& context,
1410
1490
  }
1411
1491
 
1412
1492
  template <typename ParentType, typename EntryType>
1413
- grpc_error* ParseTypedPerFilterConfig(
1493
+ grpc_error_handle ParseTypedPerFilterConfig(
1414
1494
  const EncodingContext& context, const ParentType* parent,
1415
1495
  const EntryType* (*entry_func)(const ParentType*, size_t*),
1416
1496
  upb_strview (*key_func)(const EntryType*),
@@ -1454,7 +1534,8 @@ grpc_error* ParseTypedPerFilterConfig(
1454
1534
  .c_str());
1455
1535
  }
1456
1536
  }
1457
- grpc_error* error = ExtractHttpFilterTypeName(context, any, &filter_type);
1537
+ grpc_error_handle error =
1538
+ ExtractHttpFilterTypeName(context, any, &filter_type);
1458
1539
  if (error != GRPC_ERROR_NONE) return error;
1459
1540
  const XdsHttpFilterImpl* filter_impl =
1460
1541
  XdsHttpFilterRegistry::GetFilterForType(filter_type);
@@ -1478,9 +1559,103 @@ grpc_error* ParseTypedPerFilterConfig(
1478
1559
  return GRPC_ERROR_NONE;
1479
1560
  }
1480
1561
 
1481
- grpc_error* RouteActionParse(const EncodingContext& context,
1482
- const envoy_config_route_v3_Route* route_msg,
1483
- XdsApi::Route* route, bool* ignore_route) {
1562
+ XdsApi::Duration DurationParse(const google_protobuf_Duration* proto_duration) {
1563
+ XdsApi::Duration duration;
1564
+ duration.seconds = google_protobuf_Duration_seconds(proto_duration);
1565
+ duration.nanos = google_protobuf_Duration_nanos(proto_duration);
1566
+ return duration;
1567
+ }
1568
+
1569
+ grpc_error_handle RetryPolicyParse(
1570
+ const EncodingContext& context,
1571
+ const envoy_config_route_v3_RetryPolicy* retry_policy,
1572
+ absl::optional<XdsApi::Route::RetryPolicy>* retry) {
1573
+ std::vector<grpc_error_handle> errors;
1574
+ XdsApi::Route::RetryPolicy retry_to_return;
1575
+ auto retry_on = UpbStringToStdString(
1576
+ envoy_config_route_v3_RetryPolicy_retry_on(retry_policy));
1577
+ std::vector<absl::string_view> codes = absl::StrSplit(retry_on, ',');
1578
+ for (const auto& code : codes) {
1579
+ if (code == "cancelled") {
1580
+ retry_to_return.retry_on.Add(GRPC_STATUS_CANCELLED);
1581
+ } else if (code == "deadline-exceeded") {
1582
+ retry_to_return.retry_on.Add(GRPC_STATUS_DEADLINE_EXCEEDED);
1583
+ } else if (code == "internal") {
1584
+ retry_to_return.retry_on.Add(GRPC_STATUS_INTERNAL);
1585
+ } else if (code == "resource-exhausted") {
1586
+ retry_to_return.retry_on.Add(GRPC_STATUS_RESOURCE_EXHAUSTED);
1587
+ } else if (code == "unavailable") {
1588
+ retry_to_return.retry_on.Add(GRPC_STATUS_UNAVAILABLE);
1589
+ } else {
1590
+ if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
1591
+ gpr_log(GPR_INFO, "Unsupported retry_on policy %s.",
1592
+ std::string(code).c_str());
1593
+ }
1594
+ }
1595
+ }
1596
+ // TODO(donnadionne): when we add support for per_try_timeout, we will need to
1597
+ // return a policy if per_try_timeout is set even if retry_on specified no
1598
+ // supported policies.
1599
+ if (retry_to_return.retry_on.Empty()) return GRPC_ERROR_NONE;
1600
+ const google_protobuf_UInt32Value* num_retries =
1601
+ envoy_config_route_v3_RetryPolicy_num_retries(retry_policy);
1602
+ if (num_retries != nullptr) {
1603
+ uint32_t num_retries_value = google_protobuf_UInt32Value_value(num_retries);
1604
+ if (num_retries_value == 0) {
1605
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1606
+ "RouteAction RetryPolicy num_retries set to invalid value 0."));
1607
+ } else {
1608
+ retry_to_return.num_retries = num_retries_value;
1609
+ }
1610
+ } else {
1611
+ retry_to_return.num_retries = 1;
1612
+ }
1613
+ const envoy_config_route_v3_RetryPolicy_RetryBackOff* backoff =
1614
+ envoy_config_route_v3_RetryPolicy_retry_back_off(retry_policy);
1615
+ if (backoff != nullptr) {
1616
+ const google_protobuf_Duration* base_interval =
1617
+ envoy_config_route_v3_RetryPolicy_RetryBackOff_base_interval(backoff);
1618
+ if (base_interval == nullptr) {
1619
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1620
+ "RouteAction RetryPolicy RetryBackoff missing base interval."));
1621
+ } else {
1622
+ retry_to_return.retry_back_off.base_interval =
1623
+ DurationParse(base_interval);
1624
+ }
1625
+ const google_protobuf_Duration* max_interval =
1626
+ envoy_config_route_v3_RetryPolicy_RetryBackOff_max_interval(backoff);
1627
+ XdsApi::Duration max;
1628
+ if (max_interval != nullptr) {
1629
+ max = DurationParse(max_interval);
1630
+ } else {
1631
+ // if max interval is not set, it is 10x the base, if the value in nanos
1632
+ // can yield another second, adjust the value in seconds accordingly.
1633
+ max.seconds = retry_to_return.retry_back_off.base_interval.seconds * 10;
1634
+ max.nanos = retry_to_return.retry_back_off.base_interval.nanos * 10;
1635
+ if (max.nanos > 1000000000) {
1636
+ max.seconds += max.nanos / 1000000000;
1637
+ max.nanos = max.nanos % 1000000000;
1638
+ }
1639
+ }
1640
+ retry_to_return.retry_back_off.max_interval = max;
1641
+ } else {
1642
+ retry_to_return.retry_back_off.base_interval.seconds = 0;
1643
+ retry_to_return.retry_back_off.base_interval.nanos = 25000000;
1644
+ retry_to_return.retry_back_off.max_interval.seconds = 0;
1645
+ retry_to_return.retry_back_off.max_interval.nanos = 250000000;
1646
+ }
1647
+ if (errors.empty()) {
1648
+ *retry = retry_to_return;
1649
+ return GRPC_ERROR_NONE;
1650
+ } else {
1651
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing retry policy",
1652
+ &errors);
1653
+ }
1654
+ }
1655
+
1656
+ grpc_error_handle RouteActionParse(const EncodingContext& context,
1657
+ const envoy_config_route_v3_Route* route_msg,
1658
+ XdsApi::Route* route, bool* ignore_route) {
1484
1659
  if (!envoy_config_route_v3_Route_has_route(route_msg)) {
1485
1660
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1486
1661
  "No RouteAction found in route.");
@@ -1533,7 +1708,7 @@ grpc_error* RouteActionParse(const EncodingContext& context,
1533
1708
  if (cluster.weight == 0) continue;
1534
1709
  sum_of_weights += cluster.weight;
1535
1710
  if (context.use_v3) {
1536
- grpc_error* error = ParseTypedPerFilterConfig<
1711
+ grpc_error_handle error = ParseTypedPerFilterConfig<
1537
1712
  envoy_config_route_v3_WeightedCluster_ClusterWeight,
1538
1713
  envoy_config_route_v3_WeightedCluster_ClusterWeight_TypedPerFilterConfigEntry>(
1539
1714
  context, cluster_weight,
@@ -1571,10 +1746,7 @@ grpc_error* RouteActionParse(const EncodingContext& context,
1571
1746
  max_stream_duration);
1572
1747
  }
1573
1748
  if (duration != nullptr) {
1574
- XdsApi::Duration duration_in_route;
1575
- duration_in_route.seconds = google_protobuf_Duration_seconds(duration);
1576
- duration_in_route.nanos = google_protobuf_Duration_nanos(duration);
1577
- route->max_stream_duration = duration_in_route;
1749
+ route->max_stream_duration = DurationParse(duration);
1578
1750
  }
1579
1751
  }
1580
1752
  }
@@ -1602,40 +1774,35 @@ grpc_error* RouteActionParse(const EncodingContext& context,
1602
1774
  regex_rewrite =
1603
1775
  envoy_config_route_v3_RouteAction_HashPolicy_Header_regex_rewrite(
1604
1776
  header);
1605
- if (regex_rewrite == nullptr) {
1606
- gpr_log(
1607
- GPR_DEBUG,
1608
- "RouteAction HashPolicy contains policy specifier Header with "
1609
- "RegexMatchAndSubstitution but Regex is missing");
1610
- continue;
1611
- }
1612
- const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
1613
- envoy_type_matcher_v3_RegexMatchAndSubstitute_pattern(
1614
- regex_rewrite);
1615
- if (regex_matcher == nullptr) {
1616
- gpr_log(
1617
- GPR_DEBUG,
1618
- "RouteAction HashPolicy contains policy specifier Header with "
1619
- "RegexMatchAndSubstitution but RegexMatcher pattern is "
1620
- "missing");
1621
- continue;
1622
- }
1623
- RE2::Options options;
1624
- policy.regex = absl::make_unique<RE2>(
1625
- UpbStringToStdString(
1626
- envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher)),
1627
- options);
1628
- if (!policy.regex->ok()) {
1629
- gpr_log(
1630
- GPR_DEBUG,
1631
- "RouteAction HashPolicy contains policy specifier Header with "
1632
- "RegexMatchAndSubstitution but RegexMatcher pattern does not "
1633
- "compile");
1634
- continue;
1777
+ if (regex_rewrite != nullptr) {
1778
+ const envoy_type_matcher_v3_RegexMatcher* regex_matcher =
1779
+ envoy_type_matcher_v3_RegexMatchAndSubstitute_pattern(
1780
+ regex_rewrite);
1781
+ if (regex_matcher == nullptr) {
1782
+ gpr_log(
1783
+ GPR_DEBUG,
1784
+ "RouteAction HashPolicy contains policy specifier Header with "
1785
+ "RegexMatchAndSubstitution but RegexMatcher pattern is "
1786
+ "missing");
1787
+ continue;
1788
+ }
1789
+ RE2::Options options;
1790
+ policy.regex = absl::make_unique<RE2>(
1791
+ UpbStringToStdString(
1792
+ envoy_type_matcher_v3_RegexMatcher_regex(regex_matcher)),
1793
+ options);
1794
+ if (!policy.regex->ok()) {
1795
+ gpr_log(
1796
+ GPR_DEBUG,
1797
+ "RouteAction HashPolicy contains policy specifier Header with "
1798
+ "RegexMatchAndSubstitution but RegexMatcher pattern does not "
1799
+ "compile");
1800
+ continue;
1801
+ }
1802
+ policy.regex_substitution = UpbStringToStdString(
1803
+ envoy_type_matcher_v3_RegexMatchAndSubstitute_substitution(
1804
+ regex_rewrite));
1635
1805
  }
1636
- policy.regex_substitution = UpbStringToStdString(
1637
- envoy_type_matcher_v3_RegexMatchAndSubstitute_substitution(
1638
- regex_rewrite));
1639
1806
  } else if ((filter_state =
1640
1807
  envoy_config_route_v3_RouteAction_HashPolicy_filter_state(
1641
1808
  hash_policy)) != nullptr) {
@@ -1660,10 +1827,19 @@ grpc_error* RouteActionParse(const EncodingContext& context,
1660
1827
  route->hash_policies.emplace_back(std::move(policy));
1661
1828
  }
1662
1829
  }
1830
+ // Get retry policy
1831
+ const envoy_config_route_v3_RetryPolicy* retry_policy =
1832
+ envoy_config_route_v3_RouteAction_retry_policy(route_action);
1833
+ if (retry_policy != nullptr) {
1834
+ absl::optional<XdsApi::Route::RetryPolicy> retry;
1835
+ grpc_error_handle error = RetryPolicyParse(context, retry_policy, &retry);
1836
+ if (error != GRPC_ERROR_NONE) return error;
1837
+ route->retry_policy = retry;
1838
+ }
1663
1839
  return GRPC_ERROR_NONE;
1664
1840
  }
1665
1841
 
1666
- grpc_error* RouteConfigParse(
1842
+ grpc_error_handle RouteConfigParse(
1667
1843
  const EncodingContext& context,
1668
1844
  const envoy_config_route_v3_RouteConfiguration* route_config,
1669
1845
  XdsApi::RdsUpdate* rds_update) {
@@ -1695,7 +1871,7 @@ grpc_error* RouteConfigParse(
1695
1871
  }
1696
1872
  // Parse typed_per_filter_config.
1697
1873
  if (context.use_v3) {
1698
- grpc_error* error = ParseTypedPerFilterConfig<
1874
+ grpc_error_handle error = ParseTypedPerFilterConfig<
1699
1875
  envoy_config_route_v3_VirtualHost,
1700
1876
  envoy_config_route_v3_VirtualHost_TypedPerFilterConfigEntry>(
1701
1877
  context, virtual_hosts[i],
@@ -1705,6 +1881,15 @@ grpc_error* RouteConfigParse(
1705
1881
  &vhost.typed_per_filter_config);
1706
1882
  if (error != GRPC_ERROR_NONE) return error;
1707
1883
  }
1884
+ // Parse retry policy.
1885
+ absl::optional<XdsApi::Route::RetryPolicy> virtual_host_retry_policy;
1886
+ const envoy_config_route_v3_RetryPolicy* retry_policy =
1887
+ envoy_config_route_v3_VirtualHost_retry_policy(virtual_hosts[i]);
1888
+ if (retry_policy != nullptr) {
1889
+ grpc_error_handle error =
1890
+ RetryPolicyParse(context, retry_policy, &virtual_host_retry_policy);
1891
+ if (error != GRPC_ERROR_NONE) return error;
1892
+ }
1708
1893
  // Parse routes.
1709
1894
  size_t num_routes;
1710
1895
  const envoy_config_route_v3_Route* const* routes =
@@ -1728,7 +1913,8 @@ grpc_error* RouteConfigParse(
1728
1913
  }
1729
1914
  XdsApi::Route route;
1730
1915
  bool ignore_route = false;
1731
- grpc_error* error = RoutePathMatchParse(match, &route, &ignore_route);
1916
+ grpc_error_handle error =
1917
+ RoutePathMatchParse(match, &route, &ignore_route);
1732
1918
  if (error != GRPC_ERROR_NONE) return error;
1733
1919
  if (ignore_route) continue;
1734
1920
  error = RouteHeaderMatchersParse(match, &route);
@@ -1738,8 +1924,11 @@ grpc_error* RouteConfigParse(
1738
1924
  error = RouteActionParse(context, routes[j], &route, &ignore_route);
1739
1925
  if (error != GRPC_ERROR_NONE) return error;
1740
1926
  if (ignore_route) continue;
1927
+ if (route.retry_policy == absl::nullopt && retry_policy != nullptr) {
1928
+ route.retry_policy = virtual_host_retry_policy;
1929
+ }
1741
1930
  if (context.use_v3) {
1742
- grpc_error* error = ParseTypedPerFilterConfig<
1931
+ grpc_error_handle error = ParseTypedPerFilterConfig<
1743
1932
  envoy_config_route_v3_Route,
1744
1933
  envoy_config_route_v3_Route_TypedPerFilterConfigEntry>(
1745
1934
  context, routes[j],
@@ -1758,24 +1947,32 @@ grpc_error* RouteConfigParse(
1758
1947
  return GRPC_ERROR_NONE;
1759
1948
  }
1760
1949
 
1761
- XdsApi::CommonTlsContext::CertificateProviderInstance
1762
- CertificateProviderInstanceParse(
1950
+ grpc_error_handle CertificateProviderInstanceParse(
1951
+ const EncodingContext& context,
1763
1952
  const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance*
1764
- certificate_provider_instance_proto) {
1765
- return {
1953
+ certificate_provider_instance_proto,
1954
+ XdsApi::CommonTlsContext::CertificateProviderInstance*
1955
+ certificate_provider_instance) {
1956
+ *certificate_provider_instance = {
1766
1957
  UpbStringToStdString(
1767
1958
  envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance_instance_name(
1768
1959
  certificate_provider_instance_proto)),
1769
1960
  UpbStringToStdString(
1770
1961
  envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CertificateProviderInstance_certificate_name(
1771
1962
  certificate_provider_instance_proto))};
1963
+ if (context.certificate_provider_definition_map->find(
1964
+ certificate_provider_instance->instance_name) ==
1965
+ context.certificate_provider_definition_map->end()) {
1966
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
1967
+ absl::StrCat("Unrecognized certificate provider instance name: ",
1968
+ certificate_provider_instance->instance_name)
1969
+ .c_str());
1970
+ }
1971
+ return GRPC_ERROR_NONE;
1772
1972
  }
1773
1973
 
1774
- grpc_error* CommonTlsContextParse(
1775
- const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext*
1776
- common_tls_context_proto,
1777
- XdsApi::CommonTlsContext* common_tls_context) GRPC_MUST_USE_RESULT;
1778
- grpc_error* CommonTlsContextParse(
1974
+ grpc_error_handle CommonTlsContextParse(
1975
+ const EncodingContext& context,
1779
1976
  const envoy_extensions_transport_sockets_tls_v3_CommonTlsContext*
1780
1977
  common_tls_context_proto,
1781
1978
  XdsApi::CommonTlsContext* common_tls_context) {
@@ -1796,31 +1993,31 @@ grpc_error* CommonTlsContextParse(
1796
1993
  std::string matcher;
1797
1994
  if (envoy_type_matcher_v3_StringMatcher_has_exact(
1798
1995
  subject_alt_names_matchers[i])) {
1799
- type = StringMatcher::Type::EXACT;
1996
+ type = StringMatcher::Type::kExact;
1800
1997
  matcher =
1801
1998
  UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_exact(
1802
1999
  subject_alt_names_matchers[i]));
1803
2000
  } else if (envoy_type_matcher_v3_StringMatcher_has_prefix(
1804
2001
  subject_alt_names_matchers[i])) {
1805
- type = StringMatcher::Type::PREFIX;
2002
+ type = StringMatcher::Type::kPrefix;
1806
2003
  matcher =
1807
2004
  UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_prefix(
1808
2005
  subject_alt_names_matchers[i]));
1809
2006
  } else if (envoy_type_matcher_v3_StringMatcher_has_suffix(
1810
2007
  subject_alt_names_matchers[i])) {
1811
- type = StringMatcher::Type::SUFFIX;
2008
+ type = StringMatcher::Type::kSuffix;
1812
2009
  matcher =
1813
2010
  UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_suffix(
1814
2011
  subject_alt_names_matchers[i]));
1815
2012
  } else if (envoy_type_matcher_v3_StringMatcher_has_contains(
1816
2013
  subject_alt_names_matchers[i])) {
1817
- type = StringMatcher::Type::CONTAINS;
2014
+ type = StringMatcher::Type::kContains;
1818
2015
  matcher =
1819
2016
  UpbStringToStdString(envoy_type_matcher_v3_StringMatcher_contains(
1820
2017
  subject_alt_names_matchers[i]));
1821
2018
  } else if (envoy_type_matcher_v3_StringMatcher_has_safe_regex(
1822
2019
  subject_alt_names_matchers[i])) {
1823
- type = StringMatcher::Type::SAFE_REGEX;
2020
+ type = StringMatcher::Type::kSafeRegex;
1824
2021
  auto* regex_matcher = envoy_type_matcher_v3_StringMatcher_safe_regex(
1825
2022
  subject_alt_names_matchers[i]);
1826
2023
  matcher = UpbStringToStdString(
@@ -1840,7 +2037,7 @@ grpc_error* CommonTlsContextParse(
1840
2037
  string_matcher.status().message())
1841
2038
  .c_str());
1842
2039
  }
1843
- if (type == StringMatcher::Type::SAFE_REGEX && ignore_case) {
2040
+ if (type == StringMatcher::Type::kSafeRegex && ignore_case) {
1844
2041
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1845
2042
  "StringMatcher: ignore_case has no effect for SAFE_REGEX.");
1846
2043
  }
@@ -1853,24 +2050,26 @@ grpc_error* CommonTlsContextParse(
1853
2050
  envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_CombinedCertificateValidationContext_validation_context_certificate_provider_instance(
1854
2051
  combined_validation_context);
1855
2052
  if (validation_context_certificate_provider_instance != nullptr) {
1856
- common_tls_context->combined_validation_context
1857
- .validation_context_certificate_provider_instance =
1858
- CertificateProviderInstanceParse(
1859
- validation_context_certificate_provider_instance);
2053
+ grpc_error_handle error = CertificateProviderInstanceParse(
2054
+ context, validation_context_certificate_provider_instance,
2055
+ &common_tls_context->combined_validation_context
2056
+ .validation_context_certificate_provider_instance);
2057
+ if (error != GRPC_ERROR_NONE) return error;
1860
2058
  }
1861
2059
  }
1862
2060
  auto* tls_certificate_certificate_provider_instance =
1863
2061
  envoy_extensions_transport_sockets_tls_v3_CommonTlsContext_tls_certificate_certificate_provider_instance(
1864
2062
  common_tls_context_proto);
1865
2063
  if (tls_certificate_certificate_provider_instance != nullptr) {
1866
- common_tls_context->tls_certificate_certificate_provider_instance =
1867
- CertificateProviderInstanceParse(
1868
- tls_certificate_certificate_provider_instance);
2064
+ grpc_error_handle error = CertificateProviderInstanceParse(
2065
+ context, tls_certificate_certificate_provider_instance,
2066
+ &common_tls_context->tls_certificate_certificate_provider_instance);
2067
+ if (error != GRPC_ERROR_NONE) return error;
1869
2068
  }
1870
2069
  return GRPC_ERROR_NONE;
1871
2070
  }
1872
2071
 
1873
- grpc_error* HttpConnectionManagerParse(
2072
+ grpc_error_handle HttpConnectionManagerParse(
1874
2073
  bool is_client, const EncodingContext& context,
1875
2074
  const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*
1876
2075
  http_connection_manager_proto,
@@ -1885,10 +2084,8 @@ grpc_error* HttpConnectionManagerParse(
1885
2084
  const google_protobuf_Duration* duration =
1886
2085
  envoy_config_core_v3_HttpProtocolOptions_max_stream_duration(options);
1887
2086
  if (duration != nullptr) {
1888
- http_connection_manager->http_max_stream_duration.seconds =
1889
- google_protobuf_Duration_seconds(duration);
1890
- http_connection_manager->http_max_stream_duration.nanos =
1891
- google_protobuf_Duration_nanos(duration);
2087
+ http_connection_manager->http_max_stream_duration =
2088
+ DurationParse(duration);
1892
2089
  }
1893
2090
  }
1894
2091
  // Parse filters.
@@ -1925,7 +2122,8 @@ grpc_error* HttpConnectionManagerParse(
1925
2122
  .c_str());
1926
2123
  }
1927
2124
  absl::string_view filter_type;
1928
- grpc_error* error = ExtractHttpFilterTypeName(context, any, &filter_type);
2125
+ grpc_error_handle error =
2126
+ ExtractHttpFilterTypeName(context, any, &filter_type);
1929
2127
  if (error != GRPC_ERROR_NONE) return error;
1930
2128
  const XdsHttpFilterImpl* filter_impl =
1931
2129
  XdsHttpFilterRegistry::GetFilterForType(filter_type);
@@ -1943,6 +2141,23 @@ grpc_error* HttpConnectionManagerParse(
1943
2141
  is_client ? "clients" : "servers")
1944
2142
  .c_str());
1945
2143
  }
2144
+ if (i < num_filters - 1) {
2145
+ // Filters before the last filter must not be terminal.
2146
+ if (filter_impl->IsTerminalFilter()) {
2147
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2148
+ absl::StrCat("terminal filter for config type ", filter_type,
2149
+ " must be the last filter in the chain")
2150
+ .c_str());
2151
+ }
2152
+ } else {
2153
+ // The last filter must be terminal.
2154
+ if (!filter_impl->IsTerminalFilter()) {
2155
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2156
+ absl::StrCat("non-terminal filter for config type ", filter_type,
2157
+ " is the last filter in the chain")
2158
+ .c_str());
2159
+ }
2160
+ }
1946
2161
  absl::StatusOr<XdsHttpFilterImpl::FilterConfig> filter_config =
1947
2162
  filter_impl->GenerateFilterConfig(google_protobuf_Any_value(any),
1948
2163
  context.arena);
@@ -1974,7 +2189,8 @@ grpc_error* HttpConnectionManagerParse(
1974
2189
  envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(
1975
2190
  http_connection_manager_proto);
1976
2191
  XdsApi::RdsUpdate rds_update;
1977
- grpc_error* error = RouteConfigParse(context, route_config, &rds_update);
2192
+ grpc_error_handle error =
2193
+ RouteConfigParse(context, route_config, &rds_update);
1978
2194
  if (error != GRPC_ERROR_NONE) return error;
1979
2195
  http_connection_manager->rds_update = std::move(rds_update);
1980
2196
  return GRPC_ERROR_NONE;
@@ -2007,7 +2223,7 @@ grpc_error* HttpConnectionManagerParse(
2007
2223
  return GRPC_ERROR_NONE;
2008
2224
  }
2009
2225
 
2010
- grpc_error* LdsResponseParseClient(
2226
+ grpc_error_handle LdsResponseParseClient(
2011
2227
  const EncodingContext& context,
2012
2228
  const envoy_config_listener_v3_ApiListener* api_listener, bool is_v2,
2013
2229
  XdsApi::LdsUpdate* lds_update) {
@@ -2026,60 +2242,71 @@ grpc_error* LdsResponseParseClient(
2026
2242
  &lds_update->http_connection_manager);
2027
2243
  }
2028
2244
 
2029
- grpc_error* DownstreamTlsContextParse(
2245
+ grpc_error_handle DownstreamTlsContextParse(
2030
2246
  const EncodingContext& context,
2031
2247
  const envoy_config_core_v3_TransportSocket* transport_socket,
2032
2248
  XdsApi::DownstreamTlsContext* downstream_tls_context) {
2033
2249
  absl::string_view name = UpbStringToAbsl(
2034
2250
  envoy_config_core_v3_TransportSocket_name(transport_socket));
2035
- if (name == "envoy.transport_sockets.tls") {
2036
- auto* typed_config =
2037
- envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
2038
- if (typed_config != nullptr) {
2039
- const upb_strview encoded_downstream_tls_context =
2040
- google_protobuf_Any_value(typed_config);
2041
- auto* downstream_tls_context_proto =
2042
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_parse(
2043
- encoded_downstream_tls_context.data,
2044
- encoded_downstream_tls_context.size, context.arena);
2045
- if (downstream_tls_context_proto == nullptr) {
2046
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2047
- "Can't decode downstream tls context.");
2048
- }
2049
- auto* common_tls_context =
2050
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_common_tls_context(
2051
- downstream_tls_context_proto);
2052
- if (common_tls_context != nullptr) {
2053
- grpc_error* error = CommonTlsContextParse(
2054
- common_tls_context, &downstream_tls_context->common_tls_context);
2055
- if (error != GRPC_ERROR_NONE) return error;
2056
- }
2057
- auto* require_client_certificate =
2058
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_client_certificate(
2059
- downstream_tls_context_proto);
2060
- if (require_client_certificate != nullptr) {
2061
- downstream_tls_context->require_client_certificate =
2062
- google_protobuf_BoolValue_value(require_client_certificate);
2063
- }
2064
- }
2065
- if (downstream_tls_context->common_tls_context
2066
- .tls_certificate_certificate_provider_instance.instance_name
2067
- .empty()) {
2251
+ if (name != "envoy.transport_sockets.tls") {
2252
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2253
+ absl::StrCat("Unrecognized transport socket: ", name).c_str());
2254
+ }
2255
+ auto* typed_config =
2256
+ envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
2257
+ if (typed_config != nullptr) {
2258
+ const upb_strview encoded_downstream_tls_context =
2259
+ google_protobuf_Any_value(typed_config);
2260
+ auto* downstream_tls_context_proto =
2261
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_parse(
2262
+ encoded_downstream_tls_context.data,
2263
+ encoded_downstream_tls_context.size, context.arena);
2264
+ if (downstream_tls_context_proto == nullptr) {
2068
2265
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2069
- "TLS configuration provided but no "
2070
- "tls_certificate_certificate_provider_instance found.");
2266
+ "Can't decode downstream tls context.");
2071
2267
  }
2268
+ auto* common_tls_context =
2269
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_common_tls_context(
2270
+ downstream_tls_context_proto);
2271
+ if (common_tls_context != nullptr) {
2272
+ grpc_error_handle error =
2273
+ CommonTlsContextParse(context, common_tls_context,
2274
+ &downstream_tls_context->common_tls_context);
2275
+ if (error != GRPC_ERROR_NONE) return error;
2276
+ }
2277
+ auto* require_client_certificate =
2278
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_client_certificate(
2279
+ downstream_tls_context_proto);
2280
+ if (require_client_certificate != nullptr) {
2281
+ downstream_tls_context->require_client_certificate =
2282
+ google_protobuf_BoolValue_value(require_client_certificate);
2283
+ }
2284
+ }
2285
+ if (downstream_tls_context->common_tls_context
2286
+ .tls_certificate_certificate_provider_instance.instance_name
2287
+ .empty()) {
2288
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2289
+ "TLS configuration provided but no "
2290
+ "tls_certificate_certificate_provider_instance found.");
2291
+ }
2292
+ if (downstream_tls_context->require_client_certificate &&
2293
+ downstream_tls_context->common_tls_context.combined_validation_context
2294
+ .validation_context_certificate_provider_instance.instance_name
2295
+ .empty()) {
2296
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2297
+ "TLS configuration requires client certificates but no certificate "
2298
+ "provider instance specified for validation.");
2072
2299
  }
2073
2300
  return GRPC_ERROR_NONE;
2074
2301
  }
2075
2302
 
2076
- grpc_error* CidrRangeParse(
2303
+ grpc_error_handle CidrRangeParse(
2077
2304
  const envoy_config_core_v3_CidrRange* cidr_range_proto,
2078
2305
  XdsApi::LdsUpdate::FilterChainMap::CidrRange* cidr_range) {
2079
2306
  std::string address_prefix = UpbStringToStdString(
2080
2307
  envoy_config_core_v3_CidrRange_address_prefix(cidr_range_proto));
2081
- grpc_error* error = grpc_string_to_sockaddr_new(&cidr_range->address,
2082
- address_prefix.c_str(), 0);
2308
+ grpc_error_handle error =
2309
+ grpc_string_to_sockaddr(&cidr_range->address, address_prefix.c_str(), 0);
2083
2310
  if (error != GRPC_ERROR_NONE) return error;
2084
2311
  cidr_range->prefix_len = 0;
2085
2312
  auto* prefix_len_proto =
@@ -2097,7 +2324,7 @@ grpc_error* CidrRangeParse(
2097
2324
  return GRPC_ERROR_NONE;
2098
2325
  }
2099
2326
 
2100
- grpc_error* FilterChainMatchParse(
2327
+ grpc_error_handle FilterChainMatchParse(
2101
2328
  const envoy_config_listener_v3_FilterChainMatch* filter_chain_match_proto,
2102
2329
  FilterChain::FilterChainMatch* filter_chain_match) {
2103
2330
  auto* destination_port =
@@ -2113,7 +2340,7 @@ grpc_error* FilterChainMatchParse(
2113
2340
  filter_chain_match->prefix_ranges.reserve(size);
2114
2341
  for (size_t i = 0; i < size; i++) {
2115
2342
  XdsApi::LdsUpdate::FilterChainMap::CidrRange cidr_range;
2116
- grpc_error* error = CidrRangeParse(prefix_ranges[i], &cidr_range);
2343
+ grpc_error_handle error = CidrRangeParse(prefix_ranges[i], &cidr_range);
2117
2344
  if (error != GRPC_ERROR_NONE) return error;
2118
2345
  filter_chain_match->prefix_ranges.push_back(cidr_range);
2119
2346
  }
@@ -2127,7 +2354,8 @@ grpc_error* FilterChainMatchParse(
2127
2354
  filter_chain_match->source_prefix_ranges.reserve(size);
2128
2355
  for (size_t i = 0; i < size; i++) {
2129
2356
  XdsApi::LdsUpdate::FilterChainMap::CidrRange cidr_range;
2130
- grpc_error* error = CidrRangeParse(source_prefix_ranges[i], &cidr_range);
2357
+ grpc_error_handle error =
2358
+ CidrRangeParse(source_prefix_ranges[i], &cidr_range);
2131
2359
  if (error != GRPC_ERROR_NONE) return error;
2132
2360
  filter_chain_match->source_prefix_ranges.push_back(cidr_range);
2133
2361
  }
@@ -2156,11 +2384,11 @@ grpc_error* FilterChainMatchParse(
2156
2384
  return GRPC_ERROR_NONE;
2157
2385
  }
2158
2386
 
2159
- grpc_error* FilterChainParse(
2387
+ grpc_error_handle FilterChainParse(
2160
2388
  const EncodingContext& context,
2161
2389
  const envoy_config_listener_v3_FilterChain* filter_chain_proto, bool is_v2,
2162
2390
  FilterChain* filter_chain) {
2163
- grpc_error* error = GRPC_ERROR_NONE;
2391
+ grpc_error_handle error = GRPC_ERROR_NONE;
2164
2392
  auto* filter_chain_match =
2165
2393
  envoy_config_listener_v3_FilterChain_filter_chain_match(
2166
2394
  filter_chain_proto);
@@ -2223,8 +2451,8 @@ grpc_error* FilterChainParse(
2223
2451
  return error;
2224
2452
  }
2225
2453
 
2226
- grpc_error* AddressParse(const envoy_config_core_v3_Address* address_proto,
2227
- std::string* address) {
2454
+ grpc_error_handle AddressParse(
2455
+ const envoy_config_core_v3_Address* address_proto, std::string* address) {
2228
2456
  const auto* socket_address =
2229
2457
  envoy_config_core_v3_Address_socket_address(address_proto);
2230
2458
  if (socket_address == nullptr) {
@@ -2263,7 +2491,7 @@ struct InternalFilterChainMap {
2263
2491
  DestinationIpMap destination_ip_map;
2264
2492
  };
2265
2493
 
2266
- grpc_error* AddFilterChainDataForSourcePort(
2494
+ grpc_error_handle AddFilterChainDataForSourcePort(
2267
2495
  const FilterChain& filter_chain,
2268
2496
  XdsApi::LdsUpdate::FilterChainMap::SourcePortsMap* ports_map,
2269
2497
  uint32_t port) {
@@ -2280,14 +2508,14 @@ grpc_error* AddFilterChainDataForSourcePort(
2280
2508
  return GRPC_ERROR_NONE;
2281
2509
  }
2282
2510
 
2283
- grpc_error* AddFilterChainDataForSourcePorts(
2511
+ grpc_error_handle AddFilterChainDataForSourcePorts(
2284
2512
  const FilterChain& filter_chain,
2285
2513
  XdsApi::LdsUpdate::FilterChainMap::SourcePortsMap* ports_map) {
2286
2514
  if (filter_chain.filter_chain_match.source_ports.empty()) {
2287
2515
  return AddFilterChainDataForSourcePort(filter_chain, ports_map, 0);
2288
2516
  } else {
2289
2517
  for (uint32_t port : filter_chain.filter_chain_match.source_ports) {
2290
- grpc_error* error =
2518
+ grpc_error_handle error =
2291
2519
  AddFilterChainDataForSourcePort(filter_chain, ports_map, port);
2292
2520
  if (error != GRPC_ERROR_NONE) return error;
2293
2521
  }
@@ -2295,7 +2523,7 @@ grpc_error* AddFilterChainDataForSourcePorts(
2295
2523
  return GRPC_ERROR_NONE;
2296
2524
  }
2297
2525
 
2298
- grpc_error* AddFilterChainDataForSourceIpRange(
2526
+ grpc_error_handle AddFilterChainDataForSourceIpRange(
2299
2527
  const FilterChain& filter_chain,
2300
2528
  InternalFilterChainMap::SourceIpMap* source_ip_map) {
2301
2529
  if (filter_chain.filter_chain_match.source_prefix_ranges.empty()) {
@@ -2313,7 +2541,7 @@ grpc_error* AddFilterChainDataForSourceIpRange(
2313
2541
  if (insert_result.second) {
2314
2542
  insert_result.first->second.prefix_range.emplace(prefix_range);
2315
2543
  }
2316
- grpc_error* error = AddFilterChainDataForSourcePorts(
2544
+ grpc_error_handle error = AddFilterChainDataForSourcePorts(
2317
2545
  filter_chain, &insert_result.first->second.ports_map);
2318
2546
  if (error != GRPC_ERROR_NONE) return error;
2319
2547
  }
@@ -2321,7 +2549,7 @@ grpc_error* AddFilterChainDataForSourceIpRange(
2321
2549
  return GRPC_ERROR_NONE;
2322
2550
  }
2323
2551
 
2324
- grpc_error* AddFilterChainDataForSourceType(
2552
+ grpc_error_handle AddFilterChainDataForSourceType(
2325
2553
  const FilterChain& filter_chain,
2326
2554
  InternalFilterChainMap::DestinationIp* destination_ip) {
2327
2555
  GPR_ASSERT(static_cast<unsigned int>(
@@ -2331,7 +2559,7 @@ grpc_error* AddFilterChainDataForSourceType(
2331
2559
  filter_chain.filter_chain_match.source_type)]);
2332
2560
  }
2333
2561
 
2334
- grpc_error* AddFilterChainDataForApplicationProtocols(
2562
+ grpc_error_handle AddFilterChainDataForApplicationProtocols(
2335
2563
  const FilterChain& filter_chain,
2336
2564
  InternalFilterChainMap::DestinationIp* destination_ip) {
2337
2565
  // Only allow filter chains that do not mention application protocols
@@ -2341,7 +2569,7 @@ grpc_error* AddFilterChainDataForApplicationProtocols(
2341
2569
  return AddFilterChainDataForSourceType(filter_chain, destination_ip);
2342
2570
  }
2343
2571
 
2344
- grpc_error* AddFilterChainDataForTransportProtocol(
2572
+ grpc_error_handle AddFilterChainDataForTransportProtocol(
2345
2573
  const FilterChain& filter_chain,
2346
2574
  InternalFilterChainMap::DestinationIp* destination_ip) {
2347
2575
  const std::string& transport_protocol =
@@ -2369,7 +2597,7 @@ grpc_error* AddFilterChainDataForTransportProtocol(
2369
2597
  destination_ip);
2370
2598
  }
2371
2599
 
2372
- grpc_error* AddFilterChainDataForServerNames(
2600
+ grpc_error_handle AddFilterChainDataForServerNames(
2373
2601
  const FilterChain& filter_chain,
2374
2602
  InternalFilterChainMap::DestinationIp* destination_ip) {
2375
2603
  // Don't continue adding filter chains with server names mentioned
@@ -2379,7 +2607,7 @@ grpc_error* AddFilterChainDataForServerNames(
2379
2607
  return AddFilterChainDataForTransportProtocol(filter_chain, destination_ip);
2380
2608
  }
2381
2609
 
2382
- grpc_error* AddFilterChainDataForDestinationIpRange(
2610
+ grpc_error_handle AddFilterChainDataForDestinationIpRange(
2383
2611
  const FilterChain& filter_chain,
2384
2612
  InternalFilterChainMap::DestinationIpMap* destination_ip_map) {
2385
2613
  if (filter_chain.filter_chain_match.prefix_ranges.empty()) {
@@ -2397,7 +2625,7 @@ grpc_error* AddFilterChainDataForDestinationIpRange(
2397
2625
  if (insert_result.second) {
2398
2626
  insert_result.first->second.prefix_range.emplace(prefix_range);
2399
2627
  }
2400
- grpc_error* error = AddFilterChainDataForServerNames(
2628
+ grpc_error_handle error = AddFilterChainDataForServerNames(
2401
2629
  filter_chain, &insert_result.first->second);
2402
2630
  if (error != GRPC_ERROR_NONE) return error;
2403
2631
  }
@@ -2424,14 +2652,14 @@ XdsApi::LdsUpdate::FilterChainMap BuildFromInternalFilterChainMap(
2424
2652
  return filter_chain_map;
2425
2653
  }
2426
2654
 
2427
- grpc_error* BuildFilterChainMap(
2655
+ grpc_error_handle BuildFilterChainMap(
2428
2656
  const std::vector<FilterChain>& filter_chains,
2429
2657
  XdsApi::LdsUpdate::FilterChainMap* filter_chain_map) {
2430
2658
  InternalFilterChainMap internal_filter_chain_map;
2431
2659
  for (const auto& filter_chain : filter_chains) {
2432
2660
  // Discard filter chain entries that specify destination port
2433
2661
  if (filter_chain.filter_chain_match.destination_port != 0) continue;
2434
- grpc_error* error = AddFilterChainDataForDestinationIpRange(
2662
+ grpc_error_handle error = AddFilterChainDataForDestinationIpRange(
2435
2663
  filter_chain, &internal_filter_chain_map.destination_ip_map);
2436
2664
  if (error != GRPC_ERROR_NONE) return error;
2437
2665
  }
@@ -2440,12 +2668,12 @@ grpc_error* BuildFilterChainMap(
2440
2668
  return GRPC_ERROR_NONE;
2441
2669
  }
2442
2670
 
2443
- grpc_error* LdsResponseParseServer(
2671
+ grpc_error_handle LdsResponseParseServer(
2444
2672
  const EncodingContext& context,
2445
2673
  const envoy_config_listener_v3_Listener* listener, bool is_v2,
2446
2674
  XdsApi::LdsUpdate* lds_update) {
2447
2675
  lds_update->type = XdsApi::LdsUpdate::ListenerType::kTcpListener;
2448
- grpc_error* error =
2676
+ grpc_error_handle error =
2449
2677
  AddressParse(envoy_config_listener_v3_Listener_address(listener),
2450
2678
  &lds_update->address);
2451
2679
  if (error != GRPC_ERROR_NONE) return error;
@@ -2489,13 +2717,13 @@ grpc_error* LdsResponseParseServer(
2489
2717
  return GRPC_ERROR_NONE;
2490
2718
  }
2491
2719
 
2492
- grpc_error* LdsResponseParse(
2720
+ grpc_error_handle LdsResponseParse(
2493
2721
  const EncodingContext& context,
2494
2722
  const envoy_service_discovery_v3_DiscoveryResponse* response,
2495
2723
  const std::set<absl::string_view>& expected_listener_names,
2496
2724
  XdsApi::LdsUpdateMap* lds_update_map,
2497
2725
  std::set<std::string>* resource_names_failed) {
2498
- std::vector<grpc_error*> errors;
2726
+ std::vector<grpc_error_handle> errors;
2499
2727
  // Get the resources from the response.
2500
2728
  size_t size;
2501
2729
  const google_protobuf_Any* const* resources =
@@ -2564,7 +2792,7 @@ grpc_error* LdsResponseParse(
2564
2792
  resource_names_failed->insert(listener_name);
2565
2793
  continue;
2566
2794
  }
2567
- grpc_error* error = GRPC_ERROR_NONE;
2795
+ grpc_error_handle error = GRPC_ERROR_NONE;
2568
2796
  if (api_listener != nullptr) {
2569
2797
  error = LdsResponseParseClient(context, api_listener, is_v2, &lds_update);
2570
2798
  } else {
@@ -2581,13 +2809,13 @@ grpc_error* LdsResponseParse(
2581
2809
  return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing LDS response", &errors);
2582
2810
  }
2583
2811
 
2584
- grpc_error* RdsResponseParse(
2812
+ grpc_error_handle RdsResponseParse(
2585
2813
  const EncodingContext& context,
2586
2814
  const envoy_service_discovery_v3_DiscoveryResponse* response,
2587
2815
  const std::set<absl::string_view>& expected_route_configuration_names,
2588
2816
  XdsApi::RdsUpdateMap* rds_update_map,
2589
2817
  std::set<std::string>* resource_names_failed) {
2590
- std::vector<grpc_error*> errors;
2818
+ std::vector<grpc_error_handle> errors;
2591
2819
  // Get the resources from the response.
2592
2820
  size_t size;
2593
2821
  const google_protobuf_Any* const* resources =
@@ -2638,7 +2866,8 @@ grpc_error* RdsResponseParse(
2638
2866
  rds_resource_data.serialized_proto =
2639
2867
  UpbStringToStdString(encoded_route_config);
2640
2868
  // Parse the route_config.
2641
- grpc_error* error = RouteConfigParse(context, route_config, &rds_update);
2869
+ grpc_error_handle error =
2870
+ RouteConfigParse(context, route_config, &rds_update);
2642
2871
  if (error != GRPC_ERROR_NONE) {
2643
2872
  errors.push_back(grpc_error_add_child(
2644
2873
  GRPC_ERROR_CREATE_FROM_COPIED_STRING(
@@ -2650,13 +2879,61 @@ grpc_error* RdsResponseParse(
2650
2879
  return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing RDS response", &errors);
2651
2880
  }
2652
2881
 
2653
- grpc_error* CdsResponseParse(
2882
+ grpc_error_handle UpstreamTlsContextParse(
2883
+ const EncodingContext& context,
2884
+ const envoy_config_core_v3_TransportSocket* transport_socket,
2885
+ XdsApi::CommonTlsContext* common_tls_context) {
2886
+ // Record Upstream tls context
2887
+ absl::string_view name = UpbStringToAbsl(
2888
+ envoy_config_core_v3_TransportSocket_name(transport_socket));
2889
+ if (name != "envoy.transport_sockets.tls") {
2890
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2891
+ absl::StrCat("Unrecognized transport socket: ", name).c_str());
2892
+ }
2893
+ auto* typed_config =
2894
+ envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
2895
+ if (typed_config != nullptr) {
2896
+ const upb_strview encoded_upstream_tls_context =
2897
+ google_protobuf_Any_value(typed_config);
2898
+ auto* upstream_tls_context =
2899
+ envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_parse(
2900
+ encoded_upstream_tls_context.data,
2901
+ encoded_upstream_tls_context.size, context.arena);
2902
+ if (upstream_tls_context == nullptr) {
2903
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2904
+ "Can't decode upstream tls context.");
2905
+ }
2906
+ auto* common_tls_context_proto =
2907
+ envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_common_tls_context(
2908
+ upstream_tls_context);
2909
+ if (common_tls_context_proto != nullptr) {
2910
+ grpc_error_handle error = CommonTlsContextParse(
2911
+ context, common_tls_context_proto, common_tls_context);
2912
+ if (error != GRPC_ERROR_NONE) {
2913
+ return grpc_error_add_child(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
2914
+ "Error parsing UpstreamTlsContext"),
2915
+ error);
2916
+ }
2917
+ }
2918
+ }
2919
+ if (common_tls_context->combined_validation_context
2920
+ .validation_context_certificate_provider_instance.instance_name
2921
+ .empty()) {
2922
+ return GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2923
+ "UpstreamTlsContext: TLS configuration provided but no "
2924
+ "validation_context_certificate_provider_instance "
2925
+ "found.");
2926
+ }
2927
+ return GRPC_ERROR_NONE;
2928
+ }
2929
+
2930
+ grpc_error_handle CdsResponseParse(
2654
2931
  const EncodingContext& context,
2655
2932
  const envoy_service_discovery_v3_DiscoveryResponse* response,
2656
2933
  const std::set<absl::string_view>& expected_cluster_names,
2657
2934
  XdsApi::CdsUpdateMap* cds_update_map,
2658
2935
  std::set<std::string>* resource_names_failed) {
2659
- std::vector<grpc_error*> errors;
2936
+ std::vector<grpc_error_handle> errors;
2660
2937
  // Get the resources from the response.
2661
2938
  size_t size;
2662
2939
  const google_protobuf_Any* const* resources =
@@ -2699,10 +2976,11 @@ grpc_error* CdsResponseParse(
2699
2976
  resource_names_failed->insert(cluster_name);
2700
2977
  continue;
2701
2978
  }
2702
- // Serialize into JSON and store it in the CdsUpdateMap
2979
+ // Add the cluster to cds_update_map.
2703
2980
  XdsApi::CdsResourceData& cds_resource_data =
2704
2981
  (*cds_update_map)[cluster_name];
2705
2982
  XdsApi::CdsUpdate& cds_update = cds_resource_data.resource;
2983
+ // Store serialized proto.
2706
2984
  cds_resource_data.serialized_proto = UpbStringToStdString(encoded_cluster);
2707
2985
  // Check the cluster_discovery_type.
2708
2986
  if (!envoy_config_cluster_v3_Cluster_has_type(cluster) &&
@@ -2744,6 +3022,102 @@ grpc_error* CdsResponseParse(
2744
3022
  } else if (envoy_config_cluster_v3_Cluster_type(cluster) ==
2745
3023
  envoy_config_cluster_v3_Cluster_LOGICAL_DNS) {
2746
3024
  cds_update.cluster_type = XdsApi::CdsUpdate::ClusterType::LOGICAL_DNS;
3025
+ const auto* load_assignment =
3026
+ envoy_config_cluster_v3_Cluster_load_assignment(cluster);
3027
+ if (load_assignment == nullptr) {
3028
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
3029
+ absl::StrCat(
3030
+ cluster_name,
3031
+ ": load_assignment not present for LOGICAL_DNS cluster")
3032
+ .c_str()));
3033
+ resource_names_failed->insert(cluster_name);
3034
+ continue;
3035
+ }
3036
+ size_t num_localities;
3037
+ const auto* const* localities =
3038
+ envoy_config_endpoint_v3_ClusterLoadAssignment_endpoints(
3039
+ load_assignment, &num_localities);
3040
+ if (num_localities != 1) {
3041
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
3042
+ absl::StrCat(cluster_name,
3043
+ ": load_assignment for LOGICAL_DNS cluster must have "
3044
+ "exactly one locality, found ",
3045
+ num_localities)
3046
+ .c_str()));
3047
+ resource_names_failed->insert(cluster_name);
3048
+ continue;
3049
+ }
3050
+ size_t num_endpoints;
3051
+ const auto* const* endpoints =
3052
+ envoy_config_endpoint_v3_LocalityLbEndpoints_lb_endpoints(
3053
+ localities[0], &num_endpoints);
3054
+ if (num_endpoints != 1) {
3055
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
3056
+ absl::StrCat(cluster_name,
3057
+ ": locality for LOGICAL_DNS cluster must have "
3058
+ "exactly one endpoint, found ",
3059
+ num_endpoints)
3060
+ .c_str()));
3061
+ resource_names_failed->insert(cluster_name);
3062
+ continue;
3063
+ }
3064
+ const auto* endpoint =
3065
+ envoy_config_endpoint_v3_LbEndpoint_endpoint(endpoints[0]);
3066
+ if (endpoint == nullptr) {
3067
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
3068
+ absl::StrCat(cluster_name, ": LbEndpoint endpoint field not set")
3069
+ .c_str()));
3070
+ resource_names_failed->insert(cluster_name);
3071
+ continue;
3072
+ }
3073
+ const auto* address = envoy_config_endpoint_v3_Endpoint_address(endpoint);
3074
+ if (address == nullptr) {
3075
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
3076
+ absl::StrCat(cluster_name, ": Endpoint address field not set")
3077
+ .c_str()));
3078
+ resource_names_failed->insert(cluster_name);
3079
+ continue;
3080
+ }
3081
+ const auto* socket_address =
3082
+ envoy_config_core_v3_Address_socket_address(address);
3083
+ if (socket_address == nullptr) {
3084
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
3085
+ absl::StrCat(cluster_name, ": Address socket_address field not set")
3086
+ .c_str()));
3087
+ resource_names_failed->insert(cluster_name);
3088
+ continue;
3089
+ }
3090
+ if (envoy_config_core_v3_SocketAddress_resolver_name(socket_address)
3091
+ .size != 0) {
3092
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
3093
+ absl::StrCat(
3094
+ cluster_name,
3095
+ ": LOGICAL_DNS clusters must NOT have a custom resolver "
3096
+ "name set")
3097
+ .c_str()));
3098
+ resource_names_failed->insert(cluster_name);
3099
+ continue;
3100
+ }
3101
+ absl::string_view address_str = UpbStringToAbsl(
3102
+ envoy_config_core_v3_SocketAddress_address(socket_address));
3103
+ if (address_str.empty()) {
3104
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
3105
+ absl::StrCat(cluster_name, ": SocketAddress address field not set")
3106
+ .c_str()));
3107
+ resource_names_failed->insert(cluster_name);
3108
+ continue;
3109
+ }
3110
+ if (!envoy_config_core_v3_SocketAddress_has_port_value(socket_address)) {
3111
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
3112
+ absl::StrCat(cluster_name,
3113
+ ": SocketAddress port_value field not set")
3114
+ .c_str()));
3115
+ resource_names_failed->insert(cluster_name);
3116
+ continue;
3117
+ }
3118
+ cds_update.dns_hostname = JoinHostPort(
3119
+ address_str,
3120
+ envoy_config_core_v3_SocketAddress_port_value(socket_address));
2747
3121
  } else {
2748
3122
  if (envoy_config_cluster_v3_Cluster_has_cluster_type(cluster)) {
2749
3123
  const envoy_config_cluster_v3_Cluster_CustomClusterType*
@@ -2807,75 +3181,61 @@ grpc_error* CdsResponseParse(
2807
3181
  // Record ring hash lb config
2808
3182
  auto* ring_hash_config =
2809
3183
  envoy_config_cluster_v3_Cluster_ring_hash_lb_config(cluster);
2810
- if (ring_hash_config == nullptr) {
2811
- errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2812
- absl::StrCat(cluster_name,
2813
- ": ring hash lb config required but not present.")
2814
- .c_str()));
2815
- resource_names_failed->insert(cluster_name);
2816
- continue;
2817
- }
2818
- const google_protobuf_UInt64Value* max_ring_size =
2819
- envoy_config_cluster_v3_Cluster_RingHashLbConfig_maximum_ring_size(
2820
- ring_hash_config);
2821
- if (max_ring_size != nullptr) {
2822
- cds_update.max_ring_size =
2823
- google_protobuf_UInt64Value_value(max_ring_size);
2824
- if (cds_update.max_ring_size > 8388608 ||
2825
- cds_update.max_ring_size == 0) {
2826
- errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2827
- absl::StrCat(
2828
- cluster_name,
2829
- ": max_ring_size is not in the range of 1 to 8388608.")
2830
- .c_str()));
2831
- resource_names_failed->insert(cluster_name);
2832
- continue;
3184
+ if (ring_hash_config != nullptr) {
3185
+ const google_protobuf_UInt64Value* max_ring_size =
3186
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_maximum_ring_size(
3187
+ ring_hash_config);
3188
+ if (max_ring_size != nullptr) {
3189
+ cds_update.max_ring_size =
3190
+ google_protobuf_UInt64Value_value(max_ring_size);
3191
+ if (cds_update.max_ring_size > 8388608 ||
3192
+ cds_update.max_ring_size == 0) {
3193
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
3194
+ absl::StrCat(
3195
+ cluster_name,
3196
+ ": max_ring_size is not in the range of 1 to 8388608.")
3197
+ .c_str()));
3198
+ resource_names_failed->insert(cluster_name);
3199
+ continue;
3200
+ }
2833
3201
  }
2834
- }
2835
- const google_protobuf_UInt64Value* min_ring_size =
2836
- envoy_config_cluster_v3_Cluster_RingHashLbConfig_minimum_ring_size(
2837
- ring_hash_config);
2838
- if (min_ring_size != nullptr) {
2839
- cds_update.min_ring_size =
2840
- google_protobuf_UInt64Value_value(min_ring_size);
2841
- if (cds_update.min_ring_size > 8388608 ||
2842
- cds_update.min_ring_size == 0) {
2843
- errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2844
- absl::StrCat(
2845
- cluster_name,
2846
- ": min_ring_size is not in the range of 1 to 8388608.")
2847
- .c_str()));
2848
- resource_names_failed->insert(cluster_name);
2849
- continue;
3202
+ const google_protobuf_UInt64Value* min_ring_size =
3203
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_minimum_ring_size(
3204
+ ring_hash_config);
3205
+ if (min_ring_size != nullptr) {
3206
+ cds_update.min_ring_size =
3207
+ google_protobuf_UInt64Value_value(min_ring_size);
3208
+ if (cds_update.min_ring_size > 8388608 ||
3209
+ cds_update.min_ring_size == 0) {
3210
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
3211
+ absl::StrCat(
3212
+ cluster_name,
3213
+ ": min_ring_size is not in the range of 1 to 8388608.")
3214
+ .c_str()));
3215
+ resource_names_failed->insert(cluster_name);
3216
+ continue;
3217
+ }
3218
+ if (cds_update.min_ring_size > cds_update.max_ring_size) {
3219
+ errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
3220
+ absl::StrCat(
3221
+ cluster_name,
3222
+ ": min_ring_size cannot be greater than max_ring_size.")
3223
+ .c_str()));
3224
+ resource_names_failed->insert(cluster_name);
3225
+ continue;
3226
+ }
2850
3227
  }
2851
- if (cds_update.min_ring_size > cds_update.max_ring_size) {
3228
+ if (envoy_config_cluster_v3_Cluster_RingHashLbConfig_hash_function(
3229
+ ring_hash_config) !=
3230
+ envoy_config_cluster_v3_Cluster_RingHashLbConfig_XX_HASH) {
2852
3231
  errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2853
- absl::StrCat(
2854
- cluster_name,
2855
- ": min_ring_size cannot be greater than max_ring_size.")
3232
+ absl::StrCat(cluster_name,
3233
+ ": ring hash lb config has invalid hash function.")
2856
3234
  .c_str()));
2857
3235
  resource_names_failed->insert(cluster_name);
2858
3236
  continue;
2859
3237
  }
2860
3238
  }
2861
- if (envoy_config_cluster_v3_Cluster_RingHashLbConfig_hash_function(
2862
- ring_hash_config) ==
2863
- envoy_config_cluster_v3_Cluster_RingHashLbConfig_XX_HASH) {
2864
- cds_update.hash_function = XdsApi::CdsUpdate::HashFunction::XX_HASH;
2865
- } else if (
2866
- envoy_config_cluster_v3_Cluster_RingHashLbConfig_hash_function(
2867
- ring_hash_config) ==
2868
- envoy_config_cluster_v3_Cluster_RingHashLbConfig_MURMUR_HASH_2) {
2869
- cds_update.hash_function =
2870
- XdsApi::CdsUpdate::HashFunction::MURMUR_HASH_2;
2871
- } else {
2872
- errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2873
- absl::StrCat(cluster_name,
2874
- ": ring hash lb config has invalid hash function.")
2875
- .c_str()));
2876
- resource_names_failed->insert(cluster_name);
2877
- continue;
2878
- }
2879
3239
  } else {
2880
3240
  errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2881
3241
  absl::StrCat(cluster_name, ": LB policy is not supported.").c_str()));
@@ -2883,60 +3243,21 @@ grpc_error* CdsResponseParse(
2883
3243
  continue;
2884
3244
  }
2885
3245
  if (XdsSecurityEnabled()) {
2886
- // Record Upstream tls context
2887
3246
  auto* transport_socket =
2888
3247
  envoy_config_cluster_v3_Cluster_transport_socket(cluster);
2889
3248
  if (transport_socket != nullptr) {
2890
- absl::string_view name = UpbStringToAbsl(
2891
- envoy_config_core_v3_TransportSocket_name(transport_socket));
2892
- if (name == "envoy.transport_sockets.tls") {
2893
- auto* typed_config =
2894
- envoy_config_core_v3_TransportSocket_typed_config(
2895
- transport_socket);
2896
- if (typed_config != nullptr) {
2897
- const upb_strview encoded_upstream_tls_context =
2898
- google_protobuf_Any_value(typed_config);
2899
- auto* upstream_tls_context =
2900
- envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_parse(
2901
- encoded_upstream_tls_context.data,
2902
- encoded_upstream_tls_context.size, context.arena);
2903
- if (upstream_tls_context == nullptr) {
2904
- errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2905
- absl::StrCat(cluster_name,
2906
- ": Can't decode upstream tls context.")
2907
- .c_str()));
2908
- resource_names_failed->insert(cluster_name);
2909
- continue;
2910
- }
2911
- auto* common_tls_context =
2912
- envoy_extensions_transport_sockets_tls_v3_UpstreamTlsContext_common_tls_context(
2913
- upstream_tls_context);
2914
- if (common_tls_context != nullptr) {
2915
- grpc_error* error = CommonTlsContextParse(
2916
- common_tls_context, &cds_update.common_tls_context);
2917
- if (error != GRPC_ERROR_NONE) {
2918
- errors.push_back(grpc_error_add_child(
2919
- GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2920
- absl::StrCat(cluster_name, ": error in TLS context")
2921
- .c_str()),
2922
- error));
2923
- resource_names_failed->insert(cluster_name);
2924
- continue;
2925
- }
2926
- }
2927
- }
2928
- if (cds_update.common_tls_context.combined_validation_context
2929
- .validation_context_certificate_provider_instance
2930
- .instance_name.empty()) {
2931
- errors.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(
2932
- absl::StrCat(cluster_name,
2933
- "TLS configuration provided but no "
2934
- "validation_context_certificate_provider_instance "
2935
- "found.")
2936
- .c_str()));
2937
- resource_names_failed->insert(cluster_name);
2938
- continue;
2939
- }
3249
+ grpc_error_handle error = UpstreamTlsContextParse(
3250
+ context, transport_socket, &cds_update.common_tls_context);
3251
+ if (error != GRPC_ERROR_NONE) {
3252
+ errors.push_back(grpc_error_add_child(
3253
+ GRPC_ERROR_CREATE_FROM_COPIED_STRING(
3254
+ absl::StrCat(
3255
+ "Error parsing security configuration for cluster: ",
3256
+ cluster_name)
3257
+ .c_str()),
3258
+ error));
3259
+ resource_names_failed->insert(cluster_name);
3260
+ continue;
2940
3261
  }
2941
3262
  }
2942
3263
  }
@@ -2983,7 +3304,7 @@ grpc_error* CdsResponseParse(
2983
3304
  return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing CDS response", &errors);
2984
3305
  }
2985
3306
 
2986
- grpc_error* ServerAddressParseAndAppend(
3307
+ grpc_error_handle ServerAddressParseAndAppend(
2987
3308
  const envoy_config_endpoint_v3_LbEndpoint* lb_endpoint,
2988
3309
  ServerAddressList* list) {
2989
3310
  // If health_status is not HEALTHY or UNKNOWN, skip this endpoint.
@@ -3006,17 +3327,32 @@ grpc_error* ServerAddressParseAndAppend(
3006
3327
  if (GPR_UNLIKELY(port >> 16) != 0) {
3007
3328
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid port.");
3008
3329
  }
3330
+ // Find load_balancing_weight for the endpoint.
3331
+ const google_protobuf_UInt32Value* load_balancing_weight =
3332
+ envoy_config_endpoint_v3_LbEndpoint_load_balancing_weight(lb_endpoint);
3333
+ const int32_t weight =
3334
+ load_balancing_weight != nullptr
3335
+ ? google_protobuf_UInt32Value_value(load_balancing_weight)
3336
+ : 500;
3337
+ if (weight == 0) {
3338
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
3339
+ "Invalid endpoint weight of 0.");
3340
+ }
3009
3341
  // Populate grpc_resolved_address.
3010
3342
  grpc_resolved_address addr;
3011
- grpc_error* error =
3012
- grpc_string_to_sockaddr_new(&addr, address_str.c_str(), port);
3343
+ grpc_error_handle error =
3344
+ grpc_string_to_sockaddr(&addr, address_str.c_str(), port);
3013
3345
  if (error != GRPC_ERROR_NONE) return error;
3014
3346
  // Append the address to the list.
3015
- list->emplace_back(addr, nullptr);
3347
+ std::map<const char*, std::unique_ptr<ServerAddress::AttributeInterface>>
3348
+ attributes;
3349
+ attributes[ServerAddressWeightAttribute::kServerAddressWeightAttributeKey] =
3350
+ absl::make_unique<ServerAddressWeightAttribute>(weight);
3351
+ list->emplace_back(addr, nullptr, std::move(attributes));
3016
3352
  return GRPC_ERROR_NONE;
3017
3353
  }
3018
3354
 
3019
- grpc_error* LocalityParse(
3355
+ grpc_error_handle LocalityParse(
3020
3356
  const envoy_config_endpoint_v3_LocalityLbEndpoints* locality_lb_endpoints,
3021
3357
  XdsApi::EdsUpdate::Priority::Locality* output_locality, size_t* priority) {
3022
3358
  // Parse LB weight.
@@ -3050,7 +3386,7 @@ grpc_error* LocalityParse(
3050
3386
  envoy_config_endpoint_v3_LocalityLbEndpoints_lb_endpoints(
3051
3387
  locality_lb_endpoints, &size);
3052
3388
  for (size_t i = 0; i < size; ++i) {
3053
- grpc_error* error = ServerAddressParseAndAppend(
3389
+ grpc_error_handle error = ServerAddressParseAndAppend(
3054
3390
  lb_endpoints[i], &output_locality->endpoints);
3055
3391
  if (error != GRPC_ERROR_NONE) return error;
3056
3392
  }
@@ -3060,7 +3396,7 @@ grpc_error* LocalityParse(
3060
3396
  return GRPC_ERROR_NONE;
3061
3397
  }
3062
3398
 
3063
- grpc_error* DropParseAndAppend(
3399
+ grpc_error_handle DropParseAndAppend(
3064
3400
  const envoy_config_endpoint_v3_ClusterLoadAssignment_Policy_DropOverload*
3065
3401
  drop_overload,
3066
3402
  XdsApi::EdsUpdate::DropConfig* drop_config) {
@@ -3099,13 +3435,13 @@ grpc_error* DropParseAndAppend(
3099
3435
  return GRPC_ERROR_NONE;
3100
3436
  }
3101
3437
 
3102
- grpc_error* EdsResponseParse(
3438
+ grpc_error_handle EdsResponseParse(
3103
3439
  const EncodingContext& context,
3104
3440
  const envoy_service_discovery_v3_DiscoveryResponse* response,
3105
3441
  const std::set<absl::string_view>& expected_eds_service_names,
3106
3442
  XdsApi::EdsUpdateMap* eds_update_map,
3107
3443
  std::set<std::string>* resource_names_failed) {
3108
- std::vector<grpc_error*> errors;
3444
+ std::vector<grpc_error_handle> errors;
3109
3445
  // Get the resources from the response.
3110
3446
  size_t size;
3111
3447
  const google_protobuf_Any* const* resources =
@@ -3162,7 +3498,7 @@ grpc_error* EdsResponseParse(
3162
3498
  const envoy_config_endpoint_v3_LocalityLbEndpoints* const* endpoints =
3163
3499
  envoy_config_endpoint_v3_ClusterLoadAssignment_endpoints(
3164
3500
  cluster_load_assignment, &locality_size);
3165
- grpc_error* error = GRPC_ERROR_NONE;
3501
+ grpc_error_handle error = GRPC_ERROR_NONE;
3166
3502
  for (size_t j = 0; j < locality_size; ++j) {
3167
3503
  size_t priority;
3168
3504
  XdsApi::EdsUpdate::Priority::Locality locality;
@@ -3257,8 +3593,12 @@ XdsApi::AdsParseResult XdsApi::ParseAdsResponse(
3257
3593
  const std::set<absl::string_view>& expected_eds_service_names) {
3258
3594
  AdsParseResult result;
3259
3595
  upb::Arena arena;
3260
- const EncodingContext context = {client_, tracer_, symtab_.ptr(), arena.ptr(),
3261
- server.ShouldUseV3()};
3596
+ const EncodingContext context = {client_,
3597
+ tracer_,
3598
+ symtab_.ptr(),
3599
+ arena.ptr(),
3600
+ server.ShouldUseV3(),
3601
+ certificate_provider_definition_map_};
3262
3602
  // Decode the response.
3263
3603
  const envoy_service_discovery_v3_DiscoveryResponse* response =
3264
3604
  envoy_service_discovery_v3_DiscoveryResponse_parse(
@@ -3345,8 +3685,12 @@ grpc_slice SerializeLrsRequest(
3345
3685
  grpc_slice XdsApi::CreateLrsInitialRequest(
3346
3686
  const XdsBootstrap::XdsServer& server) {
3347
3687
  upb::Arena arena;
3348
- const EncodingContext context = {client_, tracer_, symtab_.ptr(), arena.ptr(),
3349
- server.ShouldUseV3()};
3688
+ const EncodingContext context = {client_,
3689
+ tracer_,
3690
+ symtab_.ptr(),
3691
+ arena.ptr(),
3692
+ server.ShouldUseV3(),
3693
+ certificate_provider_definition_map_};
3350
3694
  // Create a request.
3351
3695
  envoy_service_load_stats_v3_LoadStatsRequest* request =
3352
3696
  envoy_service_load_stats_v3_LoadStatsRequest_new(arena.ptr());
@@ -3354,7 +3698,8 @@ grpc_slice XdsApi::CreateLrsInitialRequest(
3354
3698
  envoy_config_core_v3_Node* node_msg =
3355
3699
  envoy_service_load_stats_v3_LoadStatsRequest_mutable_node(request,
3356
3700
  arena.ptr());
3357
- PopulateNode(context, node_, build_version_, user_agent_name_, node_msg);
3701
+ PopulateNode(context, node_, build_version_, user_agent_name_,
3702
+ user_agent_version_, node_msg);
3358
3703
  envoy_config_core_v3_Node_add_client_features(
3359
3704
  node_msg, upb_strview_makez("envoy.lrs.supports_send_all_clusters"),
3360
3705
  arena.ptr());
@@ -3415,8 +3760,9 @@ void LocalityStatsPopulate(
3415
3760
  grpc_slice XdsApi::CreateLrsRequest(
3416
3761
  ClusterLoadReportMap cluster_load_report_map) {
3417
3762
  upb::Arena arena;
3418
- const EncodingContext context = {client_, tracer_, symtab_.ptr(), arena.ptr(),
3419
- false};
3763
+ const EncodingContext context = {
3764
+ client_, tracer_, symtab_.ptr(),
3765
+ arena.ptr(), false, certificate_provider_definition_map_};
3420
3766
  // Create a request.
3421
3767
  envoy_service_load_stats_v3_LoadStatsRequest* request =
3422
3768
  envoy_service_load_stats_v3_LoadStatsRequest_new(arena.ptr());
@@ -3476,10 +3822,10 @@ grpc_slice XdsApi::CreateLrsRequest(
3476
3822
  return SerializeLrsRequest(context, request);
3477
3823
  }
3478
3824
 
3479
- grpc_error* XdsApi::ParseLrsResponse(const grpc_slice& encoded_response,
3480
- bool* send_all_clusters,
3481
- std::set<std::string>* cluster_names,
3482
- grpc_millis* load_reporting_interval) {
3825
+ grpc_error_handle XdsApi::ParseLrsResponse(
3826
+ const grpc_slice& encoded_response, bool* send_all_clusters,
3827
+ std::set<std::string>* cluster_names,
3828
+ grpc_millis* load_reporting_interval) {
3483
3829
  upb::Arena arena;
3484
3830
  // Decode the response.
3485
3831
  const envoy_service_load_stats_v3_LoadStatsResponse* decoded_response =
@@ -3749,9 +4095,11 @@ std::string XdsApi::AssembleClientConfig(
3749
4095
  // Fill-in the node information
3750
4096
  auto* node = envoy_service_status_v3_ClientConfig_mutable_node(client_config,
3751
4097
  arena.ptr());
3752
- const EncodingContext context = {client_, tracer_, symtab_.ptr(), arena.ptr(),
3753
- true};
3754
- PopulateNode(context, node_, build_version_, user_agent_name_, node);
4098
+ const EncodingContext context = {
4099
+ client_, tracer_, symtab_.ptr(),
4100
+ arena.ptr(), true, certificate_provider_definition_map_};
4101
+ PopulateNode(context, node_, build_version_, user_agent_name_,
4102
+ user_agent_version_, node);
3755
4103
  // Dump each xDS-type config into PerXdsConfig
3756
4104
  for (auto& p : resource_type_metadata_map) {
3757
4105
  absl::string_view type_url = p.first;