grpc 1.48.0 → 1.49.0.pre1

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

Potentially problematic release.


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

Files changed (715) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +104 -41
  3. data/include/grpc/event_engine/event_engine.h +19 -16
  4. data/include/grpc/impl/codegen/grpc_types.h +3 -8
  5. data/include/grpc/impl/codegen/port_platform.h +0 -8
  6. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +3 -3
  7. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +2 -2
  8. data/src/core/ext/filters/client_channel/client_channel.cc +117 -200
  9. data/src/core/ext/filters/client_channel/client_channel.h +15 -8
  10. data/src/core/ext/filters/client_channel/client_channel_factory.cc +0 -29
  11. data/src/core/ext/filters/client_channel/client_channel_factory.h +2 -10
  12. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  13. data/src/core/ext/filters/client_channel/config_selector.h +12 -4
  14. data/src/core/ext/filters/client_channel/connector.h +4 -5
  15. data/src/core/ext/filters/client_channel/http_proxy.cc +53 -65
  16. data/src/core/ext/filters/client_channel/http_proxy.h +12 -9
  17. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +14 -12
  18. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +6 -6
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +100 -124
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +12 -3
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +5 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +1 -0
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -2
  24. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  25. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +169 -63
  26. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +25 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +15 -19
  28. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +66 -78
  29. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +44 -44
  30. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +6 -5
  31. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +65 -77
  32. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +15 -14
  33. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +19 -14
  34. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +60 -67
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +40 -49
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +81 -97
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +53 -61
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +171 -102
  39. data/src/core/ext/filters/client_channel/proxy_mapper.h +13 -14
  40. data/src/core/ext/filters/client_channel/proxy_mapper_registry.cc +19 -16
  41. data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +8 -7
  42. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +4 -8
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +431 -145
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +170 -99
  45. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +20 -7
  46. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +17 -15
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +7 -17
  48. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +11 -0
  49. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +13 -14
  50. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
  51. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +5 -6
  52. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -13
  53. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +162 -165
  54. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +37 -30
  55. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +7 -10
  56. data/src/core/ext/filters/client_channel/retry_filter.cc +0 -7
  57. data/src/core/ext/filters/client_channel/retry_service_config.cc +30 -19
  58. data/src/core/ext/filters/client_channel/retry_service_config.h +6 -9
  59. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +6 -7
  60. data/src/core/ext/filters/client_channel/subchannel.cc +49 -89
  61. data/src/core/ext/filters/client_channel/subchannel.h +8 -8
  62. data/src/core/ext/filters/client_channel/subchannel_interface_internal.h +1 -1
  63. data/src/core/ext/filters/client_channel/subchannel_pool_interface.cc +6 -76
  64. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +16 -25
  65. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +3 -4
  66. data/src/core/ext/filters/deadline/deadline_filter.cc +6 -6
  67. data/src/core/ext/filters/deadline/deadline_filter.h +2 -3
  68. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -3
  69. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +1 -1
  70. data/src/core/ext/filters/fault_injection/service_config_parser.cc +17 -12
  71. data/src/core/ext/filters/fault_injection/service_config_parser.h +4 -5
  72. data/src/core/ext/filters/http/client/http_client_filter.cc +2 -3
  73. data/src/core/ext/filters/http/client/http_client_filter.h +1 -1
  74. data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
  75. data/src/core/ext/filters/http/client_authority_filter.h +1 -1
  76. data/src/core/ext/filters/http/server/http_server_filter.cc +2 -3
  77. data/src/core/ext/filters/http/server/http_server_filter.h +1 -1
  78. data/src/core/ext/filters/message_size/message_size_filter.cc +13 -7
  79. data/src/core/ext/filters/message_size/message_size_filter.h +3 -6
  80. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +16 -12
  81. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -6
  82. data/src/core/ext/filters/server_config_selector/server_config_selector.h +5 -0
  83. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +3 -5
  84. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +35 -62
  85. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +62 -89
  86. data/src/core/ext/transport/chttp2/server/chttp2_server.h +4 -6
  87. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +130 -165
  88. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -2
  89. data/src/core/ext/transport/chttp2/transport/flow_control.cc +67 -2
  90. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
  91. data/src/core/ext/transport/chttp2/transport/hpack_constants.h +7 -1
  92. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +25 -8
  93. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -0
  94. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +0 -1
  95. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +8 -2
  96. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -10
  97. data/src/core/ext/transport/chttp2/transport/internal.h +2 -1
  98. data/src/core/ext/transport/inproc/inproc_transport.cc +40 -74
  99. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.c +5 -5
  100. data/src/core/ext/upb-generated/envoy/admin/v3/certs.upb.h +30 -10
  101. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.c +4 -4
  102. data/src/core/ext/upb-generated/envoy/admin/v3/clusters.upb.h +24 -8
  103. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.c +8 -327
  104. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump.upb.h +83 -1723
  105. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.c +352 -0
  106. data/src/core/ext/upb-generated/envoy/admin/v3/config_dump_shared.upb.h +1768 -0
  107. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.c +2 -2
  108. data/src/core/ext/upb-generated/envoy/admin/v3/init_dump.upb.h +12 -4
  109. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.c +6 -4
  110. data/src/core/ext/upb-generated/envoy/admin/v3/listeners.upb.h +33 -4
  111. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.c +1 -1
  112. data/src/core/ext/upb-generated/envoy/admin/v3/memory.upb.h +6 -2
  113. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.c +1 -1
  114. data/src/core/ext/upb-generated/envoy/admin/v3/metrics.upb.h +6 -2
  115. data/src/core/ext/upb-generated/envoy/admin/v3/mutex_stats.upb.h +6 -2
  116. data/src/core/ext/upb-generated/envoy/admin/v3/server_info.upb.h +12 -4
  117. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.c +1 -1
  118. data/src/core/ext/upb-generated/envoy/admin/v3/tap.upb.h +6 -2
  119. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +1 -1
  120. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +7 -3
  121. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.c +14 -14
  122. data/src/core/ext/upb-generated/envoy/config/accesslog/v3/accesslog.upb.h +90 -30
  123. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.c +21 -19
  124. data/src/core/ext/upb-generated/envoy/config/bootstrap/v3/bootstrap.upb.h +124 -34
  125. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.c +3 -3
  126. data/src/core/ext/upb-generated/envoy/config/cluster/v3/circuit_breaker.upb.h +18 -6
  127. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.c +23 -22
  128. data/src/core/ext/upb-generated/envoy/config/cluster/v3/cluster.upb.h +153 -48
  129. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.c +1 -1
  130. data/src/core/ext/upb-generated/envoy/config/cluster/v3/filter.upb.h +6 -2
  131. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.c +1 -1
  132. data/src/core/ext/upb-generated/envoy/config/cluster/v3/outlier_detection.upb.h +6 -2
  133. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.c +11 -11
  134. data/src/core/ext/upb-generated/envoy/config/common/matcher/v3/matcher.upb.h +84 -28
  135. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.c +7 -7
  136. data/src/core/ext/upb-generated/envoy/config/core/v3/address.upb.h +42 -14
  137. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.c +1 -1
  138. data/src/core/ext/upb-generated/envoy/config/core/v3/backoff.upb.h +6 -2
  139. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.c +25 -23
  140. data/src/core/ext/upb-generated/envoy/config/core/v3/base.upb.h +156 -48
  141. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.c +7 -7
  142. data/src/core/ext/upb-generated/envoy/config/core/v3/config_source.upb.h +42 -14
  143. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.c +1 -1
  144. data/src/core/ext/upb-generated/envoy/config/core/v3/event_service_config.upb.h +6 -2
  145. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.c +1 -1
  146. data/src/core/ext/upb-generated/envoy/config/core/v3/extension.upb.h +6 -2
  147. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.c +2 -2
  148. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_method_list.upb.h +12 -4
  149. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.c +12 -12
  150. data/src/core/ext/upb-generated/envoy/config/core/v3/grpc_service.upb.h +78 -26
  151. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.c +9 -9
  152. data/src/core/ext/upb-generated/envoy/config/core/v3/health_check.upb.h +54 -18
  153. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.c +1 -1
  154. data/src/core/ext/upb-generated/envoy/config/core/v3/http_uri.upb.h +6 -2
  155. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.c +21 -20
  156. data/src/core/ext/upb-generated/envoy/config/core/v3/protocol.upb.h +117 -44
  157. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.c +1 -1
  158. data/src/core/ext/upb-generated/envoy/config/core/v3/proxy_protocol.upb.h +6 -2
  159. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.c +2 -2
  160. data/src/core/ext/upb-generated/envoy/config/core/v3/resolver.upb.h +12 -4
  161. data/src/core/ext/upb-generated/envoy/config/core/v3/socket_option.upb.h +6 -2
  162. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.c +1 -1
  163. data/src/core/ext/upb-generated/envoy/config/core/v3/substitution_format_string.upb.h +6 -2
  164. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.c +1 -1
  165. data/src/core/ext/upb-generated/envoy/config/core/v3/udp_socket_config.upb.h +6 -2
  166. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.c +3 -3
  167. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint.upb.h +18 -6
  168. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.c +5 -5
  169. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/endpoint_components.upb.h +36 -12
  170. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.c +3 -3
  171. data/src/core/ext/upb-generated/envoy/config/endpoint/v3/load_report.upb.h +30 -10
  172. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.c +1 -1
  173. data/src/core/ext/upb-generated/envoy/config/listener/v3/api_listener.upb.h +6 -2
  174. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.c +37 -13
  175. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener.upb.h +170 -15
  176. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.c +5 -5
  177. data/src/core/ext/upb-generated/envoy/config/listener/v3/listener_components.upb.h +42 -14
  178. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.c +1 -1
  179. data/src/core/ext/upb-generated/envoy/config/listener/v3/quic_config.upb.h +6 -2
  180. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.c +7 -4
  181. data/src/core/ext/upb-generated/envoy/config/listener/v3/udp_listener_config.upb.h +36 -4
  182. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.c +1 -1
  183. data/src/core/ext/upb-generated/envoy/config/metrics/v3/metrics_service.upb.h +6 -2
  184. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.c +6 -6
  185. data/src/core/ext/upb-generated/envoy/config/metrics/v3/stats.upb.h +48 -16
  186. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.c +8 -8
  187. data/src/core/ext/upb-generated/envoy/config/overload/v3/overload.upb.h +54 -18
  188. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.c +21 -9
  189. data/src/core/ext/upb-generated/envoy/config/rbac/v3/rbac.upb.h +100 -14
  190. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.c +7 -22
  191. data/src/core/ext/upb-generated/envoy/config/route/v3/route.upb.h +36 -77
  192. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.c +121 -76
  193. data/src/core/ext/upb-generated/envoy/config/route/v3/route_components.upb.h +647 -163
  194. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.c +3 -3
  195. data/src/core/ext/upb-generated/envoy/config/route/v3/scoped_route.upb.h +18 -6
  196. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.c +34 -15
  197. data/src/core/ext/upb-generated/envoy/config/tap/v3/common.upb.h +161 -22
  198. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.c +1 -1
  199. data/src/core/ext/upb-generated/envoy/config/trace/v3/datadog.upb.h +6 -2
  200. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.c +1 -1
  201. data/src/core/ext/upb-generated/envoy/config/trace/v3/dynamic_ot.upb.h +6 -2
  202. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.c +2 -2
  203. data/src/core/ext/upb-generated/envoy/config/trace/v3/http_tracer.upb.h +12 -4
  204. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.c +1 -1
  205. data/src/core/ext/upb-generated/envoy/config/trace/v3/lightstep.upb.h +6 -2
  206. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.c +1 -1
  207. data/src/core/ext/upb-generated/envoy/config/trace/v3/opencensus.upb.h +6 -2
  208. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.c +46 -0
  209. data/src/core/ext/upb-generated/envoy/config/trace/v3/opentelemetry.upb.h +98 -0
  210. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.c +1 -1
  211. data/src/core/ext/upb-generated/envoy/config/trace/v3/service.upb.h +6 -2
  212. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.c +2 -2
  213. data/src/core/ext/upb-generated/envoy/config/trace/v3/skywalking.upb.h +12 -4
  214. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.c +1 -0
  215. data/src/core/ext/upb-generated/envoy/config/trace/v3/trace.upb.h +1 -0
  216. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.c +2 -2
  217. data/src/core/ext/upb-generated/envoy/config/trace/v3/xray.upb.h +12 -4
  218. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.c +1 -1
  219. data/src/core/ext/upb-generated/envoy/config/trace/v3/zipkin.upb.h +6 -2
  220. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.c +1 -1
  221. data/src/core/ext/upb-generated/envoy/extensions/clusters/aggregate/v3/cluster.upb.h +6 -2
  222. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.c +2 -2
  223. data/src/core/ext/upb-generated/envoy/extensions/filters/common/fault/v3/fault.upb.h +30 -10
  224. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.c +2 -2
  225. data/src/core/ext/upb-generated/envoy/extensions/filters/http/fault/v3/fault.upb.h +18 -6
  226. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +11 -4
  227. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +58 -4
  228. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.c +1 -1
  229. data/src/core/ext/upb-generated/envoy/extensions/filters/http/router/v3/router.upb.h +6 -2
  230. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.c +35 -27
  231. data/src/core/ext/upb-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upb.h +177 -52
  232. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/ring_hash/v3/ring_hash.upb.h +6 -2
  233. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.c +1 -1
  234. data/src/core/ext/upb-generated/envoy/extensions/load_balancing_policies/wrr_locality/v3/wrr_locality.upb.h +6 -2
  235. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.c +10 -8
  236. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/common.upb.h +66 -14
  237. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.c +3 -3
  238. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/secret.upb.h +18 -6
  239. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.c +5 -5
  240. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls.upb.h +42 -14
  241. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.c +2 -2
  242. data/src/core/ext/upb-generated/envoy/extensions/transport_sockets/tls/v3/tls_spiffe_validator_config.upb.h +12 -4
  243. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.c +1 -1
  244. data/src/core/ext/upb-generated/envoy/service/discovery/v3/ads.upb.h +6 -2
  245. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.c +131 -16
  246. data/src/core/ext/upb-generated/envoy/service/discovery/v3/discovery.upb.h +632 -12
  247. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.c +2 -2
  248. data/src/core/ext/upb-generated/envoy/service/load_stats/v3/lrs.upb.h +12 -4
  249. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.c +5 -5
  250. data/src/core/ext/upb-generated/envoy/service/status/v3/csds.upb.h +30 -10
  251. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.c +1 -1
  252. data/src/core/ext/upb-generated/envoy/type/http/v3/cookie.upb.h +6 -2
  253. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.c +4 -4
  254. data/src/core/ext/upb-generated/envoy/type/http/v3/path_transformation.upb.h +24 -8
  255. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.c +4 -4
  256. data/src/core/ext/upb-generated/envoy/type/matcher/v3/http_inputs.upb.h +24 -8
  257. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.c +2 -2
  258. data/src/core/ext/upb-generated/envoy/type/matcher/v3/metadata.upb.h +12 -4
  259. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.c +1 -1
  260. data/src/core/ext/upb-generated/envoy/type/matcher/v3/node.upb.h +6 -2
  261. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.c +1 -1
  262. data/src/core/ext/upb-generated/envoy/type/matcher/v3/number.upb.h +6 -2
  263. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.c +1 -1
  264. data/src/core/ext/upb-generated/envoy/type/matcher/v3/path.upb.h +6 -2
  265. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.c +3 -3
  266. data/src/core/ext/upb-generated/envoy/type/matcher/v3/regex.upb.h +18 -6
  267. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.c +1 -1
  268. data/src/core/ext/upb-generated/envoy/type/matcher/v3/string.upb.h +12 -4
  269. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.c +2 -2
  270. data/src/core/ext/upb-generated/envoy/type/matcher/v3/struct.upb.h +12 -4
  271. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.c +3 -3
  272. data/src/core/ext/upb-generated/envoy/type/matcher/v3/value.upb.h +18 -6
  273. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.c +7 -7
  274. data/src/core/ext/upb-generated/envoy/type/metadata/v3/metadata.upb.h +42 -14
  275. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.c +5 -5
  276. data/src/core/ext/upb-generated/envoy/type/tracing/v3/custom_tag.upb.h +30 -10
  277. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.c +3 -3
  278. data/src/core/ext/upb-generated/envoy/type/v3/hash_policy.upb.h +18 -6
  279. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.c +1 -1
  280. data/src/core/ext/upb-generated/envoy/type/v3/http_status.upb.h +6 -2
  281. data/src/core/ext/upb-generated/envoy/type/v3/percent.upb.h +12 -4
  282. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.c +2 -2
  283. data/src/core/ext/upb-generated/envoy/type/v3/range.upb.h +18 -6
  284. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.c +63 -0
  285. data/src/core/ext/upb-generated/envoy/type/v3/ratelimit_strategy.upb.h +202 -0
  286. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.c +1 -1
  287. data/src/core/ext/upb-generated/envoy/type/v3/semantic_version.upb.h +6 -2
  288. data/src/core/ext/upb-generated/envoy/type/v3/token_bucket.upb.h +6 -2
  289. data/src/core/ext/upb-generated/google/api/annotations.upb.h +1 -1
  290. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.c +11 -11
  291. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/checked.upb.h +66 -22
  292. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.c +9 -9
  293. data/src/core/ext/upb-generated/google/api/expr/v1alpha1/syntax.upb.h +72 -24
  294. data/src/core/ext/upb-generated/google/api/http.upb.c +3 -3
  295. data/src/core/ext/upb-generated/google/api/http.upb.h +18 -6
  296. data/src/core/ext/upb-generated/google/api/httpbody.upb.c +1 -1
  297. data/src/core/ext/upb-generated/google/api/httpbody.upb.h +6 -2
  298. data/src/core/ext/upb-generated/google/protobuf/any.upb.c +1 -1
  299. data/src/core/ext/upb-generated/google/protobuf/any.upb.h +6 -2
  300. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +44 -43
  301. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +177 -55
  302. data/src/core/ext/upb-generated/google/protobuf/duration.upb.c +1 -1
  303. data/src/core/ext/upb-generated/google/protobuf/duration.upb.h +6 -2
  304. data/src/core/ext/upb-generated/google/protobuf/empty.upb.c +1 -1
  305. data/src/core/ext/upb-generated/google/protobuf/empty.upb.h +6 -2
  306. data/src/core/ext/upb-generated/google/protobuf/struct.upb.c +2 -2
  307. data/src/core/ext/upb-generated/google/protobuf/struct.upb.h +18 -6
  308. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.c +1 -1
  309. data/src/core/ext/upb-generated/google/protobuf/timestamp.upb.h +6 -2
  310. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.c +6 -6
  311. data/src/core/ext/upb-generated/google/protobuf/wrappers.upb.h +54 -18
  312. data/src/core/ext/upb-generated/google/rpc/status.upb.c +1 -1
  313. data/src/core/ext/upb-generated/google/rpc/status.upb.h +6 -2
  314. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.c +2 -2
  315. data/src/core/ext/upb-generated/opencensus/proto/trace/v1/trace_config.upb.h +24 -8
  316. data/src/core/ext/upb-generated/src/proto/grpc/gcp/altscontext.upb.h +6 -2
  317. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +7 -7
  318. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +60 -20
  319. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.c +1 -1
  320. data/src/core/ext/upb-generated/src/proto/grpc/gcp/transport_security_common.upb.h +12 -4
  321. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.c +2 -2
  322. data/src/core/ext/upb-generated/src/proto/grpc/health/v1/health.upb.h +12 -4
  323. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +6 -6
  324. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +54 -18
  325. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.c +2 -2
  326. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls.upb.h +12 -4
  327. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.c +7 -7
  328. data/src/core/ext/upb-generated/src/proto/grpc/lookup/v1/rls_config.upb.h +42 -14
  329. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +3 -3
  330. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +23 -11
  331. data/src/core/ext/upb-generated/udpa/annotations/security.upb.c +1 -1
  332. data/src/core/ext/upb-generated/udpa/annotations/security.upb.h +7 -3
  333. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +7 -3
  334. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.c +1 -1
  335. data/src/core/ext/upb-generated/udpa/annotations/versioning.upb.h +7 -3
  336. data/src/core/ext/upb-generated/validate/validate.upb.c +22 -22
  337. data/src/core/ext/upb-generated/validate/validate.upb.h +139 -47
  338. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.c +3 -3
  339. data/src/core/ext/upb-generated/xds/annotations/v3/migrate.upb.h +23 -11
  340. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.c +1 -1
  341. data/src/core/ext/upb-generated/xds/annotations/v3/security.upb.h +7 -3
  342. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.c +3 -3
  343. data/src/core/ext/upb-generated/xds/annotations/v3/status.upb.h +27 -11
  344. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.c +1 -1
  345. data/src/core/ext/upb-generated/xds/annotations/v3/versioning.upb.h +7 -3
  346. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.c +1 -1
  347. data/src/core/ext/upb-generated/xds/core/v3/authority.upb.h +6 -2
  348. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.c +2 -2
  349. data/src/core/ext/upb-generated/xds/core/v3/collection_entry.upb.h +12 -4
  350. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.c +1 -1
  351. data/src/core/ext/upb-generated/xds/core/v3/context_params.upb.h +6 -2
  352. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.c +1 -1
  353. data/src/core/ext/upb-generated/xds/core/v3/extension.upb.h +6 -2
  354. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.c +1 -1
  355. data/src/core/ext/upb-generated/xds/core/v3/resource.upb.h +6 -2
  356. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.c +1 -1
  357. data/src/core/ext/upb-generated/xds/core/v3/resource_locator.upb.h +12 -4
  358. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.c +1 -1
  359. data/src/core/ext/upb-generated/xds/core/v3/resource_name.upb.h +6 -2
  360. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +6 -2
  361. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +1 -1
  362. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.h +6 -2
  363. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.c +6 -6
  364. data/src/core/ext/upb-generated/xds/type/matcher/v3/matcher.upb.h +54 -18
  365. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.c +2 -2
  366. data/src/core/ext/upb-generated/xds/type/matcher/v3/regex.upb.h +12 -4
  367. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.c +1 -1
  368. data/src/core/ext/upb-generated/xds/type/matcher/v3/string.upb.h +12 -4
  369. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +1 -1
  370. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.h +6 -2
  371. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.c +67 -274
  372. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump.upbdefs.h +0 -85
  373. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.c +256 -0
  374. data/src/core/ext/upbdefs-generated/envoy/admin/v3/config_dump_shared.upbdefs.h +115 -0
  375. data/src/core/ext/upbdefs-generated/envoy/admin/v3/listeners.upbdefs.c +14 -11
  376. data/src/core/ext/upbdefs-generated/envoy/config/accesslog/v3/accesslog.upbdefs.c +107 -107
  377. data/src/core/ext/upbdefs-generated/envoy/config/bootstrap/v3/bootstrap.upbdefs.c +191 -187
  378. data/src/core/ext/upbdefs-generated/envoy/config/cluster/v3/cluster.upbdefs.c +156 -154
  379. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/base.upbdefs.c +186 -183
  380. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/protocol.upbdefs.c +136 -134
  381. data/src/core/ext/upbdefs-generated/envoy/config/core/v3/substitution_format_string.upbdefs.c +16 -16
  382. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.c +162 -139
  383. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/listener.upbdefs.h +5 -0
  384. data/src/core/ext/upbdefs-generated/envoy/config/listener/v3/udp_listener_config.upbdefs.c +39 -31
  385. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +12 -8
  386. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +5 -0
  387. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.c +72 -75
  388. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route.upbdefs.h +0 -5
  389. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.c +713 -670
  390. data/src/core/ext/upbdefs-generated/envoy/config/route/v3/route_components.upbdefs.h +10 -0
  391. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.c +150 -139
  392. data/src/core/ext/upbdefs-generated/envoy/config/tap/v3/common.upbdefs.h +5 -0
  393. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.c +47 -0
  394. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/opentelemetry.upbdefs.h +35 -0
  395. data/src/core/ext/upbdefs-generated/envoy/config/trace/v3/trace.upbdefs.c +16 -12
  396. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +46 -25
  397. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/network/http_connection_manager/v3/http_connection_manager.upbdefs.c +477 -466
  398. data/src/core/ext/upbdefs-generated/envoy/extensions/transport_sockets/tls/v3/common.upbdefs.c +21 -18
  399. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.c +153 -84
  400. data/src/core/ext/upbdefs-generated/envoy/service/discovery/v3/discovery.upbdefs.h +35 -0
  401. data/src/core/ext/upbdefs-generated/envoy/service/status/v3/csds.upbdefs.c +113 -113
  402. data/src/core/ext/upbdefs-generated/envoy/type/matcher/v3/regex.upbdefs.c +29 -28
  403. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.c +69 -0
  404. data/src/core/ext/upbdefs-generated/envoy/type/v3/ratelimit_strategy.upbdefs.h +40 -0
  405. data/src/core/ext/upbdefs-generated/google/protobuf/descriptor.upbdefs.c +92 -90
  406. data/src/core/ext/xds/upb_utils.h +0 -21
  407. data/src/core/ext/xds/xds_api.cc +53 -86
  408. data/src/core/ext/xds/xds_api.h +19 -28
  409. data/src/core/ext/xds/xds_bootstrap.cc +39 -52
  410. data/src/core/ext/xds/xds_bootstrap.h +28 -8
  411. data/src/core/ext/xds/xds_certificate_provider.h +9 -0
  412. data/src/core/ext/xds/xds_channel_stack_modifier.cc +6 -4
  413. data/src/core/ext/xds/xds_channel_stack_modifier.h +8 -0
  414. data/src/core/ext/xds/xds_client.cc +555 -1214
  415. data/src/core/ext/xds/xds_client.h +16 -44
  416. data/src/core/ext/xds/xds_client_grpc.cc +291 -0
  417. data/src/core/ext/xds/xds_client_grpc.h +102 -0
  418. data/src/core/ext/xds/xds_cluster.cc +92 -103
  419. data/src/core/ext/xds/xds_cluster.h +6 -5
  420. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +10 -14
  421. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +1 -0
  422. data/src/core/ext/xds/xds_common_types.cc +134 -110
  423. data/src/core/ext/xds/xds_common_types.h +6 -7
  424. data/src/core/ext/xds/xds_endpoint.cc +80 -80
  425. data/src/core/ext/xds/xds_endpoint.h +4 -4
  426. data/src/core/ext/xds/xds_http_fault_filter.cc +4 -11
  427. data/src/core/ext/xds/xds_http_fault_filter.h +3 -3
  428. data/src/core/ext/xds/xds_http_filters.h +3 -3
  429. data/src/core/ext/xds/xds_http_rbac_filter.cc +39 -58
  430. data/src/core/ext/xds/xds_http_rbac_filter.h +3 -3
  431. data/src/core/ext/xds/xds_lb_policy_registry.cc +17 -20
  432. data/src/core/ext/xds/xds_lb_policy_registry.h +4 -4
  433. data/src/core/ext/xds/xds_listener.cc +329 -299
  434. data/src/core/ext/xds/xds_listener.h +4 -4
  435. data/src/core/ext/xds/xds_resource_type.h +13 -2
  436. data/src/core/ext/xds/xds_route_config.cc +180 -177
  437. data/src/core/ext/xds/xds_route_config.h +31 -17
  438. data/src/core/ext/xds/xds_routing.cc +3 -6
  439. data/src/core/ext/xds/xds_routing.h +7 -9
  440. data/src/core/ext/xds/xds_server_config_fetcher.cc +76 -81
  441. data/src/core/ext/xds/xds_transport.h +86 -0
  442. data/src/core/ext/xds/xds_transport_grpc.cc +349 -0
  443. data/src/core/ext/xds/xds_transport_grpc.h +135 -0
  444. data/src/core/lib/address_utils/parse_address.cc +19 -17
  445. data/src/core/lib/address_utils/parse_address.h +8 -5
  446. data/src/core/lib/avl/avl.h +47 -25
  447. data/src/core/lib/channel/call_tracer.h +1 -1
  448. data/src/core/lib/channel/channel_args.cc +88 -19
  449. data/src/core/lib/channel/channel_args.h +113 -62
  450. data/src/core/lib/channel/channel_stack.cc +0 -1
  451. data/src/core/lib/channel/channel_stack_builder.cc +3 -3
  452. data/src/core/lib/channel/channel_stack_builder.h +2 -2
  453. data/src/core/lib/channel/channel_stack_builder_impl.cc +2 -4
  454. data/src/core/lib/channel/channelz.cc +27 -37
  455. data/src/core/lib/channel/channelz.h +9 -0
  456. data/src/core/lib/channel/promise_based_filter.h +0 -1
  457. data/src/core/lib/config/core_configuration.h +48 -35
  458. data/src/core/lib/debug/stats.cc +12 -15
  459. data/src/core/lib/debug/stats.h +11 -3
  460. data/src/core/lib/event_engine/{event_engine.cc → default_event_engine.cc} +9 -5
  461. data/src/core/lib/event_engine/{event_engine_factory.h → default_event_engine.h} +4 -8
  462. data/src/core/lib/event_engine/default_event_engine_factory.cc +20 -3
  463. data/src/core/lib/event_engine/default_event_engine_factory.h +33 -0
  464. data/src/core/lib/event_engine/executor/executor.h +38 -0
  465. data/src/core/lib/event_engine/executor/threaded_executor.cc +36 -0
  466. data/src/core/lib/event_engine/executor/threaded_executor.h +44 -0
  467. data/src/core/lib/event_engine/forkable.cc +98 -0
  468. data/src/core/lib/event_engine/forkable.h +61 -0
  469. data/src/core/lib/event_engine/poller.h +54 -0
  470. data/src/core/lib/event_engine/{iomgr_engine/iomgr_engine.cc → posix_engine/posix_engine.cc} +30 -47
  471. data/src/core/lib/event_engine/{iomgr_engine/iomgr_engine.h → posix_engine/posix_engine.h} +27 -28
  472. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer.cc +4 -5
  473. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer.h +8 -8
  474. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_heap.cc +4 -4
  475. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_heap.h +5 -5
  476. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_manager.cc +46 -10
  477. data/src/core/lib/event_engine/{iomgr_engine → posix_engine}/timer_manager.h +17 -8
  478. data/src/core/lib/event_engine/promise.h +11 -2
  479. data/src/core/lib/event_engine/socket_notifier.h +55 -0
  480. data/src/core/lib/event_engine/{iomgr_engine/thread_pool.cc → thread_pool.cc} +49 -14
  481. data/src/core/lib/event_engine/{iomgr_engine/thread_pool.h → thread_pool.h} +21 -10
  482. data/src/core/lib/event_engine/utils.cc +49 -0
  483. data/src/core/lib/event_engine/utils.h +40 -0
  484. data/src/core/lib/event_engine/windows/iocp.cc +149 -0
  485. data/src/core/lib/event_engine/windows/iocp.h +68 -0
  486. data/src/core/lib/event_engine/windows/win_socket.cc +196 -0
  487. data/src/core/lib/event_engine/windows/win_socket.h +120 -0
  488. data/src/core/lib/event_engine/windows/windows_engine.cc +159 -0
  489. data/src/core/lib/event_engine/windows/windows_engine.h +120 -0
  490. data/src/core/lib/gpr/time.cc +11 -9
  491. data/src/core/lib/gpr/useful.h +29 -0
  492. data/src/core/lib/gprpp/bitset.h +3 -13
  493. data/src/core/lib/gprpp/debug_location.h +39 -7
  494. data/src/core/lib/gprpp/manual_constructor.h +0 -1
  495. data/src/core/lib/gprpp/no_destruct.h +94 -0
  496. data/src/core/lib/gprpp/ref_counted_ptr.h +0 -1
  497. data/src/core/lib/gprpp/status_helper.cc +1 -0
  498. data/src/core/lib/gprpp/table.h +0 -1
  499. data/src/core/lib/{event_engine/iomgr_engine → gprpp}/time_averaged_stats.cc +3 -5
  500. data/src/core/lib/{event_engine/iomgr_engine → gprpp}/time_averaged_stats.h +5 -7
  501. data/src/core/lib/{iomgr → gprpp}/work_serializer.cc +34 -18
  502. data/src/core/lib/{iomgr → gprpp}/work_serializer.h +21 -27
  503. data/src/core/lib/http/httpcli.cc +12 -24
  504. data/src/core/lib/http/httpcli_security_connector.cc +11 -11
  505. data/src/core/lib/iomgr/call_combiner.cc +0 -26
  506. data/src/core/lib/iomgr/closure.h +0 -9
  507. data/src/core/lib/iomgr/combiner.cc +0 -20
  508. data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -1
  509. data/src/core/lib/iomgr/error.cc +0 -773
  510. data/src/core/lib/iomgr/error.h +0 -145
  511. data/src/core/lib/iomgr/error_cfstream.cc +0 -5
  512. data/src/core/lib/iomgr/ev_poll_posix.cc +17 -9
  513. data/src/core/lib/iomgr/exec_ctx.cc +0 -12
  514. data/src/core/lib/iomgr/executor.cc +0 -10
  515. data/src/core/lib/iomgr/executor.h +0 -3
  516. data/src/core/lib/iomgr/lockfree_event.cc +0 -17
  517. data/src/core/lib/iomgr/port.h +3 -0
  518. data/src/core/lib/iomgr/resolve_address.h +29 -6
  519. data/src/core/lib/iomgr/resolve_address_posix.cc +38 -8
  520. data/src/core/lib/iomgr/resolve_address_posix.h +19 -5
  521. data/src/core/lib/iomgr/resolve_address_windows.cc +40 -10
  522. data/src/core/lib/iomgr/resolve_address_windows.h +19 -5
  523. data/src/core/lib/iomgr/socket_windows.h +0 -2
  524. data/src/core/lib/iomgr/tcp_posix.cc +118 -6
  525. data/src/core/lib/iomgr/timer_generic.cc +6 -8
  526. data/src/core/lib/json/json.h +19 -22
  527. data/src/core/lib/json/json_args.h +34 -0
  528. data/src/core/lib/json/json_object_loader.cc +233 -0
  529. data/src/core/lib/json/json_object_loader.h +618 -0
  530. data/src/core/lib/json/json_reader.cc +86 -62
  531. data/src/core/lib/json/json_util.cc +8 -36
  532. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.cc +3 -44
  533. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy.h +15 -24
  534. data/src/core/lib/load_balancing/lb_policy_factory.h +49 -0
  535. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy_registry.cc +49 -72
  536. data/src/core/{ext/filters/client_channel → lib/load_balancing}/lb_policy_registry.h +27 -27
  537. data/src/core/{ext/filters/client_channel → lib/load_balancing}/subchannel_interface.h +6 -6
  538. data/src/core/lib/promise/activity.h +56 -8
  539. data/src/core/lib/promise/arena_promise.h +84 -81
  540. data/src/core/lib/promise/context.h +0 -1
  541. data/src/core/lib/promise/detail/basic_seq.h +43 -23
  542. data/src/core/lib/promise/detail/promise_factory.h +0 -1
  543. data/src/core/lib/promise/map.h +0 -1
  544. data/src/core/lib/promise/seq.h +25 -4
  545. data/src/core/lib/promise/sleep.cc +38 -42
  546. data/src/core/lib/promise/sleep.h +27 -24
  547. data/src/core/lib/promise/try_seq.h +26 -6
  548. data/src/core/lib/resolver/resolver.cc +0 -47
  549. data/src/core/lib/resolver/resolver.h +2 -12
  550. data/src/core/lib/resolver/resolver_factory.h +2 -3
  551. data/src/core/lib/resolver/resolver_registry.cc +1 -1
  552. data/src/core/lib/resolver/resolver_registry.h +2 -3
  553. data/src/core/lib/resolver/server_address.cc +11 -15
  554. data/src/core/lib/resolver/server_address.h +4 -8
  555. data/src/core/lib/resource_quota/api.cc +1 -1
  556. data/src/core/lib/resource_quota/arena.cc +21 -1
  557. data/src/core/lib/resource_quota/arena.h +24 -2
  558. data/src/core/lib/resource_quota/memory_quota.cc +157 -17
  559. data/src/core/lib/resource_quota/memory_quota.h +98 -17
  560. data/src/core/lib/resource_quota/periodic_update.cc +79 -0
  561. data/src/core/lib/resource_quota/periodic_update.h +71 -0
  562. data/src/core/lib/security/authorization/evaluate_args.cc +10 -7
  563. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
  564. data/src/core/lib/security/authorization/grpc_server_authz_filter.h +1 -1
  565. data/src/core/lib/security/authorization/matchers.cc +13 -10
  566. data/src/core/lib/security/authorization/rbac_policy.cc +0 -1
  567. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -3
  568. data/src/core/lib/security/credentials/alts/alts_credentials.h +3 -4
  569. data/src/core/lib/security/credentials/composite/composite_credentials.cc +3 -7
  570. data/src/core/lib/security/credentials/composite/composite_credentials.h +2 -4
  571. data/src/core/lib/security/credentials/credentials.h +16 -12
  572. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +18 -11
  573. data/src/core/lib/security/credentials/external/external_account_credentials.cc +32 -23
  574. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +5 -6
  575. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +4 -6
  576. data/src/core/lib/security/credentials/fake/fake_credentials.cc +3 -12
  577. data/src/core/lib/security/credentials/fake/fake_credentials.h +0 -4
  578. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +29 -26
  579. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +1 -3
  580. data/src/core/lib/security/credentials/iam/iam_credentials.cc +0 -1
  581. data/src/core/lib/security/credentials/insecure/insecure_credentials.cc +3 -3
  582. data/src/core/lib/security/credentials/insecure/insecure_credentials.h +3 -4
  583. data/src/core/lib/security/credentials/jwt/json_token.cc +12 -3
  584. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +4 -8
  585. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +11 -13
  586. data/src/core/lib/security/credentials/local/local_credentials.cc +3 -4
  587. data/src/core/lib/security/credentials/local/local_credentials.h +3 -4
  588. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +17 -18
  589. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +0 -1
  590. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +13 -21
  591. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +3 -4
  592. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +6 -0
  593. data/src/core/lib/security/credentials/tls/tls_credentials.cc +13 -25
  594. data/src/core/lib/security/credentials/tls/tls_credentials.h +3 -4
  595. data/src/core/lib/security/credentials/xds/xds_credentials.cc +13 -30
  596. data/src/core/lib/security/credentials/xds/xds_credentials.h +3 -3
  597. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +10 -18
  598. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +26 -38
  599. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +2 -2
  600. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +5 -5
  601. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +6 -5
  602. data/src/core/lib/security/security_connector/local/local_security_connector.cc +13 -11
  603. data/src/core/lib/security/security_connector/local/local_security_connector.h +2 -2
  604. data/src/core/lib/security/security_connector/security_connector.h +5 -3
  605. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +5 -4
  606. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +5 -5
  607. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +5 -5
  608. data/src/core/lib/security/transport/auth_filters.h +1 -1
  609. data/src/core/lib/security/transport/client_auth_filter.cc +3 -4
  610. data/src/core/lib/security/transport/security_handshaker.cc +32 -44
  611. data/src/core/lib/security/transport/security_handshaker.h +2 -1
  612. data/src/core/lib/service_config/service_config.h +11 -0
  613. data/src/core/lib/service_config/service_config_impl.cc +98 -97
  614. data/src/core/lib/service_config/service_config_impl.h +11 -13
  615. data/src/core/lib/service_config/service_config_parser.cc +26 -27
  616. data/src/core/lib/service_config/service_config_parser.h +10 -22
  617. data/src/core/lib/slice/percent_encoding.cc +4 -13
  618. data/src/core/lib/slice/slice.cc +10 -4
  619. data/src/core/lib/surface/call.cc +8 -2
  620. data/src/core/lib/surface/channel.cc +6 -6
  621. data/src/core/lib/surface/channel.h +1 -1
  622. data/src/core/lib/surface/completion_queue.cc +0 -2
  623. data/src/core/lib/surface/completion_queue.h +0 -3
  624. data/src/core/lib/surface/init.cc +2 -6
  625. data/src/core/lib/surface/lame_client.cc +2 -3
  626. data/src/core/lib/surface/lame_client.h +1 -1
  627. data/src/core/lib/surface/server.cc +7 -12
  628. data/src/core/lib/surface/server.h +7 -7
  629. data/src/core/lib/surface/validate_metadata.cc +4 -14
  630. data/src/core/lib/surface/version.cc +2 -2
  631. data/src/core/lib/transport/connectivity_state.cc +0 -1
  632. data/src/core/lib/transport/connectivity_state.h +1 -1
  633. data/src/core/lib/transport/error_utils.cc +0 -36
  634. data/src/core/lib/transport/handshaker.cc +7 -9
  635. data/src/core/lib/transport/handshaker.h +4 -5
  636. data/src/core/lib/transport/handshaker_factory.h +2 -3
  637. data/src/core/lib/transport/handshaker_registry.cc +2 -1
  638. data/src/core/lib/transport/handshaker_registry.h +2 -4
  639. data/src/core/lib/transport/http_connect_handshaker.cc +16 -16
  640. data/src/core/lib/transport/metadata_batch.cc +5 -0
  641. data/src/core/lib/transport/metadata_batch.h +52 -7
  642. data/src/core/lib/transport/parsed_metadata.h +0 -1
  643. data/src/core/lib/transport/tcp_connect_handshaker.cc +12 -18
  644. data/src/core/lib/transport/transport.h +0 -7
  645. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +40 -21
  646. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +1 -1
  647. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +14 -7
  648. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +1 -1
  649. data/src/core/tsi/fake_transport_security.cc +53 -30
  650. data/src/core/tsi/local_transport_security.cc +9 -5
  651. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +10 -1
  652. data/src/core/tsi/ssl_transport_security.cc +47 -23
  653. data/src/core/tsi/transport_security.cc +18 -6
  654. data/src/core/tsi/transport_security.h +2 -1
  655. data/src/core/tsi/transport_security_interface.h +17 -5
  656. data/src/ruby/ext/grpc/extconf.rb +2 -0
  657. data/src/ruby/ext/grpc/rb_loader.c +6 -2
  658. data/src/ruby/lib/grpc/version.rb +1 -1
  659. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +4 -0
  660. data/third_party/abseil-cpp/absl/functional/any_invocable.h +313 -0
  661. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +857 -0
  662. data/third_party/upb/third_party/utf8_range/utf8_range.h +1 -1
  663. data/third_party/upb/upb/arena.c +277 -0
  664. data/third_party/upb/upb/arena.h +225 -0
  665. data/third_party/upb/upb/array.c +114 -0
  666. data/third_party/upb/upb/array.h +83 -0
  667. data/third_party/upb/upb/collections.h +36 -0
  668. data/third_party/upb/upb/decode.c +161 -65
  669. data/third_party/upb/upb/decode.h +1 -0
  670. data/third_party/upb/upb/decode_fast.c +1 -1
  671. data/third_party/upb/upb/def.c +10 -2
  672. data/third_party/upb/upb/def.h +8 -1
  673. data/third_party/upb/upb/def.hpp +7 -4
  674. data/third_party/upb/upb/encode.c +29 -20
  675. data/third_party/upb/upb/encode.h +16 -6
  676. data/third_party/upb/upb/extension_registry.c +93 -0
  677. data/third_party/upb/upb/extension_registry.h +84 -0
  678. data/third_party/upb/upb/{decode_internal.h → internal/decode.h} +5 -5
  679. data/third_party/upb/upb/internal/table.h +385 -0
  680. data/third_party/upb/upb/{upb_internal.h → internal/upb.h} +3 -3
  681. data/third_party/upb/upb/internal/vsnprintf_compat.h +52 -0
  682. data/third_party/upb/upb/json_decode.c +1512 -0
  683. data/third_party/upb/upb/json_decode.h +47 -0
  684. data/third_party/upb/upb/json_encode.c +7 -3
  685. data/third_party/upb/upb/json_encode.h +6 -3
  686. data/third_party/upb/upb/map.c +108 -0
  687. data/third_party/upb/upb/map.h +117 -0
  688. data/third_party/upb/upb/message_value.h +66 -0
  689. data/third_party/upb/upb/mini_table.c +1147 -0
  690. data/third_party/upb/upb/mini_table.h +189 -0
  691. data/third_party/upb/upb/mini_table.hpp +112 -0
  692. data/third_party/upb/upb/msg.c +2 -62
  693. data/third_party/upb/upb/msg.h +2 -45
  694. data/third_party/upb/upb/msg_internal.h +28 -22
  695. data/third_party/upb/upb/port_def.inc +2 -1
  696. data/third_party/upb/upb/port_undef.inc +1 -0
  697. data/third_party/upb/upb/reflection.c +2 -159
  698. data/third_party/upb/upb/reflection.h +2 -112
  699. data/third_party/upb/upb/status.c +86 -0
  700. data/third_party/upb/upb/status.h +66 -0
  701. data/third_party/upb/upb/table.c +2 -2
  702. data/third_party/upb/upb/table_internal.h +3 -352
  703. data/third_party/upb/upb/text_encode.c +3 -2
  704. data/third_party/upb/upb/upb.c +4 -290
  705. data/third_party/upb/upb/upb.h +7 -196
  706. metadata +90 -38
  707. data/src/core/ext/filters/client_channel/lb_policy_factory.h +0 -50
  708. data/src/core/lib/iomgr/error_internal.h +0 -66
  709. data/src/core/lib/iomgr/executor/mpmcqueue.cc +0 -182
  710. data/src/core/lib/iomgr/executor/mpmcqueue.h +0 -171
  711. data/src/core/lib/iomgr/executor/threadpool.cc +0 -136
  712. data/src/core/lib/iomgr/executor/threadpool.h +0 -150
  713. data/src/core/lib/iomgr/time_averaged_stats.cc +0 -64
  714. data/src/core/lib/iomgr/time_averaged_stats.h +0 -72
  715. data/src/core/lib/promise/detail/switch.h +0 -1455
@@ -21,7 +21,6 @@
21
21
  #include <stdint.h>
22
22
 
23
23
  #include <set>
24
- #include <type_traits>
25
24
  #include <utility>
26
25
 
27
26
  #include "absl/memory/memory.h"
@@ -49,6 +48,7 @@
49
48
 
50
49
  #include <grpc/support/log.h>
51
50
 
51
+ #include "src/core/ext/xds/upb_utils.h"
52
52
  #include "src/core/ext/xds/xds_common_types.h"
53
53
  #include "src/core/ext/xds/xds_resource_type.h"
54
54
  #include "src/core/lib/address_utils/parse_address.h"
@@ -59,7 +59,6 @@
59
59
  #include "src/core/lib/iomgr/error.h"
60
60
  #include "src/core/lib/iomgr/sockaddr.h"
61
61
  #include "src/core/lib/json/json.h"
62
- #include "src/core/lib/transport/error_utils.h"
63
62
 
64
63
  namespace grpc_core {
65
64
 
@@ -270,7 +269,7 @@ std::string XdsListenerResource::ToString() const {
270
269
  namespace {
271
270
 
272
271
  void MaybeLogHttpConnectionManager(
273
- const XdsEncodingContext& context,
272
+ const XdsResourceType::DecodeContext& context,
274
273
  const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*
275
274
  http_connection_manager_config) {
276
275
  if (GRPC_TRACE_FLAG_ENABLED(*context.tracer) &&
@@ -286,25 +285,25 @@ void MaybeLogHttpConnectionManager(
286
285
  }
287
286
  }
288
287
 
289
- grpc_error_handle HttpConnectionManagerParse(
290
- bool is_client, const XdsEncodingContext& context,
288
+ absl::StatusOr<XdsListenerResource::HttpConnectionManager>
289
+ HttpConnectionManagerParse(
290
+ bool is_client, const XdsResourceType::DecodeContext& context,
291
291
  const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*
292
292
  http_connection_manager_proto,
293
- bool is_v2,
294
- XdsListenerResource::HttpConnectionManager* http_connection_manager) {
293
+ bool is_v2) {
295
294
  MaybeLogHttpConnectionManager(context, http_connection_manager_proto);
295
+ std::vector<std::string> errors;
296
+ XdsListenerResource::HttpConnectionManager http_connection_manager;
296
297
  // NACK a non-zero `xff_num_trusted_hops` and a `non-empty
297
298
  // original_ip_detection_extensions` as mentioned in
298
299
  // https://github.com/grpc/proposal/blob/master/A41-xds-rbac.md
299
300
  if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_xff_num_trusted_hops(
300
301
  http_connection_manager_proto) != 0) {
301
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
302
- "'xff_num_trusted_hops' must be zero");
302
+ errors.emplace_back("'xff_num_trusted_hops' must be zero");
303
303
  }
304
304
  if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_original_ip_detection_extensions(
305
305
  http_connection_manager_proto)) {
306
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
307
- "'original_ip_detection_extensions' must be empty");
306
+ errors.emplace_back("'original_ip_detection_extensions' must be empty");
308
307
  }
309
308
  // Obtain max_stream_duration from Http Protocol Options.
310
309
  const envoy_config_core_v3_HttpProtocolOptions* options =
@@ -314,7 +313,7 @@ grpc_error_handle HttpConnectionManagerParse(
314
313
  const google_protobuf_Duration* duration =
315
314
  envoy_config_core_v3_HttpProtocolOptions_max_stream_duration(options);
316
315
  if (duration != nullptr) {
317
- http_connection_manager->http_max_stream_duration =
316
+ http_connection_manager.http_max_stream_duration =
318
317
  ParseDuration(duration);
319
318
  }
320
319
  }
@@ -331,12 +330,12 @@ grpc_error_handle HttpConnectionManagerParse(
331
330
  envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_name(
332
331
  http_filter));
333
332
  if (name.empty()) {
334
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
335
- absl::StrCat("empty filter name at index ", i));
333
+ errors.emplace_back(absl::StrCat("empty filter name at index ", i));
334
+ continue;
336
335
  }
337
336
  if (names_seen.find(name) != names_seen.end()) {
338
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
339
- absl::StrCat("duplicate HTTP filter name: ", name));
337
+ errors.emplace_back(absl::StrCat("duplicate HTTP filter name: ", name));
338
+ continue;
340
339
  }
341
340
  names_seen.insert(name);
342
341
  const bool is_optional =
@@ -346,56 +345,64 @@ grpc_error_handle HttpConnectionManagerParse(
346
345
  envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_typed_config(
347
346
  http_filter);
348
347
  if (any == nullptr) {
349
- if (is_optional) continue;
350
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
351
- absl::StrCat("no filter config specified for filter name ", name));
348
+ if (!is_optional) {
349
+ errors.emplace_back(absl::StrCat(
350
+ "no filter config specified for filter name ", name));
351
+ }
352
+ continue;
352
353
  }
353
354
  auto filter_type = ExtractExtensionTypeName(context, any);
354
355
  if (!filter_type.ok()) {
355
- return absl_status_to_grpc_error(filter_type.status());
356
+ errors.emplace_back(absl::StrCat("filter name ", name, ": ",
357
+ filter_type.status().message()));
358
+ continue;
356
359
  }
357
360
  const XdsHttpFilterImpl* filter_impl =
358
361
  XdsHttpFilterRegistry::GetFilterForType(filter_type->type);
359
362
  if (filter_impl == nullptr) {
360
- if (is_optional) continue;
361
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
362
- "no filter registered for config type ", filter_type->type));
363
+ if (!is_optional) {
364
+ errors.emplace_back(absl::StrCat(
365
+ "no filter registered for config type ", filter_type->type));
366
+ }
367
+ continue;
363
368
  }
364
369
  if ((is_client && !filter_impl->IsSupportedOnClients()) ||
365
370
  (!is_client && !filter_impl->IsSupportedOnServers())) {
366
- if (is_optional) continue;
367
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrFormat(
368
- "Filter %s is not supported on %s", filter_type->type,
369
- is_client ? "clients" : "servers"));
371
+ if (!is_optional) {
372
+ errors.emplace_back(absl::StrFormat(
373
+ "Filter %s is not supported on %s", filter_type->type,
374
+ is_client ? "clients" : "servers"));
375
+ }
376
+ continue;
370
377
  }
371
378
  absl::StatusOr<XdsHttpFilterImpl::FilterConfig> filter_config =
372
379
  filter_impl->GenerateFilterConfig(google_protobuf_Any_value(any),
373
380
  context.arena);
374
381
  if (!filter_config.ok()) {
375
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
382
+ errors.emplace_back(absl::StrCat(
376
383
  "filter config for type ", filter_type->type,
377
384
  " failed to parse: ", StatusToString(filter_config.status())));
385
+ continue;
378
386
  }
379
- http_connection_manager->http_filters.emplace_back(
387
+ http_connection_manager.http_filters.emplace_back(
380
388
  XdsListenerResource::HttpConnectionManager::HttpFilter{
381
389
  std::string(name), std::move(*filter_config)});
382
390
  }
383
- if (http_connection_manager->http_filters.empty()) {
384
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
385
- "Expected at least one HTTP filter");
391
+ if (http_connection_manager.http_filters.empty()) {
392
+ errors.emplace_back("Expected at least one HTTP filter");
386
393
  }
387
394
  // Make sure that the last filter is terminal and non-last filters are
388
395
  // non-terminal. Note that this check is being performed in a separate loop
389
396
  // to take care of the case where there are two terminal filters in the list
390
397
  // out of which only one gets added in the final list.
391
- for (const auto& http_filter : http_connection_manager->http_filters) {
398
+ for (const auto& http_filter : http_connection_manager.http_filters) {
392
399
  const XdsHttpFilterImpl* filter_impl =
393
400
  XdsHttpFilterRegistry::GetFilterForType(
394
401
  http_filter.config.config_proto_type_name);
395
- if (&http_filter != &http_connection_manager->http_filters.back()) {
402
+ if (&http_filter != &http_connection_manager.http_filters.back()) {
396
403
  // Filters before the last filter must not be terminal.
397
404
  if (filter_impl->IsTerminalFilter()) {
398
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
405
+ errors.emplace_back(
399
406
  absl::StrCat("terminal filter for config type ",
400
407
  http_filter.config.config_proto_type_name,
401
408
  " must be the last filter in the chain"));
@@ -403,7 +410,7 @@ grpc_error_handle HttpConnectionManagerParse(
403
410
  } else {
404
411
  // The last filter must be terminal.
405
412
  if (!filter_impl->IsTerminalFilter()) {
406
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
413
+ errors.emplace_back(
407
414
  absl::StrCat("non-terminal filter for config type ",
408
415
  http_filter.config.config_proto_type_name,
409
416
  " is the last filter in the chain"));
@@ -415,7 +422,7 @@ grpc_error_handle HttpConnectionManagerParse(
415
422
  // router filter without actually looking at the config. This ensures
416
423
  // that the right thing happens in the xds resolver without having
417
424
  // to expose whether the resource we received was v2 or v3.
418
- http_connection_manager->http_filters.emplace_back(
425
+ http_connection_manager.http_filters.emplace_back(
419
426
  XdsListenerResource::HttpConnectionManager::HttpFilter{
420
427
  "router", {kXdsHttpRouterFilterConfigName, Json()}});
421
428
  }
@@ -429,252 +436,281 @@ grpc_error_handle HttpConnectionManagerParse(
429
436
  const envoy_config_route_v3_RouteConfiguration* route_config =
430
437
  envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(
431
438
  http_connection_manager_proto);
432
- XdsRouteConfigResource rds_update;
433
- grpc_error_handle error =
434
- XdsRouteConfigResource::Parse(context, route_config, &rds_update);
435
- if (!GRPC_ERROR_IS_NONE(error)) return error;
436
- http_connection_manager->rds_update = std::move(rds_update);
437
- return GRPC_ERROR_NONE;
438
- }
439
- // Validate that RDS must be used to get the route_config dynamically.
440
- const envoy_extensions_filters_network_http_connection_manager_v3_Rds* rds =
441
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(
442
- http_connection_manager_proto);
443
- if (rds == nullptr) {
444
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
445
- "HttpConnectionManager neither has inlined route_config nor RDS.");
446
- }
447
- // Check that the ConfigSource specifies ADS.
448
- const envoy_config_core_v3_ConfigSource* config_source =
449
- envoy_extensions_filters_network_http_connection_manager_v3_Rds_config_source(
450
- rds);
451
- if (config_source == nullptr) {
452
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
453
- "HttpConnectionManager missing config_source for RDS.");
454
- }
455
- if (!envoy_config_core_v3_ConfigSource_has_ads(config_source) &&
456
- !envoy_config_core_v3_ConfigSource_has_self(config_source)) {
457
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
458
- "HttpConnectionManager ConfigSource for RDS does not specify ADS "
459
- "or SELF.");
439
+ auto rds_update = XdsRouteConfigResource::Parse(context, route_config);
440
+ if (!rds_update.ok()) {
441
+ errors.emplace_back(rds_update.status().message());
442
+ } else {
443
+ http_connection_manager.rds_update = std::move(*rds_update);
444
+ }
445
+ } else {
446
+ // Validate that RDS must be used to get the route_config dynamically.
447
+ const envoy_extensions_filters_network_http_connection_manager_v3_Rds* rds =
448
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(
449
+ http_connection_manager_proto);
450
+ if (rds == nullptr) {
451
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
452
+ "HttpConnectionManager neither has inlined route_config nor RDS.");
453
+ }
454
+ // Check that the ConfigSource specifies ADS.
455
+ const envoy_config_core_v3_ConfigSource* config_source =
456
+ envoy_extensions_filters_network_http_connection_manager_v3_Rds_config_source(
457
+ rds);
458
+ if (config_source == nullptr) {
459
+ errors.emplace_back(
460
+ "HttpConnectionManager missing config_source for RDS.");
461
+ } else if (!envoy_config_core_v3_ConfigSource_has_ads(config_source) &&
462
+ !envoy_config_core_v3_ConfigSource_has_self(config_source)) {
463
+ errors.emplace_back(
464
+ "HttpConnectionManager ConfigSource for RDS does not specify ADS "
465
+ "or SELF.");
466
+ } else {
467
+ // Get the route_config_name.
468
+ http_connection_manager.route_config_name = UpbStringToStdString(
469
+ envoy_extensions_filters_network_http_connection_manager_v3_Rds_route_config_name(
470
+ rds));
471
+ }
460
472
  }
461
- // Get the route_config_name.
462
- http_connection_manager->route_config_name = UpbStringToStdString(
463
- envoy_extensions_filters_network_http_connection_manager_v3_Rds_route_config_name(
464
- rds));
465
473
  }
466
- return GRPC_ERROR_NONE;
474
+ // Return result.
475
+ if (!errors.empty()) {
476
+ return absl::InvalidArgumentError(
477
+ absl::StrCat("Errors parsing HttpConnectionManager config: [",
478
+ absl::StrJoin(errors, "; "), "]"));
479
+ }
480
+ return http_connection_manager;
467
481
  }
468
482
 
469
- grpc_error_handle LdsResourceParseClient(
470
- const XdsEncodingContext& context,
471
- const envoy_config_listener_v3_ApiListener* api_listener, bool is_v2,
472
- XdsListenerResource* lds_update) {
473
- lds_update->type = XdsListenerResource::ListenerType::kHttpApiListener;
483
+ absl::StatusOr<XdsListenerResource> LdsResourceParseClient(
484
+ const XdsResourceType::DecodeContext& context,
485
+ const envoy_config_listener_v3_ApiListener* api_listener, bool is_v2) {
474
486
  const upb_StringView encoded_api_listener = google_protobuf_Any_value(
475
487
  envoy_config_listener_v3_ApiListener_api_listener(api_listener));
476
488
  const auto* http_connection_manager =
477
489
  envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_parse(
478
490
  encoded_api_listener.data, encoded_api_listener.size, context.arena);
479
491
  if (http_connection_manager == nullptr) {
480
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
492
+ return absl::InvalidArgumentError(
481
493
  "Could not parse HttpConnectionManager config from ApiListener");
482
494
  }
483
- return HttpConnectionManagerParse(true /* is_client */, context,
484
- http_connection_manager, is_v2,
485
- &lds_update->http_connection_manager);
495
+ auto hcm = HttpConnectionManagerParse(true /* is_client */, context,
496
+ http_connection_manager, is_v2);
497
+ if (!hcm.ok()) return hcm.status();
498
+ XdsListenerResource lds_update;
499
+ lds_update.type = XdsListenerResource::ListenerType::kHttpApiListener;
500
+ lds_update.http_connection_manager = std::move(*hcm);
501
+ return lds_update;
486
502
  }
487
503
 
488
- grpc_error_handle DownstreamTlsContextParse(
489
- const XdsEncodingContext& context,
490
- const envoy_config_core_v3_TransportSocket* transport_socket,
491
- XdsListenerResource::DownstreamTlsContext* downstream_tls_context) {
504
+ absl::StatusOr<XdsListenerResource::DownstreamTlsContext>
505
+ DownstreamTlsContextParse(
506
+ const XdsResourceType::DecodeContext& context,
507
+ const envoy_config_core_v3_TransportSocket* transport_socket) {
492
508
  absl::string_view name = UpbStringToAbsl(
493
509
  envoy_config_core_v3_TransportSocket_name(transport_socket));
494
510
  if (name != "envoy.transport_sockets.tls") {
495
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(
511
+ return absl::InvalidArgumentError(
496
512
  absl::StrCat("Unrecognized transport socket: ", name));
497
513
  }
514
+ std::vector<std::string> errors;
515
+ XdsListenerResource::DownstreamTlsContext downstream_tls_context;
498
516
  auto* typed_config =
499
517
  envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
500
- std::vector<grpc_error_handle> errors;
501
- if (typed_config != nullptr) {
502
- const upb_StringView encoded_downstream_tls_context =
503
- google_protobuf_Any_value(typed_config);
504
- auto* downstream_tls_context_proto =
505
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_parse(
506
- encoded_downstream_tls_context.data,
507
- encoded_downstream_tls_context.size, context.arena);
508
- if (downstream_tls_context_proto == nullptr) {
509
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
510
- "Can't decode downstream tls context.");
511
- }
512
- auto* common_tls_context =
513
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_common_tls_context(
514
- downstream_tls_context_proto);
515
- if (common_tls_context != nullptr) {
516
- grpc_error_handle error =
517
- CommonTlsContext::Parse(context, common_tls_context,
518
- &downstream_tls_context->common_tls_context);
519
- if (!GRPC_ERROR_IS_NONE(error)) errors.push_back(error);
520
- }
521
- auto* require_client_certificate =
522
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_client_certificate(
523
- downstream_tls_context_proto);
524
- if (require_client_certificate != nullptr) {
525
- downstream_tls_context->require_client_certificate =
526
- google_protobuf_BoolValue_value(require_client_certificate);
527
- }
528
- auto* require_sni =
529
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_sni(
530
- downstream_tls_context_proto);
531
- if (require_sni != nullptr &&
532
- google_protobuf_BoolValue_value(require_sni)) {
533
- errors.push_back(
534
- GRPC_ERROR_CREATE_FROM_STATIC_STRING("require_sni: unsupported"));
535
- }
536
- if (envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_ocsp_staple_policy(
537
- downstream_tls_context_proto) !=
538
- envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_LENIENT_STAPLING) {
539
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
540
- "ocsp_staple_policy: Only LENIENT_STAPLING supported"));
518
+ if (typed_config == nullptr) {
519
+ return absl::InvalidArgumentError("transport socket typed config unset");
520
+ }
521
+ const upb_StringView encoded_downstream_tls_context =
522
+ google_protobuf_Any_value(typed_config);
523
+ auto* downstream_tls_context_proto =
524
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_parse(
525
+ encoded_downstream_tls_context.data,
526
+ encoded_downstream_tls_context.size, context.arena);
527
+ if (downstream_tls_context_proto == nullptr) {
528
+ return absl::InvalidArgumentError("Can't decode downstream tls context.");
529
+ }
530
+ auto* common_tls_context =
531
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_common_tls_context(
532
+ downstream_tls_context_proto);
533
+ if (common_tls_context != nullptr) {
534
+ auto common_context = CommonTlsContext::Parse(context, common_tls_context);
535
+ if (!common_context.ok()) {
536
+ errors.emplace_back(common_context.status().message());
537
+ } else {
538
+ downstream_tls_context.common_tls_context = std::move(*common_context);
541
539
  }
542
540
  }
543
- if (downstream_tls_context->common_tls_context
541
+ auto* require_client_certificate =
542
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_client_certificate(
543
+ downstream_tls_context_proto);
544
+ if (require_client_certificate != nullptr) {
545
+ downstream_tls_context.require_client_certificate =
546
+ google_protobuf_BoolValue_value(require_client_certificate);
547
+ }
548
+ auto* require_sni =
549
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_sni(
550
+ downstream_tls_context_proto);
551
+ if (require_sni != nullptr && google_protobuf_BoolValue_value(require_sni)) {
552
+ errors.emplace_back("require_sni: unsupported");
553
+ }
554
+ if (envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_ocsp_staple_policy(
555
+ downstream_tls_context_proto) !=
556
+ envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_LENIENT_STAPLING) {
557
+ errors.emplace_back("ocsp_staple_policy: Only LENIENT_STAPLING supported");
558
+ }
559
+
560
+ if (downstream_tls_context.common_tls_context
544
561
  .tls_certificate_provider_instance.instance_name.empty()) {
545
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
562
+ errors.emplace_back(
546
563
  "TLS configuration provided but no "
547
- "tls_certificate_provider_instance found."));
564
+ "tls_certificate_provider_instance found.");
548
565
  }
549
- if (downstream_tls_context->require_client_certificate &&
550
- downstream_tls_context->common_tls_context.certificate_validation_context
566
+ if (downstream_tls_context.require_client_certificate &&
567
+ downstream_tls_context.common_tls_context.certificate_validation_context
551
568
  .ca_certificate_provider_instance.instance_name.empty()) {
552
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
569
+ errors.emplace_back(
553
570
  "TLS configuration requires client certificates but no certificate "
554
- "provider instance specified for validation."));
571
+ "provider instance specified for validation.");
555
572
  }
556
- if (!downstream_tls_context->common_tls_context.certificate_validation_context
573
+ if (!downstream_tls_context.common_tls_context.certificate_validation_context
557
574
  .match_subject_alt_names.empty()) {
558
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
559
- "match_subject_alt_names not supported on servers"));
575
+ errors.emplace_back("match_subject_alt_names not supported on servers");
576
+ }
577
+ // Return result.
578
+ if (!errors.empty()) {
579
+ return absl::InvalidArgumentError(
580
+ absl::StrCat("Errors parsing DownstreamTlsContext: [",
581
+ absl::StrJoin(errors, "; "), "]"));
560
582
  }
561
- return GRPC_ERROR_CREATE_FROM_VECTOR("Error parsing DownstreamTlsContext",
562
- &errors);
583
+ return downstream_tls_context;
563
584
  }
564
585
 
565
- grpc_error_handle CidrRangeParse(
566
- const envoy_config_core_v3_CidrRange* cidr_range_proto,
567
- XdsListenerResource::FilterChainMap::CidrRange* cidr_range) {
586
+ absl::StatusOr<XdsListenerResource::FilterChainMap::CidrRange> CidrRangeParse(
587
+ const envoy_config_core_v3_CidrRange* cidr_range_proto) {
588
+ XdsListenerResource::FilterChainMap::CidrRange cidr_range;
568
589
  std::string address_prefix = UpbStringToStdString(
569
590
  envoy_config_core_v3_CidrRange_address_prefix(cidr_range_proto));
570
- grpc_error_handle error =
571
- grpc_string_to_sockaddr(&cidr_range->address, address_prefix.c_str(), 0);
572
- if (!GRPC_ERROR_IS_NONE(error)) return error;
573
- cidr_range->prefix_len = 0;
591
+ auto address = StringToSockaddr(address_prefix, /*port=*/0);
592
+ if (!address.ok()) return address.status();
593
+ cidr_range.address = *address;
594
+ cidr_range.prefix_len = 0;
574
595
  auto* prefix_len_proto =
575
596
  envoy_config_core_v3_CidrRange_prefix_len(cidr_range_proto);
576
597
  if (prefix_len_proto != nullptr) {
577
- cidr_range->prefix_len = std::min(
598
+ cidr_range.prefix_len = std::min(
578
599
  google_protobuf_UInt32Value_value(prefix_len_proto),
579
- (reinterpret_cast<const grpc_sockaddr*>(cidr_range->address.addr))
600
+ (reinterpret_cast<const grpc_sockaddr*>(cidr_range.address.addr))
580
601
  ->sa_family == GRPC_AF_INET
581
602
  ? uint32_t(32)
582
603
  : uint32_t(128));
583
604
  }
584
605
  // Normalize the network address by masking it with prefix_len
585
- grpc_sockaddr_mask_bits(&cidr_range->address, cidr_range->prefix_len);
586
- return GRPC_ERROR_NONE;
606
+ grpc_sockaddr_mask_bits(&cidr_range.address, cidr_range.prefix_len);
607
+ return cidr_range;
587
608
  }
588
609
 
589
- grpc_error_handle FilterChainMatchParse(
590
- const envoy_config_listener_v3_FilterChainMatch* filter_chain_match_proto,
591
- FilterChain::FilterChainMatch* filter_chain_match) {
610
+ absl::StatusOr<FilterChain::FilterChainMatch> FilterChainMatchParse(
611
+ const envoy_config_listener_v3_FilterChainMatch* filter_chain_match_proto) {
612
+ std::vector<std::string> errors;
613
+ FilterChain::FilterChainMatch filter_chain_match;
592
614
  auto* destination_port =
593
615
  envoy_config_listener_v3_FilterChainMatch_destination_port(
594
616
  filter_chain_match_proto);
595
617
  if (destination_port != nullptr) {
596
- filter_chain_match->destination_port =
618
+ filter_chain_match.destination_port =
597
619
  google_protobuf_UInt32Value_value(destination_port);
598
620
  }
599
621
  size_t size = 0;
600
622
  auto* prefix_ranges = envoy_config_listener_v3_FilterChainMatch_prefix_ranges(
601
623
  filter_chain_match_proto, &size);
602
- filter_chain_match->prefix_ranges.reserve(size);
624
+ filter_chain_match.prefix_ranges.reserve(size);
603
625
  for (size_t i = 0; i < size; i++) {
604
- XdsListenerResource::FilterChainMap::CidrRange cidr_range;
605
- grpc_error_handle error = CidrRangeParse(prefix_ranges[i], &cidr_range);
606
- if (!GRPC_ERROR_IS_NONE(error)) return error;
607
- filter_chain_match->prefix_ranges.push_back(cidr_range);
626
+ auto cidr_range = CidrRangeParse(prefix_ranges[i]);
627
+ if (!cidr_range.ok()) {
628
+ errors.emplace_back(absl::StrCat("prefix range ", i, ": ",
629
+ cidr_range.status().message()));
630
+ continue;
631
+ }
632
+ filter_chain_match.prefix_ranges.push_back(*cidr_range);
608
633
  }
609
- filter_chain_match->source_type =
634
+ filter_chain_match.source_type =
610
635
  static_cast<XdsListenerResource::FilterChainMap::ConnectionSourceType>(
611
636
  envoy_config_listener_v3_FilterChainMatch_source_type(
612
637
  filter_chain_match_proto));
613
638
  auto* source_prefix_ranges =
614
639
  envoy_config_listener_v3_FilterChainMatch_source_prefix_ranges(
615
640
  filter_chain_match_proto, &size);
616
- filter_chain_match->source_prefix_ranges.reserve(size);
641
+ filter_chain_match.source_prefix_ranges.reserve(size);
617
642
  for (size_t i = 0; i < size; i++) {
618
- XdsListenerResource::FilterChainMap::CidrRange cidr_range;
619
- grpc_error_handle error =
620
- CidrRangeParse(source_prefix_ranges[i], &cidr_range);
621
- if (!GRPC_ERROR_IS_NONE(error)) return error;
622
- filter_chain_match->source_prefix_ranges.push_back(cidr_range);
643
+ auto cidr_range = CidrRangeParse(source_prefix_ranges[i]);
644
+ if (!cidr_range.ok()) {
645
+ errors.emplace_back(absl::StrCat("source prefix range ", i, ": ",
646
+ cidr_range.status().message()));
647
+ continue;
648
+ }
649
+ filter_chain_match.source_prefix_ranges.push_back(*cidr_range);
623
650
  }
624
651
  auto* source_ports = envoy_config_listener_v3_FilterChainMatch_source_ports(
625
652
  filter_chain_match_proto, &size);
626
- filter_chain_match->source_ports.reserve(size);
653
+ filter_chain_match.source_ports.reserve(size);
627
654
  for (size_t i = 0; i < size; i++) {
628
- filter_chain_match->source_ports.push_back(source_ports[i]);
655
+ filter_chain_match.source_ports.push_back(source_ports[i]);
629
656
  }
630
657
  auto* server_names = envoy_config_listener_v3_FilterChainMatch_server_names(
631
658
  filter_chain_match_proto, &size);
632
659
  for (size_t i = 0; i < size; i++) {
633
- filter_chain_match->server_names.push_back(
660
+ filter_chain_match.server_names.push_back(
634
661
  UpbStringToStdString(server_names[i]));
635
662
  }
636
- filter_chain_match->transport_protocol = UpbStringToStdString(
663
+ filter_chain_match.transport_protocol = UpbStringToStdString(
637
664
  envoy_config_listener_v3_FilterChainMatch_transport_protocol(
638
665
  filter_chain_match_proto));
639
666
  auto* application_protocols =
640
667
  envoy_config_listener_v3_FilterChainMatch_application_protocols(
641
668
  filter_chain_match_proto, &size);
642
669
  for (size_t i = 0; i < size; i++) {
643
- filter_chain_match->application_protocols.push_back(
670
+ filter_chain_match.application_protocols.push_back(
644
671
  UpbStringToStdString(application_protocols[i]));
645
672
  }
646
- return GRPC_ERROR_NONE;
673
+ // Return result.
674
+ if (!errors.empty()) {
675
+ return absl::InvalidArgumentError(
676
+ absl::StrCat("errors parsing filter chain match: [",
677
+ absl::StrJoin(errors, "; "), "]"));
678
+ }
679
+ return filter_chain_match;
647
680
  }
648
681
 
649
- grpc_error_handle FilterChainParse(
650
- const XdsEncodingContext& context,
651
- const envoy_config_listener_v3_FilterChain* filter_chain_proto, bool is_v2,
652
- FilterChain* filter_chain) {
653
- std::vector<grpc_error_handle> errors;
682
+ absl::StatusOr<FilterChain> FilterChainParse(
683
+ const XdsResourceType::DecodeContext& context,
684
+ const envoy_config_listener_v3_FilterChain* filter_chain_proto,
685
+ bool is_v2) {
686
+ FilterChain filter_chain;
687
+ std::vector<std::string> errors;
654
688
  auto* filter_chain_match =
655
689
  envoy_config_listener_v3_FilterChain_filter_chain_match(
656
690
  filter_chain_proto);
657
691
  if (filter_chain_match != nullptr) {
658
- grpc_error_handle error = FilterChainMatchParse(
659
- filter_chain_match, &filter_chain->filter_chain_match);
660
- if (!GRPC_ERROR_IS_NONE(error)) errors.push_back(error);
692
+ auto match = FilterChainMatchParse(filter_chain_match);
693
+ if (!match.ok()) {
694
+ errors.emplace_back(match.status().message());
695
+ } else {
696
+ filter_chain.filter_chain_match = std::move(*match);
697
+ }
661
698
  }
662
- filter_chain->filter_chain_data =
699
+ filter_chain.filter_chain_data =
663
700
  std::make_shared<XdsListenerResource::FilterChainData>();
664
701
  // Parse the filters list. Currently we only support HttpConnectionManager.
665
702
  size_t size = 0;
666
703
  auto* filters =
667
704
  envoy_config_listener_v3_FilterChain_filters(filter_chain_proto, &size);
668
705
  if (size != 1) {
669
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
706
+ errors.push_back(
670
707
  "FilterChain should have exactly one filter: HttpConnectionManager; no "
671
- "other filter is supported at the moment"));
708
+ "other filter is supported at the moment");
672
709
  } else {
673
710
  auto* typed_config =
674
711
  envoy_config_listener_v3_Filter_typed_config(filters[0]);
675
712
  if (typed_config == nullptr) {
676
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
677
- "No typed_config found in filter."));
713
+ errors.emplace_back("No typed_config found in filter.");
678
714
  } else {
679
715
  absl::string_view type_url =
680
716
  UpbStringToAbsl(google_protobuf_Any_type_url(typed_config));
@@ -682,8 +718,7 @@ grpc_error_handle FilterChainParse(
682
718
  "type.googleapis.com/"
683
719
  "envoy.extensions.filters.network.http_connection_manager.v3."
684
720
  "HttpConnectionManager") {
685
- errors.push_back(GRPC_ERROR_CREATE_FROM_CPP_STRING(
686
- absl::StrCat("Unsupported filter type ", type_url)));
721
+ errors.emplace_back(absl::StrCat("Unsupported filter type ", type_url));
687
722
  } else {
688
723
  const upb_StringView encoded_http_connection_manager =
689
724
  google_protobuf_Any_value(typed_config);
@@ -692,14 +727,18 @@ grpc_error_handle FilterChainParse(
692
727
  encoded_http_connection_manager.data,
693
728
  encoded_http_connection_manager.size, context.arena);
694
729
  if (http_connection_manager == nullptr) {
695
- errors.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
730
+ errors.emplace_back(
696
731
  "Could not parse HttpConnectionManager config from filter "
697
- "typed_config"));
732
+ "typed_config");
698
733
  } else {
699
- grpc_error_handle error = HttpConnectionManagerParse(
700
- false /* is_client */, context, http_connection_manager, is_v2,
701
- &filter_chain->filter_chain_data->http_connection_manager);
702
- if (!GRPC_ERROR_IS_NONE(error)) errors.push_back(error);
734
+ auto hcm = HttpConnectionManagerParse(
735
+ /*is_client=*/false, context, http_connection_manager, is_v2);
736
+ if (!hcm.ok()) {
737
+ errors.emplace_back(hcm.status().message());
738
+ } else {
739
+ filter_chain.filter_chain_data->http_connection_manager =
740
+ std::move(*hcm);
741
+ }
703
742
  }
704
743
  }
705
744
  }
@@ -707,36 +746,42 @@ grpc_error_handle FilterChainParse(
707
746
  auto* transport_socket =
708
747
  envoy_config_listener_v3_FilterChain_transport_socket(filter_chain_proto);
709
748
  if (transport_socket != nullptr) {
710
- grpc_error_handle error = DownstreamTlsContextParse(
711
- context, transport_socket,
712
- &filter_chain->filter_chain_data->downstream_tls_context);
713
- if (!GRPC_ERROR_IS_NONE(error)) errors.push_back(error);
749
+ auto downstream_context =
750
+ DownstreamTlsContextParse(context, transport_socket);
751
+ if (!downstream_context.ok()) {
752
+ errors.emplace_back(downstream_context.status().message());
753
+ } else {
754
+ filter_chain.filter_chain_data->downstream_tls_context =
755
+ std::move(*downstream_context);
756
+ }
757
+ }
758
+ // Return result.
759
+ if (!errors.empty()) {
760
+ return absl::InvalidArgumentError(absl::StrCat(
761
+ "Errors parsing FilterChain: [", absl::StrJoin(errors, "; "), "]"));
714
762
  }
715
- return GRPC_ERROR_CREATE_FROM_VECTOR("Error parsing FilterChain", &errors);
763
+ return filter_chain;
716
764
  }
717
765
 
718
- grpc_error_handle AddressParse(
719
- const envoy_config_core_v3_Address* address_proto, std::string* address) {
766
+ absl::StatusOr<std::string> AddressParse(
767
+ const envoy_config_core_v3_Address* address_proto) {
720
768
  const auto* socket_address =
721
769
  envoy_config_core_v3_Address_socket_address(address_proto);
722
770
  if (socket_address == nullptr) {
723
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
724
- "Address does not have socket_address");
771
+ return absl::InvalidArgumentError("Address does not have socket_address");
725
772
  }
726
773
  if (envoy_config_core_v3_SocketAddress_protocol(socket_address) !=
727
774
  envoy_config_core_v3_SocketAddress_TCP) {
728
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
729
- "SocketAddress protocol is not TCP");
775
+ return absl::InvalidArgumentError("SocketAddress protocol is not TCP");
730
776
  }
731
777
  uint32_t port = envoy_config_core_v3_SocketAddress_port_value(socket_address);
732
778
  if (port > 65535) {
733
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid port");
779
+ return absl::InvalidArgumentError("Invalid port");
734
780
  }
735
- *address = JoinHostPort(
781
+ return JoinHostPort(
736
782
  UpbStringToAbsl(
737
783
  envoy_config_core_v3_SocketAddress_address(socket_address)),
738
784
  port);
739
- return GRPC_ERROR_NONE;
740
785
  }
741
786
 
742
787
  // An intermediate map for filter chains that we create to validate the list of
@@ -755,37 +800,36 @@ struct InternalFilterChainMap {
755
800
  DestinationIpMap destination_ip_map;
756
801
  };
757
802
 
758
- grpc_error_handle AddFilterChainDataForSourcePort(
759
- const FilterChain& filter_chain,
760
- XdsListenerResource::FilterChainMap::SourcePortsMap* ports_map,
761
- uint32_t port) {
803
+ absl::Status AddFilterChainDataForSourcePort(
804
+ const FilterChain& filter_chain, uint32_t port,
805
+ XdsListenerResource::FilterChainMap::SourcePortsMap* ports_map) {
762
806
  auto insert_result = ports_map->emplace(
763
807
  port, XdsListenerResource::FilterChainMap::FilterChainDataSharedPtr{
764
808
  filter_chain.filter_chain_data});
765
809
  if (!insert_result.second) {
766
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(absl::StrCat(
810
+ return absl::InvalidArgumentError(absl::StrCat(
767
811
  "Duplicate matching rules detected when adding filter chain: ",
768
812
  filter_chain.filter_chain_match.ToString()));
769
813
  }
770
- return GRPC_ERROR_NONE;
814
+ return absl::OkStatus();
771
815
  }
772
816
 
773
- grpc_error_handle AddFilterChainDataForSourcePorts(
817
+ absl::Status AddFilterChainDataForSourcePorts(
774
818
  const FilterChain& filter_chain,
775
819
  XdsListenerResource::FilterChainMap::SourcePortsMap* ports_map) {
776
820
  if (filter_chain.filter_chain_match.source_ports.empty()) {
777
- return AddFilterChainDataForSourcePort(filter_chain, ports_map, 0);
821
+ return AddFilterChainDataForSourcePort(filter_chain, 0, ports_map);
778
822
  } else {
779
823
  for (uint32_t port : filter_chain.filter_chain_match.source_ports) {
780
- grpc_error_handle error =
781
- AddFilterChainDataForSourcePort(filter_chain, ports_map, port);
782
- if (!GRPC_ERROR_IS_NONE(error)) return error;
824
+ absl::Status status =
825
+ AddFilterChainDataForSourcePort(filter_chain, port, ports_map);
826
+ if (!status.ok()) return status;
783
827
  }
784
828
  }
785
- return GRPC_ERROR_NONE;
829
+ return absl::OkStatus();
786
830
  }
787
831
 
788
- grpc_error_handle AddFilterChainDataForSourceIpRange(
832
+ absl::Status AddFilterChainDataForSourceIpRange(
789
833
  const FilterChain& filter_chain,
790
834
  InternalFilterChainMap::SourceIpMap* source_ip_map) {
791
835
  if (filter_chain.filter_chain_match.source_prefix_ranges.empty()) {
@@ -797,24 +841,22 @@ grpc_error_handle AddFilterChainDataForSourceIpRange(
797
841
  for (const auto& prefix_range :
798
842
  filter_chain.filter_chain_match.source_prefix_ranges) {
799
843
  auto addr_str = grpc_sockaddr_to_string(&prefix_range.address, false);
800
- if (!addr_str.ok()) {
801
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(addr_str.status().ToString());
802
- }
844
+ if (!addr_str.ok()) return addr_str.status();
803
845
  auto insert_result = source_ip_map->emplace(
804
846
  absl::StrCat(*addr_str, "/", prefix_range.prefix_len),
805
847
  XdsListenerResource::FilterChainMap::SourceIp());
806
848
  if (insert_result.second) {
807
849
  insert_result.first->second.prefix_range.emplace(prefix_range);
808
850
  }
809
- grpc_error_handle error = AddFilterChainDataForSourcePorts(
851
+ absl::Status status = AddFilterChainDataForSourcePorts(
810
852
  filter_chain, &insert_result.first->second.ports_map);
811
- if (!GRPC_ERROR_IS_NONE(error)) return error;
853
+ if (!status.ok()) return status;
812
854
  }
813
855
  }
814
- return GRPC_ERROR_NONE;
856
+ return absl::OkStatus();
815
857
  }
816
858
 
817
- grpc_error_handle AddFilterChainDataForSourceType(
859
+ absl::Status AddFilterChainDataForSourceType(
818
860
  const FilterChain& filter_chain,
819
861
  InternalFilterChainMap::DestinationIp* destination_ip) {
820
862
  GPR_ASSERT(static_cast<unsigned int>(
@@ -824,31 +866,31 @@ grpc_error_handle AddFilterChainDataForSourceType(
824
866
  filter_chain.filter_chain_match.source_type)]);
825
867
  }
826
868
 
827
- grpc_error_handle AddFilterChainDataForApplicationProtocols(
869
+ absl::Status AddFilterChainDataForApplicationProtocols(
828
870
  const FilterChain& filter_chain,
829
871
  InternalFilterChainMap::DestinationIp* destination_ip) {
830
872
  // Only allow filter chains that do not mention application protocols
831
873
  if (!filter_chain.filter_chain_match.application_protocols.empty()) {
832
- return GRPC_ERROR_NONE;
874
+ return absl::OkStatus();
833
875
  }
834
876
  return AddFilterChainDataForSourceType(filter_chain, destination_ip);
835
877
  }
836
878
 
837
- grpc_error_handle AddFilterChainDataForTransportProtocol(
879
+ absl::Status AddFilterChainDataForTransportProtocol(
838
880
  const FilterChain& filter_chain,
839
881
  InternalFilterChainMap::DestinationIp* destination_ip) {
840
882
  const std::string& transport_protocol =
841
883
  filter_chain.filter_chain_match.transport_protocol;
842
884
  // Only allow filter chains with no transport protocol or "raw_buffer"
843
885
  if (!transport_protocol.empty() && transport_protocol != "raw_buffer") {
844
- return GRPC_ERROR_NONE;
886
+ return absl::OkStatus();
845
887
  }
846
888
  // If for this configuration, we've already seen filter chains that mention
847
889
  // the transport protocol as "raw_buffer", we will never match filter chains
848
890
  // that do not mention it.
849
891
  if (destination_ip->transport_protocol_raw_buffer_provided &&
850
892
  transport_protocol.empty()) {
851
- return GRPC_ERROR_NONE;
893
+ return absl::OkStatus();
852
894
  }
853
895
  if (!transport_protocol.empty() &&
854
896
  !destination_ip->transport_protocol_raw_buffer_provided) {
@@ -862,17 +904,17 @@ grpc_error_handle AddFilterChainDataForTransportProtocol(
862
904
  destination_ip);
863
905
  }
864
906
 
865
- grpc_error_handle AddFilterChainDataForServerNames(
907
+ absl::Status AddFilterChainDataForServerNames(
866
908
  const FilterChain& filter_chain,
867
909
  InternalFilterChainMap::DestinationIp* destination_ip) {
868
910
  // Don't continue adding filter chains with server names mentioned
869
911
  if (!filter_chain.filter_chain_match.server_names.empty()) {
870
- return GRPC_ERROR_NONE;
912
+ return absl::OkStatus();
871
913
  }
872
914
  return AddFilterChainDataForTransportProtocol(filter_chain, destination_ip);
873
915
  }
874
916
 
875
- grpc_error_handle AddFilterChainDataForDestinationIpRange(
917
+ absl::Status AddFilterChainDataForDestinationIpRange(
876
918
  const FilterChain& filter_chain,
877
919
  InternalFilterChainMap::DestinationIpMap* destination_ip_map) {
878
920
  if (filter_chain.filter_chain_match.prefix_ranges.empty()) {
@@ -884,21 +926,19 @@ grpc_error_handle AddFilterChainDataForDestinationIpRange(
884
926
  for (const auto& prefix_range :
885
927
  filter_chain.filter_chain_match.prefix_ranges) {
886
928
  auto addr_str = grpc_sockaddr_to_string(&prefix_range.address, false);
887
- if (!addr_str.ok()) {
888
- return GRPC_ERROR_CREATE_FROM_CPP_STRING(addr_str.status().ToString());
889
- }
929
+ if (!addr_str.ok()) return addr_str.status();
890
930
  auto insert_result = destination_ip_map->emplace(
891
931
  absl::StrCat(*addr_str, "/", prefix_range.prefix_len),
892
932
  InternalFilterChainMap::DestinationIp());
893
933
  if (insert_result.second) {
894
934
  insert_result.first->second.prefix_range.emplace(prefix_range);
895
935
  }
896
- grpc_error_handle error = AddFilterChainDataForServerNames(
936
+ absl::Status status = AddFilterChainDataForServerNames(
897
937
  filter_chain, &insert_result.first->second);
898
- if (!GRPC_ERROR_IS_NONE(error)) return error;
938
+ if (!status.ok()) return status;
899
939
  }
900
940
  }
901
- return GRPC_ERROR_NONE;
941
+ return absl::OkStatus();
902
942
  }
903
943
 
904
944
  XdsListenerResource::FilterChainMap BuildFromInternalFilterChainMap(
@@ -920,36 +960,33 @@ XdsListenerResource::FilterChainMap BuildFromInternalFilterChainMap(
920
960
  return filter_chain_map;
921
961
  }
922
962
 
923
- grpc_error_handle BuildFilterChainMap(
924
- const std::vector<FilterChain>& filter_chains,
925
- XdsListenerResource::FilterChainMap* filter_chain_map) {
963
+ absl::StatusOr<XdsListenerResource::FilterChainMap> BuildFilterChainMap(
964
+ const std::vector<FilterChain>& filter_chains) {
926
965
  InternalFilterChainMap internal_filter_chain_map;
927
966
  for (const auto& filter_chain : filter_chains) {
928
967
  // Discard filter chain entries that specify destination port
929
968
  if (filter_chain.filter_chain_match.destination_port != 0) continue;
930
- grpc_error_handle error = AddFilterChainDataForDestinationIpRange(
969
+ absl::Status status = AddFilterChainDataForDestinationIpRange(
931
970
  filter_chain, &internal_filter_chain_map.destination_ip_map);
932
- if (!GRPC_ERROR_IS_NONE(error)) return error;
971
+ if (!status.ok()) return status;
933
972
  }
934
- *filter_chain_map =
935
- BuildFromInternalFilterChainMap(&internal_filter_chain_map);
936
- return GRPC_ERROR_NONE;
973
+ return BuildFromInternalFilterChainMap(&internal_filter_chain_map);
937
974
  }
938
975
 
939
- grpc_error_handle LdsResourceParseServer(
940
- const XdsEncodingContext& context,
941
- const envoy_config_listener_v3_Listener* listener, bool is_v2,
942
- XdsListenerResource* lds_update) {
943
- lds_update->type = XdsListenerResource::ListenerType::kTcpListener;
944
- grpc_error_handle error =
945
- AddressParse(envoy_config_listener_v3_Listener_address(listener),
946
- &lds_update->address);
947
- if (!GRPC_ERROR_IS_NONE(error)) return error;
976
+ absl::StatusOr<XdsListenerResource> LdsResourceParseServer(
977
+ const XdsResourceType::DecodeContext& context,
978
+ const envoy_config_listener_v3_Listener* listener, bool is_v2) {
979
+ XdsListenerResource lds_update;
980
+ lds_update.type = XdsListenerResource::ListenerType::kTcpListener;
981
+ auto address =
982
+ AddressParse(envoy_config_listener_v3_Listener_address(listener));
983
+ if (!address.ok()) return address.status();
984
+ lds_update.address = std::move(*address);
948
985
  const auto* use_original_dst =
949
986
  envoy_config_listener_v3_Listener_use_original_dst(listener);
950
987
  if (use_original_dst != nullptr) {
951
988
  if (google_protobuf_BoolValue_value(use_original_dst)) {
952
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
989
+ return absl::InvalidArgumentError(
953
990
  "Field \'use_original_dst\' is not supported.");
954
991
  }
955
992
  }
@@ -959,36 +996,32 @@ grpc_error_handle LdsResourceParseServer(
959
996
  std::vector<FilterChain> parsed_filter_chains;
960
997
  parsed_filter_chains.reserve(size);
961
998
  for (size_t i = 0; i < size; i++) {
962
- FilterChain filter_chain;
963
- error = FilterChainParse(context, filter_chains[i], is_v2, &filter_chain);
964
- if (!GRPC_ERROR_IS_NONE(error)) return error;
965
- parsed_filter_chains.push_back(std::move(filter_chain));
966
- }
967
- error =
968
- BuildFilterChainMap(parsed_filter_chains, &lds_update->filter_chain_map);
969
- if (!GRPC_ERROR_IS_NONE(error)) return error;
999
+ auto filter_chain = FilterChainParse(context, filter_chains[i], is_v2);
1000
+ if (!filter_chain.ok()) return filter_chain.status();
1001
+ parsed_filter_chains.push_back(std::move(*filter_chain));
1002
+ }
1003
+ auto filter_chain_map = BuildFilterChainMap(parsed_filter_chains);
1004
+ if (!filter_chain_map.ok()) return filter_chain_map.status();
1005
+ lds_update.filter_chain_map = std::move(*filter_chain_map);
970
1006
  auto* default_filter_chain =
971
1007
  envoy_config_listener_v3_Listener_default_filter_chain(listener);
972
1008
  if (default_filter_chain != nullptr) {
973
- FilterChain filter_chain;
974
- error =
975
- FilterChainParse(context, default_filter_chain, is_v2, &filter_chain);
976
- if (!GRPC_ERROR_IS_NONE(error)) return error;
977
- if (filter_chain.filter_chain_data != nullptr) {
978
- lds_update->default_filter_chain =
979
- std::move(*filter_chain.filter_chain_data);
1009
+ auto filter_chain = FilterChainParse(context, default_filter_chain, is_v2);
1010
+ if (!filter_chain.ok()) return filter_chain.status();
1011
+ if (filter_chain->filter_chain_data != nullptr) {
1012
+ lds_update.default_filter_chain =
1013
+ std::move(*filter_chain->filter_chain_data);
980
1014
  }
981
1015
  }
982
1016
  if (size == 0 && default_filter_chain == nullptr) {
983
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("No filter chain provided.");
1017
+ return absl::InvalidArgumentError("No filter chain provided.");
984
1018
  }
985
- return GRPC_ERROR_NONE;
1019
+ return lds_update;
986
1020
  }
987
1021
 
988
- grpc_error_handle LdsResourceParse(
989
- const XdsEncodingContext& context,
990
- const envoy_config_listener_v3_Listener* listener, bool is_v2,
991
- XdsListenerResource* lds_update) {
1022
+ absl::StatusOr<XdsListenerResource> LdsResourceParse(
1023
+ const XdsResourceType::DecodeContext& context,
1024
+ const envoy_config_listener_v3_Listener* listener, bool is_v2) {
992
1025
  // Check whether it's a client or server listener.
993
1026
  const envoy_config_listener_v3_ApiListener* api_listener =
994
1027
  envoy_config_listener_v3_Listener_api_listener(listener);
@@ -997,24 +1030,22 @@ grpc_error_handle LdsResourceParse(
997
1030
  // TODO(roth): Re-enable the following check once
998
1031
  // github.com/istio/istio/issues/38914 is resolved.
999
1032
  // if (api_listener != nullptr && address != nullptr) {
1000
- // return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1033
+ // return absl::InvalidArgumentError(
1001
1034
  // "Listener has both address and ApiListener");
1002
1035
  // }
1003
1036
  if (api_listener == nullptr && address == nullptr) {
1004
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1037
+ return absl::InvalidArgumentError(
1005
1038
  "Listener has neither address nor ApiListener");
1006
1039
  }
1007
- // Validate Listener fields.
1008
- grpc_error_handle error = GRPC_ERROR_NONE;
1040
+ // If api_listener is present, it's for a client; otherwise, it's
1041
+ // for a server.
1009
1042
  if (api_listener != nullptr) {
1010
- error = LdsResourceParseClient(context, api_listener, is_v2, lds_update);
1011
- } else {
1012
- error = LdsResourceParseServer(context, listener, is_v2, lds_update);
1043
+ return LdsResourceParseClient(context, api_listener, is_v2);
1013
1044
  }
1014
- return error;
1045
+ return LdsResourceParseServer(context, listener, is_v2);
1015
1046
  }
1016
1047
 
1017
- void MaybeLogListener(const XdsEncodingContext& context,
1048
+ void MaybeLogListener(const XdsResourceType::DecodeContext& context,
1018
1049
  const envoy_config_listener_v3_Listener* listener) {
1019
1050
  if (GRPC_TRACE_FLAG_ENABLED(*context.tracer) &&
1020
1051
  gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
@@ -1029,8 +1060,8 @@ void MaybeLogListener(const XdsEncodingContext& context,
1029
1060
  } // namespace
1030
1061
 
1031
1062
  absl::StatusOr<XdsResourceType::DecodeResult> XdsListenerResourceType::Decode(
1032
- const XdsEncodingContext& context, absl::string_view serialized_resource,
1033
- bool is_v2) const {
1063
+ const XdsResourceType::DecodeContext& context,
1064
+ absl::string_view serialized_resource, bool is_v2) const {
1034
1065
  // Parse serialized proto.
1035
1066
  auto* resource = envoy_config_listener_v3_Listener_parse(
1036
1067
  serialized_resource.data(), serialized_resource.size(), context.arena);
@@ -1042,24 +1073,23 @@ absl::StatusOr<XdsResourceType::DecodeResult> XdsListenerResourceType::Decode(
1042
1073
  DecodeResult result;
1043
1074
  result.name =
1044
1075
  UpbStringToStdString(envoy_config_listener_v3_Listener_name(resource));
1045
- auto listener_data = absl::make_unique<ResourceDataSubclass>();
1046
- grpc_error_handle error =
1047
- LdsResourceParse(context, resource, is_v2, &listener_data->resource);
1048
- if (!GRPC_ERROR_IS_NONE(error)) {
1049
- std::string error_str = grpc_error_std_string(error);
1050
- GRPC_ERROR_UNREF(error);
1076
+ auto listener = LdsResourceParse(context, resource, is_v2);
1077
+ if (!listener.ok()) {
1051
1078
  if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
1052
1079
  gpr_log(GPR_ERROR, "[xds_client %p] invalid Listener %s: %s",
1053
- context.client, result.name.c_str(), error_str.c_str());
1080
+ context.client, result.name.c_str(),
1081
+ listener.status().ToString().c_str());
1054
1082
  }
1055
- result.resource = absl::InvalidArgumentError(error_str);
1083
+ result.resource = listener.status();
1056
1084
  } else {
1057
1085
  if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
1058
1086
  gpr_log(GPR_INFO, "[xds_client %p] parsed Listener %s: %s",
1059
1087
  context.client, result.name.c_str(),
1060
- listener_data->resource.ToString().c_str());
1088
+ listener->ToString().c_str());
1061
1089
  }
1062
- result.resource = std::move(listener_data);
1090
+ auto resource = absl::make_unique<ResourceDataSubclass>();
1091
+ resource->resource = std::move(*listener);
1092
+ result.resource = std::move(resource);
1063
1093
  }
1064
1094
  return std::move(result);
1065
1095
  }