grpc 1.50.0.pre1 → 1.52.0.pre2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1009) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +206 -49
  3. data/include/grpc/byte_buffer.h +76 -1
  4. data/include/grpc/byte_buffer_reader.h +19 -1
  5. data/include/grpc/compression.h +2 -2
  6. data/include/grpc/event_engine/event_engine.h +27 -6
  7. data/include/grpc/event_engine/internal/memory_allocator_impl.h +1 -1
  8. data/include/grpc/event_engine/internal/slice_cast.h +67 -0
  9. data/include/grpc/event_engine/memory_allocator.h +1 -1
  10. data/include/grpc/event_engine/slice.h +24 -4
  11. data/include/grpc/event_engine/slice_buffer.h +31 -2
  12. data/include/grpc/fork.h +25 -1
  13. data/include/grpc/grpc.h +3 -13
  14. data/include/grpc/grpc_posix.h +1 -1
  15. data/include/grpc/impl/codegen/atm.h +3 -71
  16. data/include/grpc/impl/codegen/atm_gcc_atomic.h +3 -58
  17. data/include/grpc/impl/codegen/atm_gcc_sync.h +3 -59
  18. data/include/grpc/impl/codegen/atm_windows.h +3 -106
  19. data/include/grpc/impl/codegen/byte_buffer.h +4 -78
  20. data/include/grpc/impl/codegen/byte_buffer_reader.h +4 -19
  21. data/include/grpc/impl/codegen/compression_types.h +3 -82
  22. data/include/grpc/impl/codegen/connectivity_state.h +3 -20
  23. data/include/grpc/impl/codegen/fork.h +4 -25
  24. data/include/grpc/impl/codegen/gpr_types.h +2 -34
  25. data/include/grpc/impl/codegen/grpc_types.h +3 -791
  26. data/include/grpc/impl/codegen/log.h +3 -86
  27. data/include/grpc/impl/codegen/port_platform.h +3 -758
  28. data/include/grpc/impl/codegen/propagation_bits.h +3 -28
  29. data/include/grpc/impl/codegen/slice.h +3 -106
  30. data/include/grpc/impl/codegen/status.h +4 -131
  31. data/include/grpc/impl/codegen/sync.h +3 -42
  32. data/include/grpc/impl/codegen/sync_abseil.h +3 -12
  33. data/include/grpc/impl/codegen/sync_custom.h +3 -14
  34. data/include/grpc/impl/codegen/sync_generic.h +3 -25
  35. data/include/grpc/impl/codegen/sync_posix.h +3 -28
  36. data/include/grpc/impl/codegen/sync_windows.h +3 -16
  37. data/include/grpc/impl/compression_types.h +109 -0
  38. data/include/grpc/impl/connectivity_state.h +47 -0
  39. data/include/grpc/impl/grpc_types.h +824 -0
  40. data/include/grpc/impl/propagation_bits.h +54 -0
  41. data/include/grpc/impl/slice_type.h +112 -0
  42. data/include/grpc/load_reporting.h +1 -1
  43. data/include/grpc/module.modulemap +5 -1
  44. data/include/grpc/slice.h +1 -1
  45. data/include/grpc/status.h +131 -1
  46. data/include/grpc/support/atm.h +70 -1
  47. data/include/grpc/support/atm_gcc_atomic.h +59 -1
  48. data/include/grpc/support/atm_gcc_sync.h +58 -1
  49. data/include/grpc/support/atm_windows.h +105 -1
  50. data/include/grpc/support/log.h +87 -1
  51. data/include/grpc/support/log_windows.h +1 -1
  52. data/include/grpc/support/port_platform.h +767 -1
  53. data/include/grpc/support/string_util.h +1 -1
  54. data/include/grpc/support/sync.h +35 -2
  55. data/include/grpc/support/sync_abseil.h +11 -1
  56. data/include/grpc/support/sync_custom.h +13 -1
  57. data/include/grpc/support/sync_generic.h +24 -1
  58. data/include/grpc/support/sync_posix.h +27 -1
  59. data/include/grpc/support/sync_windows.h +15 -1
  60. data/include/grpc/support/time.h +25 -2
  61. data/src/core/ext/filters/census/grpc_context.cc +17 -18
  62. data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +28 -22
  63. data/src/core/ext/filters/channel_idle/channel_idle_filter.h +2 -1
  64. data/src/core/ext/filters/channel_idle/idle_filter_state.h +1 -1
  65. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -0
  66. data/src/core/ext/filters/client_channel/backup_poller.cc +24 -24
  67. data/src/core/ext/filters/client_channel/backup_poller.h +21 -21
  68. data/src/core/ext/filters/client_channel/channel_connectivity.cc +51 -28
  69. data/src/core/ext/filters/client_channel/client_channel.cc +157 -168
  70. data/src/core/ext/filters/client_channel/client_channel.h +10 -10
  71. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +17 -19
  72. data/src/core/ext/filters/client_channel/client_channel_channelz.h +19 -19
  73. data/src/core/ext/filters/client_channel/client_channel_factory.cc +17 -17
  74. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +18 -18
  75. data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
  76. data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
  77. data/src/core/ext/filters/client_channel/config_selector.h +16 -20
  78. data/src/core/ext/filters/client_channel/connector.h +1 -1
  79. data/src/core/ext/filters/client_channel/dynamic_filters.cc +28 -55
  80. data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
  81. data/src/core/ext/filters/client_channel/global_subchannel_pool.h +18 -18
  82. data/src/core/ext/filters/client_channel/health/health_check_client.cc +4 -5
  83. data/src/core/ext/filters/client_channel/http_proxy.cc +39 -40
  84. data/src/core/ext/filters/client_channel/http_proxy.h +18 -18
  85. data/src/core/ext/filters/client_channel/lb_call_state_internal.h +39 -0
  86. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
  87. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +17 -17
  88. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +7 -2
  89. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +1 -2
  90. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +59 -130
  91. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +37 -21
  92. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +131 -154
  93. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +24 -25
  94. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
  95. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +2 -4
  96. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +18 -20
  97. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +18 -19
  98. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +18 -19
  99. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +18 -19
  100. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +8 -9
  101. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
  102. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +212 -223
  103. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
  104. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +11 -22
  105. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +73 -101
  106. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +20 -21
  107. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +1 -1
  108. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +119 -106
  109. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +12 -12
  110. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +30 -16
  111. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +60 -56
  112. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +60 -64
  113. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
  114. data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
  115. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +22 -28
  116. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +62 -94
  117. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +70 -146
  118. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +651 -0
  119. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.h +60 -0
  120. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
  121. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +18 -18
  122. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -10
  123. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +26 -35
  124. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +40 -41
  125. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +22 -23
  126. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +82 -82
  127. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +117 -118
  128. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +51 -52
  129. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_posix.cc +18 -18
  130. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +18 -18
  131. data/src/core/ext/filters/client_channel/resolver/dns/dns_resolver_selection.h +18 -19
  132. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +3 -5
  133. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
  134. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +1 -1
  135. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -27
  136. data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +44 -34
  137. data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +8 -10
  138. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
  139. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +122 -119
  140. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +1 -1
  141. data/src/core/ext/filters/client_channel/retry_filter.cc +81 -103
  142. data/src/core/ext/filters/client_channel/retry_service_config.cc +193 -235
  143. data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
  144. data/src/core/ext/filters/client_channel/retry_throttle.cc +27 -29
  145. data/src/core/ext/filters/client_channel/retry_throttle.h +26 -25
  146. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +3 -3
  147. data/src/core/ext/filters/client_channel/subchannel.cc +158 -178
  148. data/src/core/ext/filters/client_channel/subchannel.h +17 -40
  149. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +18 -18
  150. data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
  151. data/src/core/ext/filters/deadline/deadline_filter.cc +34 -17
  152. data/src/core/ext/filters/deadline/deadline_filter.h +1 -1
  153. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +3 -2
  154. data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
  155. data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
  156. data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
  157. data/src/core/ext/filters/http/client/http_client_filter.cc +36 -37
  158. data/src/core/ext/filters/http/client/http_client_filter.h +17 -17
  159. data/src/core/ext/filters/http/client_authority_filter.cc +19 -19
  160. data/src/core/ext/filters/http/client_authority_filter.h +18 -18
  161. data/src/core/ext/filters/http/http_filters_plugin.cc +35 -51
  162. data/src/core/ext/filters/http/message_compress/compression_filter.cc +315 -0
  163. data/src/core/ext/filters/http/message_compress/compression_filter.h +132 -0
  164. data/src/core/ext/filters/http/server/http_server_filter.cc +44 -43
  165. data/src/core/ext/filters/http/server/http_server_filter.h +18 -18
  166. data/src/core/ext/filters/message_size/message_size_filter.cc +92 -123
  167. data/src/core/ext/filters/message_size/message_size_filter.h +23 -16
  168. data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
  169. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
  170. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
  171. data/src/core/ext/filters/server_config_selector/server_config_selector.h +6 -8
  172. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +7 -9
  173. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +229 -0
  174. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +66 -0
  175. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.cc +82 -0
  176. data/src/core/ext/filters/stateful_session/stateful_session_service_config_parser.h +93 -0
  177. data/src/core/ext/transport/chttp2/alpn/alpn.cc +18 -18
  178. data/src/core/ext/transport/chttp2/alpn/alpn.h +22 -22
  179. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +69 -63
  180. data/src/core/ext/transport/chttp2/client/chttp2_connector.h +28 -22
  181. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +81 -97
  182. data/src/core/ext/transport/chttp2/server/chttp2_server.h +18 -18
  183. data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +22 -22
  184. data/src/core/ext/transport/chttp2/transport/bin_decoder.h +30 -30
  185. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +29 -29
  186. data/src/core/ext/transport/chttp2/transport/bin_encoder.h +27 -27
  187. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +273 -283
  188. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +18 -19
  189. data/src/core/ext/transport/chttp2/transport/context_list.cc +19 -19
  190. data/src/core/ext/transport/chttp2/transport/context_list.h +25 -25
  191. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +0 -36
  192. data/src/core/ext/transport/chttp2/transport/decode_huff.h +35 -82
  193. data/src/core/ext/transport/chttp2/transport/flow_control.cc +112 -44
  194. data/src/core/ext/transport/chttp2/transport/flow_control.h +60 -34
  195. data/src/core/ext/transport/chttp2/transport/frame.h +19 -19
  196. data/src/core/ext/transport/chttp2/transport/frame_data.cc +33 -32
  197. data/src/core/ext/transport/chttp2/transport/frame_data.h +23 -23
  198. data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +36 -36
  199. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +18 -18
  200. data/src/core/ext/transport/chttp2/transport/frame_ping.cc +25 -24
  201. data/src/core/ext/transport/chttp2/transport/frame_ping.h +19 -19
  202. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +28 -25
  203. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +18 -18
  204. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +34 -36
  205. data/src/core/ext/transport/chttp2/transport/frame_settings.h +20 -20
  206. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +22 -21
  207. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +18 -18
  208. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +133 -181
  209. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +40 -59
  210. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
  211. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +93 -143
  212. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +20 -20
  213. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +26 -26
  214. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +18 -18
  215. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +21 -19
  216. data/src/core/ext/transport/chttp2/transport/http2_settings.h +36 -34
  217. data/src/core/ext/transport/chttp2/transport/http_trace.cc +19 -0
  218. data/src/core/ext/transport/chttp2/transport/http_trace.h +24 -0
  219. data/src/core/ext/transport/chttp2/transport/huffsyms.cc +20 -20
  220. data/src/core/ext/transport/chttp2/transport/huffsyms.h +19 -19
  221. data/src/core/ext/transport/chttp2/transport/internal.h +193 -170
  222. data/src/core/ext/transport/chttp2/transport/parsing.cc +147 -80
  223. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +19 -19
  224. data/src/core/ext/transport/chttp2/transport/stream_map.cc +23 -23
  225. data/src/core/ext/transport/chttp2/transport/stream_map.h +31 -31
  226. data/src/core/ext/transport/chttp2/transport/varint.cc +19 -20
  227. data/src/core/ext/transport/chttp2/transport/varint.h +35 -32
  228. data/src/core/ext/transport/chttp2/transport/writing.cc +60 -56
  229. data/src/core/ext/transport/inproc/inproc_plugin.cc +17 -17
  230. data/src/core/ext/transport/inproc/inproc_transport.cc +122 -140
  231. data/src/core/ext/transport/inproc/inproc_transport.h +19 -19
  232. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.c +62 -0
  233. data/src/core/ext/upb-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upb.h +179 -0
  234. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.c +46 -0
  235. data/src/core/ext/upb-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upb.h +98 -0
  236. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.c +47 -0
  237. data/src/core/ext/upb-generated/xds/core/v3/cidr.upb.h +107 -0
  238. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +3 -2
  239. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +9 -0
  240. data/src/core/ext/upb-generated/xds/service/orca/v3/orca.upb.c +0 -1
  241. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.c +46 -0
  242. data/src/core/ext/upb-generated/xds/type/matcher/v3/cel.upb.h +98 -0
  243. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.c +62 -0
  244. data/src/core/ext/upb-generated/xds/type/matcher/v3/domain.upb.h +174 -0
  245. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.c +36 -0
  246. data/src/core/ext/upb-generated/xds/type/matcher/v3/http_inputs.upb.h +74 -0
  247. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.c +65 -0
  248. data/src/core/ext/upb-generated/xds/type/matcher/v3/ip.upb.h +191 -0
  249. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.c +127 -0
  250. data/src/core/ext/upb-generated/xds/type/matcher/v3/range.upb.h +474 -0
  251. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.c +67 -0
  252. data/src/core/ext/upb-generated/xds/type/v3/cel.upb.h +214 -0
  253. data/src/core/ext/upb-generated/xds/type/v3/range.upb.c +64 -0
  254. data/src/core/ext/upb-generated/xds/type/v3/range.upb.h +208 -0
  255. data/src/core/ext/upb-generated/xds/type/v3/typed_struct.upb.c +0 -1
  256. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.c +60 -0
  257. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/stateful_session/v3/stateful_session.upbdefs.h +40 -0
  258. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.c +50 -0
  259. data/src/core/ext/upbdefs-generated/envoy/extensions/http/stateful_session/cookie/v3/cookie.upbdefs.h +35 -0
  260. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.c +45 -0
  261. data/src/core/ext/upbdefs-generated/xds/core/v3/cidr.upbdefs.h +35 -0
  262. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.c +43 -0
  263. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/cel.upbdefs.h +35 -0
  264. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.c +51 -0
  265. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/domain.upbdefs.h +40 -0
  266. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.c +36 -0
  267. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/http_inputs.upbdefs.h +35 -0
  268. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.c +55 -0
  269. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/ip.upbdefs.h +40 -0
  270. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/matcher.upbdefs.c +9 -9
  271. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.c +71 -0
  272. data/src/core/ext/upbdefs-generated/xds/type/matcher/v3/range.upbdefs.h +60 -0
  273. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.c +60 -0
  274. data/src/core/ext/upbdefs-generated/xds/type/v3/cel.upbdefs.h +40 -0
  275. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.c +36 -0
  276. data/src/core/ext/upbdefs-generated/xds/type/v3/range.upbdefs.h +45 -0
  277. data/src/core/ext/upbdefs-generated/xds/type/v3/typed_struct.upbdefs.c +4 -7
  278. data/src/core/ext/xds/certificate_provider_store.cc +4 -4
  279. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
  280. data/src/core/ext/xds/xds_api.cc +20 -95
  281. data/src/core/ext/xds/xds_api.h +5 -8
  282. data/src/core/ext/xds/xds_bootstrap.h +0 -1
  283. data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
  284. data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
  285. data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
  286. data/src/core/ext/xds/xds_certificate_provider.h +1 -1
  287. data/src/core/ext/xds/xds_channel_args.h +1 -1
  288. data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
  289. data/src/core/ext/xds/xds_channel_stack_modifier.h +2 -2
  290. data/src/core/ext/xds/xds_client.cc +134 -94
  291. data/src/core/ext/xds/xds_client.h +13 -5
  292. data/src/core/ext/xds/xds_client_grpc.cc +31 -24
  293. data/src/core/ext/xds/xds_client_grpc.h +1 -1
  294. data/src/core/ext/xds/xds_client_stats.cc +17 -17
  295. data/src/core/ext/xds/xds_client_stats.h +18 -18
  296. data/src/core/ext/xds/xds_cluster.cc +359 -203
  297. data/src/core/ext/xds/xds_cluster.h +52 -35
  298. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +54 -71
  299. data/src/core/ext/xds/xds_cluster_specifier_plugin.h +45 -21
  300. data/src/core/ext/xds/xds_common_types.cc +209 -141
  301. data/src/core/ext/xds/xds_common_types.h +19 -13
  302. data/src/core/ext/xds/xds_endpoint.cc +221 -130
  303. data/src/core/ext/xds/xds_endpoint.h +4 -7
  304. data/src/core/ext/xds/xds_health_status.cc +80 -0
  305. data/src/core/ext/xds/xds_health_status.h +82 -0
  306. data/src/core/ext/xds/xds_http_fault_filter.cc +57 -43
  307. data/src/core/ext/xds/xds_http_fault_filter.h +14 -22
  308. data/src/core/ext/xds/xds_http_filters.cc +65 -73
  309. data/src/core/ext/xds/xds_http_filters.h +68 -20
  310. data/src/core/ext/xds/xds_http_rbac_filter.cc +153 -207
  311. data/src/core/ext/xds/xds_http_rbac_filter.h +13 -16
  312. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +218 -0
  313. data/src/core/ext/xds/xds_http_stateful_session_filter.h +58 -0
  314. data/src/core/ext/xds/xds_lb_policy_registry.cc +120 -171
  315. data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
  316. data/src/core/ext/xds/xds_listener.cc +447 -419
  317. data/src/core/ext/xds/xds_listener.h +45 -47
  318. data/src/core/ext/xds/xds_resource_type.h +3 -11
  319. data/src/core/ext/xds/xds_resource_type_impl.h +10 -13
  320. data/src/core/ext/xds/xds_route_config.cc +514 -528
  321. data/src/core/ext/xds/xds_route_config.h +39 -28
  322. data/src/core/ext/xds/xds_routing.cc +2 -1
  323. data/src/core/ext/xds/xds_routing.h +2 -0
  324. data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -106
  325. data/src/core/ext/xds/xds_transport_grpc.cc +6 -7
  326. data/src/core/ext/xds/xds_transport_grpc.h +1 -1
  327. data/src/core/lib/address_utils/parse_address.cc +30 -29
  328. data/src/core/lib/address_utils/parse_address.h +32 -32
  329. data/src/core/lib/address_utils/sockaddr_utils.cc +29 -28
  330. data/src/core/lib/address_utils/sockaddr_utils.h +33 -33
  331. data/src/core/lib/avl/avl.h +4 -4
  332. data/src/core/lib/backoff/backoff.cc +17 -17
  333. data/src/core/lib/backoff/backoff.h +18 -18
  334. data/src/core/lib/channel/call_tracer.h +10 -1
  335. data/src/core/lib/channel/channel_args.cc +19 -20
  336. data/src/core/lib/channel/channel_args.h +59 -43
  337. data/src/core/lib/channel/channel_args_preconditioning.h +1 -1
  338. data/src/core/lib/channel/channel_stack.cc +62 -58
  339. data/src/core/lib/channel/channel_stack.h +144 -131
  340. data/src/core/lib/channel/channel_stack_builder.cc +21 -24
  341. data/src/core/lib/channel/channel_stack_builder.h +14 -6
  342. data/src/core/lib/channel/channel_stack_builder_impl.cc +43 -25
  343. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
  344. data/src/core/lib/channel/channel_trace.cc +21 -22
  345. data/src/core/lib/channel/channel_trace.h +19 -19
  346. data/src/core/lib/channel/channelz.cc +18 -19
  347. data/src/core/lib/channel/channelz.h +26 -26
  348. data/src/core/lib/channel/channelz_registry.cc +17 -17
  349. data/src/core/lib/channel/channelz_registry.h +18 -18
  350. data/src/core/lib/channel/connected_channel.cc +732 -63
  351. data/src/core/lib/channel/connected_channel.h +18 -22
  352. data/src/core/lib/channel/context.h +18 -18
  353. data/src/core/lib/channel/promise_based_filter.cc +1137 -150
  354. data/src/core/lib/channel/promise_based_filter.h +374 -88
  355. data/src/core/lib/channel/status_util.cc +35 -17
  356. data/src/core/lib/channel/status_util.h +26 -19
  357. data/src/core/lib/compression/compression.cc +19 -19
  358. data/src/core/lib/compression/compression_internal.cc +41 -48
  359. data/src/core/lib/compression/compression_internal.h +22 -22
  360. data/src/core/lib/compression/message_compress.cc +26 -26
  361. data/src/core/lib/compression/message_compress.h +25 -25
  362. data/src/core/lib/config/core_configuration.h +1 -1
  363. data/src/core/lib/debug/event_log.cc +88 -0
  364. data/src/core/lib/debug/event_log.h +81 -0
  365. data/src/core/lib/debug/histogram_view.cc +69 -0
  366. data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
  367. data/src/core/lib/debug/stats.cc +39 -136
  368. data/src/core/lib/debug/stats.h +46 -52
  369. data/src/core/lib/debug/stats_data.cc +224 -73
  370. data/src/core/lib/debug/stats_data.h +263 -122
  371. data/src/core/lib/debug/trace.cc +18 -18
  372. data/src/core/lib/debug/trace.h +19 -19
  373. data/src/core/lib/event_engine/common_closures.h +71 -0
  374. data/src/core/lib/event_engine/default_event_engine.cc +38 -15
  375. data/src/core/lib/event_engine/default_event_engine.h +15 -3
  376. data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
  377. data/src/core/lib/event_engine/executor/executor.h +1 -1
  378. data/src/core/lib/event_engine/forkable.h +1 -1
  379. data/src/core/lib/event_engine/memory_allocator.cc +1 -1
  380. data/src/core/lib/event_engine/poller.h +10 -4
  381. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +614 -0
  382. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
  383. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +900 -0
  384. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
  385. data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
  386. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
  387. data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +11 -14
  388. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
  389. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
  390. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +265 -0
  391. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
  392. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1308 -0
  393. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +684 -0
  394. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +456 -28
  395. data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
  396. data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
  397. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +236 -0
  398. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +228 -0
  399. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +380 -0
  400. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +91 -0
  401. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +853 -0
  402. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +316 -0
  403. data/src/core/lib/event_engine/posix_engine/timer.cc +49 -49
  404. data/src/core/lib/event_engine/posix_engine/timer.h +87 -86
  405. data/src/core/lib/event_engine/posix_engine/timer_heap.cc +27 -27
  406. data/src/core/lib/event_engine/posix_engine/timer_heap.h +21 -21
  407. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +76 -214
  408. data/src/core/lib/event_engine/posix_engine/timer_manager.h +41 -69
  409. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +332 -0
  410. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +185 -0
  411. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +127 -0
  412. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
  413. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +150 -0
  414. data/src/core/lib/event_engine/{executor/threaded_executor.h → posix_engine/wakeup_fd_pipe.h} +16 -15
  415. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
  416. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
  417. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
  418. data/src/core/lib/event_engine/slice.cc +7 -6
  419. data/src/core/lib/event_engine/slice_buffer.cc +2 -2
  420. data/src/core/lib/event_engine/socket_notifier.h +1 -1
  421. data/src/core/lib/event_engine/tcp_socket_utils.cc +373 -0
  422. data/src/core/lib/event_engine/tcp_socket_utils.h +85 -0
  423. data/src/core/lib/event_engine/thread_pool.cc +125 -43
  424. data/src/core/lib/event_engine/thread_pool.h +49 -26
  425. data/src/core/lib/event_engine/time_util.h +1 -1
  426. data/src/core/lib/event_engine/windows/iocp.cc +13 -12
  427. data/src/core/lib/event_engine/windows/iocp.h +1 -1
  428. data/src/core/lib/event_engine/windows/win_socket.cc +9 -9
  429. data/src/core/lib/event_engine/windows/windows_engine.cc +26 -20
  430. data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
  431. data/src/core/lib/experiments/config.cc +1 -1
  432. data/src/core/lib/experiments/experiments.cc +13 -13
  433. data/src/core/lib/experiments/experiments.h +8 -6
  434. data/src/core/lib/gpr/alloc.cc +19 -17
  435. data/src/core/lib/gpr/alloc.h +18 -18
  436. data/src/core/lib/gpr/atm.cc +17 -17
  437. data/src/core/lib/gpr/cpu_iphone.cc +24 -24
  438. data/src/core/lib/gpr/cpu_linux.cc +28 -23
  439. data/src/core/lib/gpr/cpu_posix.cc +23 -22
  440. data/src/core/lib/gpr/cpu_windows.cc +20 -18
  441. data/src/core/lib/gpr/log.cc +27 -19
  442. data/src/core/lib/gpr/log_android.cc +22 -20
  443. data/src/core/lib/gpr/log_linux.cc +24 -24
  444. data/src/core/lib/gpr/log_posix.cc +20 -19
  445. data/src/core/lib/gpr/log_windows.cc +25 -24
  446. data/src/core/lib/gpr/spinlock.h +18 -18
  447. data/src/core/lib/gpr/string.cc +25 -24
  448. data/src/core/lib/gpr/string.h +58 -58
  449. data/src/core/lib/gpr/string_posix.cc +24 -24
  450. data/src/core/lib/gpr/string_util_windows.cc +22 -22
  451. data/src/core/lib/gpr/string_windows.cc +24 -24
  452. data/src/core/lib/gpr/sync.cc +25 -25
  453. data/src/core/lib/gpr/sync_abseil.cc +22 -20
  454. data/src/core/lib/gpr/sync_posix.cc +23 -21
  455. data/src/core/lib/gpr/sync_windows.cc +29 -27
  456. data/src/core/lib/gpr/time.cc +23 -21
  457. data/src/core/lib/gpr/time_posix.cc +35 -30
  458. data/src/core/lib/gpr/time_precise.cc +22 -22
  459. data/src/core/lib/gpr/time_precise.h +18 -19
  460. data/src/core/lib/gpr/time_windows.cc +25 -22
  461. data/src/core/lib/gpr/tmpfile.h +22 -22
  462. data/src/core/lib/gpr/tmpfile_msys.cc +21 -20
  463. data/src/core/lib/gpr/tmpfile_posix.cc +22 -20
  464. data/src/core/lib/gpr/tmpfile_windows.cc +23 -22
  465. data/src/core/lib/gpr/useful.h +40 -27
  466. data/src/core/lib/gpr/wrap_memcpy.cc +23 -23
  467. data/src/core/lib/gprpp/atomic_utils.h +18 -18
  468. data/src/core/lib/gprpp/bitset.h +24 -0
  469. data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/crash.cc} +12 -12
  470. data/src/core/lib/gprpp/crash.h +34 -0
  471. data/src/core/lib/gprpp/debug_location.h +18 -18
  472. data/src/core/lib/gprpp/dual_ref_counted.h +1 -1
  473. data/src/core/lib/gprpp/env.h +20 -20
  474. data/src/core/lib/gprpp/env_linux.cc +21 -21
  475. data/src/core/lib/gprpp/env_posix.cc +18 -18
  476. data/src/core/lib/gprpp/env_windows.cc +18 -18
  477. data/src/core/lib/gprpp/examine_stack.cc +17 -17
  478. data/src/core/lib/gprpp/examine_stack.h +18 -18
  479. data/src/core/lib/gprpp/fork.cc +21 -22
  480. data/src/core/lib/gprpp/fork.h +22 -22
  481. data/src/core/lib/gprpp/global_config.h +18 -18
  482. data/src/core/lib/gprpp/global_config_custom.h +18 -18
  483. data/src/core/lib/gprpp/global_config_env.cc +17 -17
  484. data/src/core/lib/gprpp/global_config_env.h +23 -23
  485. data/src/core/lib/gprpp/global_config_generic.h +18 -18
  486. data/src/core/lib/gprpp/host_port.cc +26 -26
  487. data/src/core/lib/gprpp/host_port.h +29 -28
  488. data/src/core/lib/gprpp/load_file.cc +75 -0
  489. data/src/core/lib/gprpp/load_file.h +33 -0
  490. data/src/core/lib/gprpp/manual_constructor.h +18 -17
  491. data/src/core/lib/gprpp/memory.h +18 -18
  492. data/src/core/lib/gprpp/mpscq.cc +17 -17
  493. data/src/core/lib/gprpp/mpscq.h +18 -18
  494. data/src/core/lib/gprpp/no_destruct.h +1 -0
  495. data/src/core/lib/gprpp/orphanable.h +18 -18
  496. data/src/core/lib/gprpp/per_cpu.h +46 -0
  497. data/src/core/lib/gprpp/ref_counted.h +18 -18
  498. data/src/core/lib/gprpp/ref_counted_ptr.h +19 -18
  499. data/src/core/lib/gprpp/stat_posix.cc +5 -4
  500. data/src/core/lib/gprpp/stat_windows.cc +4 -2
  501. data/src/core/lib/gprpp/status_helper.cc +4 -3
  502. data/src/core/lib/gprpp/status_helper.h +1 -3
  503. data/src/core/lib/gprpp/strerror.cc +41 -0
  504. data/src/core/lib/gprpp/strerror.h +29 -0
  505. data/src/core/lib/gprpp/sync.h +20 -20
  506. data/src/core/lib/gprpp/table.h +1 -0
  507. data/src/core/lib/gprpp/thd.h +19 -19
  508. data/src/core/lib/gprpp/thd_posix.cc +30 -31
  509. data/src/core/lib/gprpp/thd_windows.cc +26 -26
  510. data/src/core/lib/gprpp/time.cc +16 -11
  511. data/src/core/lib/gprpp/time.h +13 -3
  512. data/src/core/lib/gprpp/time_averaged_stats.cc +20 -20
  513. data/src/core/lib/gprpp/time_averaged_stats.h +48 -48
  514. data/src/core/lib/gprpp/time_util.h +1 -1
  515. data/src/core/lib/gprpp/unique_type_name.h +18 -18
  516. data/src/core/lib/gprpp/validation_errors.h +18 -1
  517. data/src/core/lib/handshaker/proxy_mapper.h +18 -18
  518. data/src/core/lib/handshaker/proxy_mapper_registry.cc +17 -17
  519. data/src/core/lib/handshaker/proxy_mapper_registry.h +18 -18
  520. data/src/core/lib/http/format_request.cc +18 -18
  521. data/src/core/lib/http/format_request.h +18 -18
  522. data/src/core/lib/http/httpcli.cc +57 -61
  523. data/src/core/lib/http/httpcli.h +26 -26
  524. data/src/core/lib/http/httpcli_security_connector.cc +22 -25
  525. data/src/core/lib/http/parser.cc +76 -87
  526. data/src/core/lib/http/parser.h +32 -32
  527. data/src/core/lib/iomgr/block_annotate.h +21 -21
  528. data/src/core/lib/iomgr/buffer_list.cc +156 -136
  529. data/src/core/lib/iomgr/buffer_list.h +120 -98
  530. data/src/core/lib/iomgr/call_combiner.cc +29 -27
  531. data/src/core/lib/iomgr/call_combiner.h +21 -22
  532. data/src/core/lib/iomgr/cfstream_handle.cc +33 -36
  533. data/src/core/lib/iomgr/cfstream_handle.h +22 -22
  534. data/src/core/lib/iomgr/closure.h +90 -45
  535. data/src/core/lib/iomgr/combiner.cc +20 -19
  536. data/src/core/lib/iomgr/combiner.h +18 -18
  537. data/src/core/lib/iomgr/dualstack_socket_posix.cc +21 -21
  538. data/src/core/lib/iomgr/dynamic_annotations.h +20 -20
  539. data/src/core/lib/iomgr/endpoint.cc +17 -17
  540. data/src/core/lib/iomgr/endpoint.h +46 -46
  541. data/src/core/lib/iomgr/endpoint_cfstream.cc +44 -43
  542. data/src/core/lib/iomgr/endpoint_cfstream.h +27 -27
  543. data/src/core/lib/iomgr/endpoint_pair.h +18 -18
  544. data/src/core/lib/iomgr/endpoint_pair_posix.cc +20 -19
  545. data/src/core/lib/iomgr/endpoint_pair_windows.cc +18 -17
  546. data/src/core/lib/iomgr/error.cc +49 -61
  547. data/src/core/lib/iomgr/error.h +42 -173
  548. data/src/core/lib/iomgr/error_cfstream.cc +18 -18
  549. data/src/core/lib/iomgr/error_cfstream.h +19 -19
  550. data/src/core/lib/iomgr/ev_apple.cc +21 -21
  551. data/src/core/lib/iomgr/ev_apple.h +17 -17
  552. data/src/core/lib/iomgr/ev_epoll1_linux.cc +208 -195
  553. data/src/core/lib/iomgr/ev_epoll1_linux.h +18 -18
  554. data/src/core/lib/iomgr/ev_poll_posix.cc +212 -205
  555. data/src/core/lib/iomgr/ev_poll_posix.h +18 -18
  556. data/src/core/lib/iomgr/ev_posix.cc +36 -28
  557. data/src/core/lib/iomgr/ev_posix.h +85 -81
  558. data/src/core/lib/iomgr/ev_windows.cc +18 -18
  559. data/src/core/lib/iomgr/exec_ctx.cc +34 -34
  560. data/src/core/lib/iomgr/exec_ctx.h +141 -141
  561. data/src/core/lib/iomgr/executor.cc +21 -21
  562. data/src/core/lib/iomgr/executor.h +24 -24
  563. data/src/core/lib/iomgr/fork_posix.cc +24 -22
  564. data/src/core/lib/iomgr/fork_windows.cc +21 -21
  565. data/src/core/lib/iomgr/gethostname.h +18 -18
  566. data/src/core/lib/iomgr/gethostname_fallback.cc +17 -17
  567. data/src/core/lib/iomgr/gethostname_host_name_max.cc +17 -17
  568. data/src/core/lib/iomgr/gethostname_sysconf.cc +17 -17
  569. data/src/core/lib/iomgr/grpc_if_nametoindex.h +20 -20
  570. data/src/core/lib/iomgr/grpc_if_nametoindex_posix.cc +20 -19
  571. data/src/core/lib/iomgr/grpc_if_nametoindex_unsupported.cc +20 -19
  572. data/src/core/lib/iomgr/internal_errqueue.cc +4 -2
  573. data/src/core/lib/iomgr/internal_errqueue.h +80 -80
  574. data/src/core/lib/iomgr/iocp_windows.cc +22 -21
  575. data/src/core/lib/iomgr/iocp_windows.h +18 -18
  576. data/src/core/lib/iomgr/iomgr.cc +19 -18
  577. data/src/core/lib/iomgr/iomgr.h +32 -32
  578. data/src/core/lib/iomgr/iomgr_internal.cc +17 -17
  579. data/src/core/lib/iomgr/iomgr_internal.h +25 -25
  580. data/src/core/lib/iomgr/iomgr_posix.cc +20 -20
  581. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +20 -19
  582. data/src/core/lib/iomgr/iomgr_windows.cc +24 -22
  583. data/src/core/lib/iomgr/load_file.cc +24 -27
  584. data/src/core/lib/iomgr/load_file.h +20 -20
  585. data/src/core/lib/iomgr/lockfree_event.cc +114 -114
  586. data/src/core/lib/iomgr/lockfree_event.h +19 -19
  587. data/src/core/lib/iomgr/nameser.h +84 -84
  588. data/src/core/lib/iomgr/polling_entity.cc +25 -21
  589. data/src/core/lib/iomgr/polling_entity.h +27 -27
  590. data/src/core/lib/iomgr/pollset.cc +17 -17
  591. data/src/core/lib/iomgr/pollset.h +51 -51
  592. data/src/core/lib/iomgr/pollset_set.cc +17 -17
  593. data/src/core/lib/iomgr/pollset_set.h +22 -22
  594. data/src/core/lib/iomgr/pollset_set_windows.cc +18 -18
  595. data/src/core/lib/iomgr/pollset_set_windows.h +18 -18
  596. data/src/core/lib/iomgr/pollset_windows.cc +30 -29
  597. data/src/core/lib/iomgr/pollset_windows.h +22 -22
  598. data/src/core/lib/iomgr/port.h +29 -29
  599. data/src/core/lib/iomgr/python_util.h +20 -20
  600. data/src/core/lib/iomgr/resolve_address.cc +26 -20
  601. data/src/core/lib/iomgr/resolve_address.h +21 -22
  602. data/src/core/lib/iomgr/resolve_address_impl.h +2 -2
  603. data/src/core/lib/iomgr/resolve_address_posix.cc +35 -45
  604. data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
  605. data/src/core/lib/iomgr/resolve_address_windows.cc +18 -20
  606. data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
  607. data/src/core/lib/iomgr/resolved_address.h +1 -1
  608. data/src/core/lib/iomgr/sockaddr.h +21 -21
  609. data/src/core/lib/iomgr/sockaddr_posix.h +18 -18
  610. data/src/core/lib/iomgr/sockaddr_utils_posix.cc +18 -17
  611. data/src/core/lib/iomgr/sockaddr_windows.h +18 -18
  612. data/src/core/lib/iomgr/socket_factory_posix.cc +18 -18
  613. data/src/core/lib/iomgr/socket_factory_posix.h +30 -30
  614. data/src/core/lib/iomgr/socket_mutator.cc +19 -18
  615. data/src/core/lib/iomgr/socket_mutator.h +37 -37
  616. data/src/core/lib/iomgr/socket_utils.h +24 -24
  617. data/src/core/lib/iomgr/socket_utils_common_posix.cc +68 -66
  618. data/src/core/lib/iomgr/socket_utils_linux.cc +18 -17
  619. data/src/core/lib/iomgr/socket_utils_posix.cc +22 -20
  620. data/src/core/lib/iomgr/socket_utils_posix.h +78 -78
  621. data/src/core/lib/iomgr/socket_utils_windows.cc +20 -19
  622. data/src/core/lib/iomgr/socket_windows.cc +37 -36
  623. data/src/core/lib/iomgr/socket_windows.h +56 -56
  624. data/src/core/lib/iomgr/systemd_utils.cc +116 -0
  625. data/src/core/lib/{slice/slice_buffer_api.cc → iomgr/systemd_utils.h} +12 -14
  626. data/src/core/lib/iomgr/tcp_client.cc +17 -17
  627. data/src/core/lib/iomgr/tcp_client.h +26 -26
  628. data/src/core/lib/iomgr/tcp_client_cfstream.cc +25 -28
  629. data/src/core/lib/iomgr/tcp_client_posix.cc +70 -73
  630. data/src/core/lib/iomgr/tcp_client_posix.h +43 -43
  631. data/src/core/lib/iomgr/tcp_client_windows.cc +36 -39
  632. data/src/core/lib/iomgr/tcp_posix.cc +223 -237
  633. data/src/core/lib/iomgr/tcp_posix.h +27 -27
  634. data/src/core/lib/iomgr/tcp_server.cc +30 -22
  635. data/src/core/lib/iomgr/tcp_server.h +68 -62
  636. data/src/core/lib/iomgr/tcp_server_posix.cc +124 -94
  637. data/src/core/lib/iomgr/tcp_server_utils_posix.h +54 -51
  638. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +90 -55
  639. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +40 -40
  640. data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +19 -19
  641. data/src/core/lib/iomgr/tcp_server_windows.cc +97 -104
  642. data/src/core/lib/iomgr/tcp_windows.cc +109 -93
  643. data/src/core/lib/iomgr/tcp_windows.h +29 -29
  644. data/src/core/lib/iomgr/timer.cc +17 -17
  645. data/src/core/lib/iomgr/timer.h +65 -65
  646. data/src/core/lib/iomgr/timer_generic.cc +115 -122
  647. data/src/core/lib/iomgr/timer_generic.h +19 -19
  648. data/src/core/lib/iomgr/timer_heap.cc +25 -25
  649. data/src/core/lib/iomgr/timer_heap.h +19 -19
  650. data/src/core/lib/iomgr/timer_manager.cc +30 -29
  651. data/src/core/lib/iomgr/timer_manager.h +25 -25
  652. data/src/core/lib/iomgr/unix_sockets_posix.cc +20 -21
  653. data/src/core/lib/iomgr/unix_sockets_posix.h +18 -18
  654. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +19 -17
  655. data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +23 -21
  656. data/src/core/lib/iomgr/wakeup_fd_nospecial.cc +23 -23
  657. data/src/core/lib/iomgr/wakeup_fd_pipe.cc +29 -26
  658. data/src/core/lib/iomgr/wakeup_fd_pipe.h +18 -18
  659. data/src/core/lib/iomgr/wakeup_fd_posix.cc +18 -18
  660. data/src/core/lib/iomgr/wakeup_fd_posix.h +50 -50
  661. data/src/core/lib/json/json_channel_args.h +42 -0
  662. data/src/core/lib/json/json_object_loader.cc +17 -2
  663. data/src/core/lib/json/json_object_loader.h +37 -1
  664. data/src/core/lib/json/json_reader.cc +28 -28
  665. data/src/core/lib/json/json_util.cc +5 -5
  666. data/src/core/lib/json/json_util.h +4 -4
  667. data/src/core/lib/json/json_writer.cc +56 -56
  668. data/src/core/lib/load_balancing/lb_policy.cc +18 -18
  669. data/src/core/lib/load_balancing/lb_policy.h +7 -4
  670. data/src/core/lib/load_balancing/subchannel_interface.h +1 -8
  671. data/src/core/lib/matchers/matchers.cc +6 -5
  672. data/src/core/lib/matchers/matchers.h +1 -1
  673. data/src/core/lib/promise/activity.cc +16 -2
  674. data/src/core/lib/promise/activity.h +58 -27
  675. data/src/core/lib/promise/arena_promise.h +82 -52
  676. data/src/core/lib/promise/context.h +14 -6
  677. data/src/core/lib/promise/detail/basic_seq.h +9 -28
  678. data/src/core/lib/promise/detail/promise_factory.h +59 -10
  679. data/src/core/lib/promise/detail/status.h +28 -0
  680. data/src/core/lib/promise/detail/switch.h +1455 -0
  681. data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +20 -12
  682. data/src/core/lib/promise/for_each.h +155 -0
  683. data/src/core/lib/promise/latch.h +13 -19
  684. data/src/core/lib/promise/loop.h +7 -5
  685. data/src/core/lib/promise/map.h +1 -0
  686. data/src/core/lib/promise/map_pipe.h +88 -0
  687. data/src/core/lib/promise/pipe.cc +19 -0
  688. data/src/core/lib/promise/pipe.h +505 -0
  689. data/src/core/lib/promise/poll.h +19 -0
  690. data/src/core/lib/promise/seq.h +4 -5
  691. data/src/core/lib/promise/sleep.cc +5 -4
  692. data/src/core/lib/promise/sleep.h +1 -2
  693. data/src/core/lib/promise/try_concurrently.h +342 -0
  694. data/src/core/lib/promise/try_seq.h +11 -13
  695. data/src/core/lib/resolver/resolver.cc +17 -17
  696. data/src/core/lib/resolver/server_address.cc +18 -17
  697. data/src/core/lib/resolver/server_address.h +19 -21
  698. data/src/core/lib/resource_quota/api.cc +0 -1
  699. data/src/core/lib/resource_quota/api.h +1 -1
  700. data/src/core/lib/resource_quota/arena.cc +36 -17
  701. data/src/core/lib/resource_quota/arena.h +107 -18
  702. data/src/core/lib/resource_quota/memory_quota.cc +140 -43
  703. data/src/core/lib/resource_quota/memory_quota.h +85 -23
  704. data/src/core/lib/resource_quota/resource_quota.h +1 -1
  705. data/src/core/lib/security/authorization/authorization_policy_provider.h +1 -1
  706. data/src/core/lib/security/authorization/authorization_policy_provider_vtable.cc +0 -1
  707. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
  708. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
  709. data/src/core/lib/security/authorization/matchers.cc +25 -22
  710. data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
  711. data/src/core/lib/security/authorization/rbac_policy.h +1 -1
  712. data/src/core/lib/security/context/security_context.cc +22 -23
  713. data/src/core/lib/security/context/security_context.h +40 -30
  714. data/src/core/lib/security/credentials/alts/alts_credentials.cc +17 -17
  715. data/src/core/lib/security/credentials/alts/alts_credentials.h +50 -50
  716. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +19 -19
  717. data/src/core/lib/security/credentials/alts/check_gcp_environment.h +41 -41
  718. data/src/core/lib/security/credentials/alts/check_gcp_environment_linux.cc +17 -17
  719. data/src/core/lib/security/credentials/alts/check_gcp_environment_no_op.cc +18 -17
  720. data/src/core/lib/security/credentials/alts/check_gcp_environment_windows.cc +18 -17
  721. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_client_options.cc +19 -19
  722. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.cc +18 -18
  723. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_options.h +36 -37
  724. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +18 -18
  725. data/src/core/lib/security/credentials/call_creds_util.h +1 -1
  726. data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
  727. data/src/core/lib/security/credentials/composite/composite_credentials.cc +22 -22
  728. data/src/core/lib/security/credentials/composite/composite_credentials.h +20 -21
  729. data/src/core/lib/security/credentials/credentials.cc +19 -18
  730. data/src/core/lib/security/credentials/credentials.h +34 -33
  731. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
  732. data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
  733. data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
  734. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
  735. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
  736. data/src/core/lib/security/credentials/fake/fake_credentials.cc +20 -19
  737. data/src/core/lib/security/credentials/fake/fake_credentials.h +34 -35
  738. data/src/core/lib/security/credentials/google_default/credentials_generic.cc +17 -17
  739. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +75 -73
  740. data/src/core/lib/security/credentials/google_default/google_default_credentials.h +18 -19
  741. data/src/core/lib/security/credentials/iam/iam_credentials.cc +18 -17
  742. data/src/core/lib/security/credentials/iam/iam_credentials.h +18 -18
  743. data/src/core/lib/security/credentials/jwt/json_token.cc +24 -25
  744. data/src/core/lib/security/credentials/jwt/json_token.h +32 -32
  745. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +18 -18
  746. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +18 -19
  747. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +75 -75
  748. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +43 -43
  749. data/src/core/lib/security/credentials/local/local_credentials.cc +17 -17
  750. data/src/core/lib/security/credentials/local/local_credentials.h +20 -20
  751. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +52 -59
  752. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +19 -19
  753. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +24 -23
  754. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +22 -22
  755. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +19 -20
  756. data/src/core/lib/security/credentials/ssl/ssl_credentials.h +18 -18
  757. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +20 -28
  758. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
  759. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +30 -43
  760. data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
  761. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +18 -18
  762. data/src/core/lib/security/credentials/tls/tls_credentials.cc +18 -19
  763. data/src/core/lib/security/credentials/tls/tls_credentials.h +18 -18
  764. data/src/core/lib/security/credentials/xds/xds_credentials.cc +1 -2
  765. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  766. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +32 -38
  767. data/src/core/lib/security/security_connector/alts/alts_security_connector.h +41 -42
  768. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +32 -41
  769. data/src/core/lib/security/security_connector/fake/fake_security_connector.h +20 -21
  770. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
  771. data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +3 -8
  772. data/src/core/lib/security/security_connector/load_system_roots.h +18 -18
  773. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +18 -18
  774. data/src/core/lib/security/security_connector/load_system_roots_supported.cc +19 -22
  775. data/src/core/lib/security/security_connector/load_system_roots_supported.h +19 -20
  776. data/src/core/lib/security/security_connector/local/local_security_connector.cc +30 -34
  777. data/src/core/lib/security/security_connector/local/local_security_connector.h +40 -41
  778. data/src/core/lib/security/security_connector/security_connector.cc +17 -17
  779. data/src/core/lib/security/security_connector/security_connector.h +32 -33
  780. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +34 -39
  781. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +38 -39
  782. data/src/core/lib/security/security_connector/ssl_utils.cc +37 -39
  783. data/src/core/lib/security/security_connector/ssl_utils.h +31 -31
  784. data/src/core/lib/security/security_connector/ssl_utils_config.cc +22 -22
  785. data/src/core/lib/security/security_connector/ssl_utils_config.h +18 -19
  786. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +42 -48
  787. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +17 -17
  788. data/src/core/lib/security/transport/auth_filters.h +18 -18
  789. data/src/core/lib/security/transport/client_auth_filter.cc +21 -21
  790. data/src/core/lib/security/transport/secure_endpoint.cc +54 -56
  791. data/src/core/lib/security/transport/secure_endpoint.h +22 -22
  792. data/src/core/lib/security/transport/security_handshaker.cc +70 -70
  793. data/src/core/lib/security/transport/security_handshaker.h +19 -19
  794. data/src/core/lib/security/transport/server_auth_filter.cc +43 -44
  795. data/src/core/lib/security/transport/tsi_error.cc +23 -20
  796. data/src/core/lib/security/transport/tsi_error.h +18 -18
  797. data/src/core/lib/security/util/json_util.cc +21 -22
  798. data/src/core/lib/security/util/json_util.h +18 -18
  799. data/src/core/lib/service_config/service_config.h +2 -2
  800. data/src/core/lib/service_config/service_config_call_data.h +7 -1
  801. data/src/core/lib/service_config/service_config_impl.cc +111 -158
  802. data/src/core/lib/service_config/service_config_impl.h +14 -17
  803. data/src/core/lib/service_config/service_config_parser.cc +14 -31
  804. data/src/core/lib/service_config/service_config_parser.h +14 -10
  805. data/src/core/lib/slice/b64.cc +26 -26
  806. data/src/core/lib/slice/b64.h +29 -29
  807. data/src/core/lib/slice/percent_encoding.cc +17 -17
  808. data/src/core/lib/slice/percent_encoding.h +24 -24
  809. data/src/core/lib/slice/slice.cc +44 -38
  810. data/src/core/lib/slice/slice.h +57 -11
  811. data/src/core/lib/slice/slice_buffer.cc +63 -59
  812. data/src/core/lib/slice/slice_buffer.h +27 -2
  813. data/src/core/lib/slice/slice_internal.h +31 -39
  814. data/src/core/lib/slice/slice_refcount.h +34 -19
  815. data/src/core/lib/slice/slice_string_helpers.cc +17 -17
  816. data/src/core/lib/slice/slice_string_helpers.h +19 -19
  817. data/src/core/lib/surface/api_trace.cc +17 -17
  818. data/src/core/lib/surface/api_trace.h +22 -22
  819. data/src/core/lib/surface/byte_buffer.cc +22 -23
  820. data/src/core/lib/surface/byte_buffer_reader.cc +23 -23
  821. data/src/core/lib/surface/call.cc +1521 -335
  822. data/src/core/lib/surface/call.h +86 -39
  823. data/src/core/lib/surface/call_details.cc +20 -21
  824. data/src/core/lib/surface/call_log_batch.cc +18 -18
  825. data/src/core/lib/surface/call_test_only.h +30 -30
  826. data/src/core/lib/surface/call_trace.cc +113 -0
  827. data/src/core/{ext/filters/http/message_compress/message_decompress_filter.h → lib/surface/call_trace.h} +10 -12
  828. data/src/core/lib/surface/channel.cc +62 -67
  829. data/src/core/lib/surface/channel.h +40 -32
  830. data/src/core/lib/surface/channel_init.cc +17 -17
  831. data/src/core/lib/surface/channel_init.h +18 -18
  832. data/src/core/lib/surface/channel_ping.cc +19 -19
  833. data/src/core/lib/surface/channel_stack_type.cc +21 -17
  834. data/src/core/lib/surface/channel_stack_type.h +20 -18
  835. data/src/core/lib/surface/completion_queue.cc +173 -191
  836. data/src/core/lib/surface/completion_queue.h +32 -32
  837. data/src/core/lib/surface/completion_queue_factory.cc +28 -28
  838. data/src/core/lib/surface/completion_queue_factory.h +20 -20
  839. data/src/core/lib/surface/event_string.cc +17 -17
  840. data/src/core/lib/surface/event_string.h +20 -20
  841. data/src/core/lib/surface/init.cc +29 -58
  842. data/src/core/lib/surface/init.h +18 -18
  843. data/src/core/lib/surface/init_internally.cc +1 -0
  844. data/src/core/lib/surface/init_internally.h +9 -0
  845. data/src/core/lib/surface/lame_client.cc +28 -26
  846. data/src/core/lib/surface/lame_client.h +19 -19
  847. data/src/core/lib/surface/metadata_array.cc +17 -18
  848. data/src/core/lib/surface/server.cc +61 -83
  849. data/src/core/lib/surface/server.h +5 -7
  850. data/src/core/lib/surface/validate_metadata.cc +28 -29
  851. data/src/core/lib/surface/validate_metadata.h +18 -18
  852. data/src/core/lib/surface/version.cc +21 -21
  853. data/src/core/lib/transport/bdp_estimator.cc +17 -17
  854. data/src/core/lib/transport/bdp_estimator.h +18 -19
  855. data/src/core/lib/transport/connectivity_state.cc +19 -19
  856. data/src/core/lib/transport/connectivity_state.h +19 -19
  857. data/src/core/lib/transport/error_utils.cc +51 -45
  858. data/src/core/lib/transport/error_utils.h +21 -21
  859. data/src/core/lib/transport/handshaker.cc +49 -46
  860. data/src/core/lib/transport/handshaker.h +43 -38
  861. data/src/core/lib/transport/handshaker_factory.h +44 -18
  862. data/src/core/lib/transport/handshaker_registry.cc +25 -19
  863. data/src/core/lib/transport/handshaker_registry.h +21 -22
  864. data/src/core/lib/transport/http2_errors.h +20 -20
  865. data/src/core/lib/transport/http_connect_handshaker.cc +40 -41
  866. data/src/core/lib/transport/http_connect_handshaker.h +18 -18
  867. data/src/core/lib/transport/metadata_batch.cc +4 -1
  868. data/src/core/lib/transport/metadata_batch.h +46 -20
  869. data/src/core/lib/transport/parsed_metadata.cc +2 -6
  870. data/src/core/lib/transport/parsed_metadata.h +1 -0
  871. data/src/core/lib/transport/pid_controller.cc +20 -20
  872. data/src/core/lib/transport/pid_controller.h +24 -24
  873. data/src/core/lib/transport/status_conversion.cc +22 -22
  874. data/src/core/lib/transport/status_conversion.h +20 -20
  875. data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
  876. data/src/core/lib/transport/tcp_connect_handshaker.h +1 -1
  877. data/src/core/lib/transport/timeout_encoding.cc +22 -22
  878. data/src/core/lib/transport/timeout_encoding.h +18 -18
  879. data/src/core/lib/transport/transport.cc +88 -41
  880. data/src/core/lib/transport/transport.h +193 -195
  881. data/src/core/lib/transport/transport_impl.h +42 -42
  882. data/src/core/lib/transport/transport_op_string.cc +26 -25
  883. data/src/core/plugin_registry/grpc_plugin_registry.cc +25 -27
  884. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +7 -14
  885. data/src/core/tsi/alts/crypt/aes_gcm.cc +20 -20
  886. data/src/core/tsi/alts/crypt/gsec.cc +26 -26
  887. data/src/core/tsi/alts/crypt/gsec.h +334 -334
  888. data/src/core/tsi/alts/frame_protector/alts_counter.cc +23 -23
  889. data/src/core/tsi/alts/frame_protector/alts_counter.h +66 -66
  890. data/src/core/tsi/alts/frame_protector/alts_crypter.cc +19 -19
  891. data/src/core/tsi/alts/frame_protector/alts_crypter.h +206 -206
  892. data/src/core/tsi/alts/frame_protector/alts_frame_protector.cc +72 -71
  893. data/src/core/tsi/alts/frame_protector/alts_frame_protector.h +38 -38
  894. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.cc +18 -18
  895. data/src/core/tsi/alts/frame_protector/alts_record_protocol_crypter_common.h +80 -81
  896. data/src/core/tsi/alts/frame_protector/alts_seal_privacy_integrity_crypter.cc +22 -22
  897. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +22 -22
  898. data/src/core/tsi/alts/frame_protector/frame_handler.cc +26 -25
  899. data/src/core/tsi/alts/frame_protector/frame_handler.h +166 -166
  900. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +78 -77
  901. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +99 -99
  902. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +18 -17
  903. data/src/core/tsi/alts/handshaker/alts_shared_resource.h +41 -42
  904. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +37 -36
  905. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +58 -58
  906. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +20 -20
  907. data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +21 -20
  908. data/src/core/tsi/alts/handshaker/alts_tsi_utils.h +36 -36
  909. data/src/core/tsi/alts/handshaker/transport_security_common_api.cc +19 -19
  910. data/src/core/tsi/alts/handshaker/transport_security_common_api.h +102 -101
  911. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +45 -44
  912. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.h +38 -39
  913. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +38 -36
  914. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.h +33 -34
  915. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol.h +65 -66
  916. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +32 -31
  917. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +53 -54
  918. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.cc +54 -53
  919. data/src/core/tsi/alts/zero_copy_frame_protector/alts_iovec_record_protocol.h +138 -139
  920. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +58 -57
  921. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.h +41 -42
  922. data/src/core/tsi/fake_transport_security.cc +80 -79
  923. data/src/core/tsi/fake_transport_security.h +30 -30
  924. data/src/core/tsi/local_transport_security.cc +34 -33
  925. data/src/core/tsi/local_transport_security.h +31 -31
  926. data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +8 -3
  927. data/src/core/tsi/ssl/session_cache/ssl_session.h +18 -18
  928. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +19 -19
  929. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +18 -17
  930. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +19 -19
  931. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +25 -20
  932. data/src/core/tsi/ssl_transport_security.cc +139 -323
  933. data/src/core/tsi/ssl_transport_security.h +201 -200
  934. data/src/core/tsi/ssl_transport_security_utils.cc +250 -0
  935. data/src/core/tsi/ssl_transport_security_utils.h +147 -0
  936. data/src/core/tsi/ssl_types.h +25 -25
  937. data/src/core/tsi/transport_security.cc +26 -26
  938. data/src/core/tsi/transport_security.h +45 -45
  939. data/src/core/tsi/transport_security_grpc.cc +20 -20
  940. data/src/core/tsi/transport_security_grpc.h +39 -39
  941. data/src/core/tsi/transport_security_interface.h +330 -330
  942. data/src/ruby/ext/grpc/{ext-export-truffleruby.clang → ext-export-truffleruby-with-ruby-abi-version.clang} +0 -0
  943. data/src/ruby/ext/grpc/{ext-export-truffleruby.gcc → ext-export-truffleruby-with-ruby-abi-version.gcc} +0 -0
  944. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.clang +2 -0
  945. data/src/ruby/ext/grpc/ext-export-with-ruby-abi-version.gcc +7 -0
  946. data/src/ruby/ext/grpc/ext-export.clang +0 -1
  947. data/src/ruby/ext/grpc/ext-export.gcc +1 -2
  948. data/src/ruby/ext/grpc/extconf.rb +47 -2
  949. data/src/ruby/ext/grpc/rb_call.c +1 -0
  950. data/src/ruby/ext/grpc/rb_channel.c +1 -0
  951. data/src/ruby/ext/grpc/rb_channel_args.c +1 -0
  952. data/src/ruby/ext/grpc/rb_compression_options.c +1 -1
  953. data/src/ruby/ext/grpc/rb_grpc.c +1 -0
  954. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +38 -38
  955. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +59 -59
  956. data/src/ruby/lib/grpc/generic/bidi_call.rb +2 -0
  957. data/src/ruby/lib/grpc/version.rb +1 -1
  958. data/src/ruby/spec/channel_spec.rb +0 -43
  959. data/src/ruby/spec/client_server_spec.rb +20 -8
  960. data/src/ruby/spec/generic/active_call_spec.rb +12 -3
  961. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
  962. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
  963. data/third_party/re2/re2/bitstate.cc +3 -3
  964. data/third_party/re2/re2/dfa.cc +13 -13
  965. data/third_party/re2/re2/nfa.cc +4 -4
  966. data/third_party/re2/re2/onepass.cc +2 -2
  967. data/third_party/re2/re2/prefilter_tree.cc +27 -59
  968. data/third_party/re2/re2/prefilter_tree.h +3 -2
  969. data/third_party/re2/re2/prog.cc +11 -2
  970. data/third_party/re2/re2/prog.h +17 -5
  971. data/third_party/re2/re2/re2.cc +6 -11
  972. data/third_party/re2/re2/re2.h +1 -1
  973. data/third_party/re2/re2/regexp.cc +1 -2
  974. data/third_party/re2/re2/stringpiece.h +10 -7
  975. data/third_party/re2/re2/unicode_casefold.cc +25 -11
  976. data/third_party/re2/re2/unicode_groups.cc +319 -151
  977. data/third_party/re2/re2/walker-inl.h +3 -2
  978. data/third_party/re2/util/mutex.h +4 -4
  979. data/third_party/zlib/compress.c +3 -3
  980. data/third_party/zlib/crc32.c +21 -12
  981. data/third_party/zlib/deflate.c +112 -106
  982. data/third_party/zlib/deflate.h +2 -2
  983. data/third_party/zlib/gzlib.c +1 -1
  984. data/third_party/zlib/gzread.c +3 -5
  985. data/third_party/zlib/gzwrite.c +1 -1
  986. data/third_party/zlib/infback.c +10 -7
  987. data/third_party/zlib/inflate.c +5 -2
  988. data/third_party/zlib/inftrees.c +2 -2
  989. data/third_party/zlib/inftrees.h +1 -1
  990. data/third_party/zlib/trees.c +61 -62
  991. data/third_party/zlib/uncompr.c +2 -2
  992. data/third_party/zlib/zconf.h +16 -3
  993. data/third_party/zlib/zlib.h +10 -10
  994. data/third_party/zlib/zutil.c +9 -7
  995. data/third_party/zlib/zutil.h +1 -0
  996. metadata +146 -40
  997. data/include/grpc/impl/codegen/gpr_slice.h +0 -71
  998. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
  999. data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
  1000. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +0 -332
  1001. data/src/core/ext/filters/http/message_compress/message_compress_filter.h +0 -52
  1002. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -322
  1003. data/src/core/ext/filters/server_config_selector/server_config_selector.cc +0 -62
  1004. data/src/core/lib/gpr/murmur_hash.cc +0 -82
  1005. data/src/core/lib/gpr/murmur_hash.h +0 -29
  1006. data/src/core/lib/gpr/tls.h +0 -156
  1007. data/src/core/lib/promise/call_push_pull.h +0 -148
  1008. data/src/core/lib/slice/slice_api.cc +0 -39
  1009. data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -23,13 +23,11 @@
23
23
  #include <set>
24
24
  #include <utility>
25
25
 
26
- #include "absl/memory/memory.h"
27
26
  #include "absl/status/status.h"
28
27
  #include "absl/status/statusor.h"
29
28
  #include "absl/strings/str_cat.h"
30
29
  #include "absl/strings/str_format.h"
31
30
  #include "absl/strings/str_join.h"
32
- #include "absl/strings/strip.h"
33
31
  #include "envoy/config/core/v3/address.upb.h"
34
32
  #include "envoy/config/core/v3/base.upb.h"
35
33
  #include "envoy/config/core/v3/config_source.upb.h"
@@ -57,44 +55,31 @@
57
55
  #include "src/core/lib/address_utils/sockaddr_utils.h"
58
56
  #include "src/core/lib/debug/trace.h"
59
57
  #include "src/core/lib/gprpp/host_port.h"
60
- #include "src/core/lib/gprpp/status_helper.h"
61
- #include "src/core/lib/iomgr/error.h"
58
+ #include "src/core/lib/gprpp/match.h"
59
+ #include "src/core/lib/gprpp/validation_errors.h"
62
60
  #include "src/core/lib/iomgr/sockaddr.h"
63
- #include "src/core/lib/json/json.h"
64
61
 
65
62
  namespace grpc_core {
66
63
 
67
- //
68
- // XdsListenerResource::DownstreamTlsContext
69
- //
70
-
71
- std::string XdsListenerResource::DownstreamTlsContext::ToString() const {
72
- return absl::StrFormat("common_tls_context=%s, require_client_certificate=%s",
73
- common_tls_context.ToString(),
74
- require_client_certificate ? "true" : "false");
75
- }
76
-
77
- bool XdsListenerResource::DownstreamTlsContext::Empty() const {
78
- return common_tls_context.Empty();
79
- }
80
-
81
64
  //
82
65
  // XdsListenerResource::HttpConnectionManager
83
66
  //
84
67
 
85
68
  std::string XdsListenerResource::HttpConnectionManager::ToString() const {
86
69
  std::vector<std::string> contents;
87
- contents.push_back(absl::StrFormat(
88
- "route_config_name=%s",
89
- !route_config_name.empty() ? route_config_name.c_str() : "<inlined>"));
90
- contents.push_back(absl::StrFormat("http_max_stream_duration=%s",
91
- http_max_stream_duration.ToString()));
92
- if (rds_update.has_value()) {
93
- contents.push_back(
94
- absl::StrFormat("rds_update=%s", rds_update->ToString()));
95
- }
70
+ contents.push_back(Match(
71
+ route_config,
72
+ [](const std::string& rds_name) {
73
+ return absl::StrCat("rds_name=", rds_name);
74
+ },
75
+ [](const XdsRouteConfigResource& route_config) {
76
+ return absl::StrCat("route_config=", route_config.ToString());
77
+ }));
78
+ contents.push_back(absl::StrCat("http_max_stream_duration=",
79
+ http_max_stream_duration.ToString()));
96
80
  if (!http_filters.empty()) {
97
81
  std::vector<std::string> filter_strings;
82
+ filter_strings.reserve(http_filters.size());
98
83
  for (const auto& http_filter : http_filters) {
99
84
  filter_strings.push_back(http_filter.ToString());
100
85
  }
@@ -105,7 +90,7 @@ std::string XdsListenerResource::HttpConnectionManager::ToString() const {
105
90
  }
106
91
 
107
92
  //
108
- // XdsListenerResource::HttpFilter
93
+ // XdsListenerResource::HttpConnectionManager::HttpFilter
109
94
  //
110
95
 
111
96
  std::string XdsListenerResource::HttpConnectionManager::HttpFilter::ToString()
@@ -113,6 +98,20 @@ std::string XdsListenerResource::HttpConnectionManager::HttpFilter::ToString()
113
98
  return absl::StrCat("{name=", name, ", config=", config.ToString(), "}");
114
99
  }
115
100
 
101
+ //
102
+ // XdsListenerResource::DownstreamTlsContext
103
+ //
104
+
105
+ std::string XdsListenerResource::DownstreamTlsContext::ToString() const {
106
+ return absl::StrFormat("common_tls_context=%s, require_client_certificate=%s",
107
+ common_tls_context.ToString(),
108
+ require_client_certificate ? "true" : "false");
109
+ }
110
+
111
+ bool XdsListenerResource::DownstreamTlsContext::Empty() const {
112
+ return common_tls_context.Empty();
113
+ }
114
+
116
115
  //
117
116
  // XdsListenerResource::FilterChainData
118
117
  //
@@ -165,6 +164,7 @@ std::string FilterChain::FilterChainMatch::ToString() const {
165
164
  }
166
165
  if (!prefix_ranges.empty()) {
167
166
  std::vector<std::string> prefix_ranges_content;
167
+ prefix_ranges_content.reserve(prefix_ranges.size());
168
168
  for (const auto& range : prefix_ranges) {
169
169
  prefix_ranges_content.push_back(range.ToString());
170
170
  }
@@ -180,6 +180,7 @@ std::string FilterChain::FilterChainMatch::ToString() const {
180
180
  }
181
181
  if (!source_prefix_ranges.empty()) {
182
182
  std::vector<std::string> source_prefix_ranges_content;
183
+ source_prefix_ranges_content.reserve(source_prefix_ranges.size());
183
184
  for (const auto& range : source_prefix_ranges) {
184
185
  source_prefix_ranges_content.push_back(range.ToString());
185
186
  }
@@ -244,26 +245,36 @@ std::string XdsListenerResource::FilterChainMap::ToString() const {
244
245
  }
245
246
 
246
247
  //
247
- // XdsListenerResource
248
+ // XdsListenerResource::TcpListener
248
249
  //
249
250
 
250
- std::string XdsListenerResource::ToString() const {
251
+ std::string XdsListenerResource::TcpListener::ToString() const {
251
252
  std::vector<std::string> contents;
252
- if (type == ListenerType::kTcpListener) {
253
- contents.push_back(absl::StrCat("address=", address));
254
- contents.push_back(
255
- absl::StrCat("filter_chain_map=", filter_chain_map.ToString()));
256
- if (default_filter_chain.has_value()) {
257
- contents.push_back(absl::StrCat("default_filter_chain=",
258
- default_filter_chain->ToString()));
259
- }
260
- } else if (type == ListenerType::kHttpApiListener) {
261
- contents.push_back(absl::StrFormat("http_connection_manager=%s",
262
- http_connection_manager.ToString()));
253
+ contents.push_back(absl::StrCat("address=", address));
254
+ contents.push_back(
255
+ absl::StrCat("filter_chain_map=", filter_chain_map.ToString()));
256
+ if (default_filter_chain.has_value()) {
257
+ contents.push_back(absl::StrCat("default_filter_chain=",
258
+ default_filter_chain->ToString()));
263
259
  }
264
260
  return absl::StrCat("{", absl::StrJoin(contents, ", "), "}");
265
261
  }
266
262
 
263
+ //
264
+ // XdsListenerResource
265
+ //
266
+
267
+ std::string XdsListenerResource::ToString() const {
268
+ return Match(
269
+ listener,
270
+ [](const HttpConnectionManager& hcm) {
271
+ return absl::StrCat("{http_connection_manager=", hcm.ToString(), "}");
272
+ },
273
+ [](const TcpListener& tcp) {
274
+ return absl::StrCat("{tcp_listener=", tcp.ToString(), "}");
275
+ });
276
+ }
277
+
267
278
  //
268
279
  // XdsListenerResourceType
269
280
  //
@@ -287,111 +298,131 @@ void MaybeLogHttpConnectionManager(
287
298
  }
288
299
  }
289
300
 
290
- absl::StatusOr<XdsListenerResource::HttpConnectionManager>
291
- HttpConnectionManagerParse(
301
+ XdsListenerResource::HttpConnectionManager HttpConnectionManagerParse(
292
302
  bool is_client, const XdsResourceType::DecodeContext& context,
293
- const envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager*
294
- http_connection_manager_proto,
295
- bool is_v2) {
303
+ XdsExtension extension, ValidationErrors* errors) {
304
+ if (extension.type !=
305
+ "envoy.extensions.filters.network.http_connection_manager.v3"
306
+ ".HttpConnectionManager") {
307
+ errors->AddError("unsupported filter type");
308
+ return {};
309
+ }
310
+ auto* serialized_hcm_config =
311
+ absl::get_if<absl::string_view>(&extension.value);
312
+ if (serialized_hcm_config == nullptr) {
313
+ errors->AddError("could not parse HttpConnectionManager config");
314
+ return {};
315
+ }
316
+ const auto* http_connection_manager_proto =
317
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_parse(
318
+ serialized_hcm_config->data(), serialized_hcm_config->size(),
319
+ context.arena);
320
+ if (http_connection_manager_proto == nullptr) {
321
+ errors->AddError("could not parse HttpConnectionManager config");
322
+ return {};
323
+ }
296
324
  MaybeLogHttpConnectionManager(context, http_connection_manager_proto);
297
- std::vector<std::string> errors;
298
325
  XdsListenerResource::HttpConnectionManager http_connection_manager;
299
- // NACK a non-zero `xff_num_trusted_hops` and a `non-empty
300
- // original_ip_detection_extensions` as mentioned in
326
+ // xff_num_trusted_hops -- must be zero as per
301
327
  // https://github.com/grpc/proposal/blob/master/A41-xds-rbac.md
302
328
  if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_xff_num_trusted_hops(
303
329
  http_connection_manager_proto) != 0) {
304
- errors.emplace_back("'xff_num_trusted_hops' must be zero");
330
+ ValidationErrors::ScopedField field(errors, ".xff_num_trusted_hops");
331
+ errors->AddError("must be zero");
305
332
  }
333
+ // original_ip_detection_extensions -- must be empty as per
334
+ // https://github.com/grpc/proposal/blob/master/A41-xds-rbac.md
306
335
  if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_original_ip_detection_extensions(
307
336
  http_connection_manager_proto)) {
308
- errors.emplace_back("'original_ip_detection_extensions' must be empty");
337
+ ValidationErrors::ScopedField field(errors,
338
+ ".original_ip_detection_extensions");
339
+ errors->AddError("must be empty");
309
340
  }
310
- // Obtain max_stream_duration from Http Protocol Options.
341
+ // common_http_protocol_options
311
342
  const envoy_config_core_v3_HttpProtocolOptions* options =
312
343
  envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_common_http_protocol_options(
313
344
  http_connection_manager_proto);
314
345
  if (options != nullptr) {
346
+ // max_stream_duration
315
347
  const google_protobuf_Duration* duration =
316
348
  envoy_config_core_v3_HttpProtocolOptions_max_stream_duration(options);
317
349
  if (duration != nullptr) {
350
+ ValidationErrors::ScopedField field(
351
+ errors, ".common_http_protocol_options.max_stream_duration");
318
352
  http_connection_manager.http_max_stream_duration =
319
- ParseDuration(duration);
353
+ ParseDuration(duration, errors);
320
354
  }
321
355
  }
322
- // Parse filters.
323
- if (!is_v2) {
356
+ // http_filters
357
+ {
358
+ ValidationErrors::ScopedField field(errors, ".http_filters");
359
+ const auto& http_filter_registry =
360
+ static_cast<const GrpcXdsBootstrap&>(context.client->bootstrap())
361
+ .http_filter_registry();
324
362
  size_t num_filters = 0;
325
363
  const auto* http_filters =
326
364
  envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_http_filters(
327
365
  http_connection_manager_proto, &num_filters);
328
366
  std::set<absl::string_view> names_seen;
367
+ const size_t original_error_size = errors->size();
329
368
  for (size_t i = 0; i < num_filters; ++i) {
369
+ ValidationErrors::ScopedField field(errors, absl::StrCat("[", i, "]"));
330
370
  const auto* http_filter = http_filters[i];
371
+ // name
331
372
  absl::string_view name = UpbStringToAbsl(
332
373
  envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_name(
333
374
  http_filter));
334
- if (name.empty()) {
335
- errors.emplace_back(absl::StrCat("empty filter name at index ", i));
336
- continue;
337
- }
338
- if (names_seen.find(name) != names_seen.end()) {
339
- errors.emplace_back(absl::StrCat("duplicate HTTP filter name: ", name));
340
- continue;
375
+ {
376
+ ValidationErrors::ScopedField field(errors, ".name");
377
+ if (name.empty()) {
378
+ errors->AddError("empty filter name");
379
+ continue;
380
+ }
381
+ if (names_seen.find(name) != names_seen.end()) {
382
+ errors->AddError(absl::StrCat("duplicate HTTP filter name: ", name));
383
+ continue;
384
+ }
341
385
  }
342
386
  names_seen.insert(name);
387
+ // is_optional
343
388
  const bool is_optional =
344
389
  envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_is_optional(
345
390
  http_filter);
346
- const google_protobuf_Any* any =
347
- envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_typed_config(
348
- http_filter);
349
- if (any == nullptr) {
350
- if (!is_optional) {
351
- errors.emplace_back(absl::StrCat(
352
- "no filter config specified for filter name ", name));
391
+ // typed_config
392
+ {
393
+ ValidationErrors::ScopedField field(errors, ".typed_config");
394
+ const google_protobuf_Any* typed_config =
395
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpFilter_typed_config(
396
+ http_filter);
397
+ auto extension = ExtractXdsExtension(context, typed_config, errors);
398
+ if (!extension.has_value()) continue;
399
+ const XdsHttpFilterImpl* filter_impl =
400
+ http_filter_registry.GetFilterForType(extension->type);
401
+ if (filter_impl == nullptr) {
402
+ if (!is_optional) errors->AddError("unsupported filter type");
403
+ continue;
353
404
  }
354
- continue;
355
- }
356
- auto filter_type = ExtractExtensionTypeName(context, any);
357
- if (!filter_type.ok()) {
358
- errors.emplace_back(absl::StrCat("filter name ", name, ": ",
359
- filter_type.status().message()));
360
- continue;
361
- }
362
- const XdsHttpFilterImpl* filter_impl =
363
- XdsHttpFilterRegistry::GetFilterForType(filter_type->type);
364
- if (filter_impl == nullptr) {
365
- if (!is_optional) {
366
- errors.emplace_back(absl::StrCat(
367
- "no filter registered for config type ", filter_type->type));
405
+ if ((is_client && !filter_impl->IsSupportedOnClients()) ||
406
+ (!is_client && !filter_impl->IsSupportedOnServers())) {
407
+ if (!is_optional) {
408
+ errors->AddError(absl::StrCat("filter is not supported on ",
409
+ is_client ? "clients" : "servers"));
410
+ }
411
+ continue;
368
412
  }
369
- continue;
370
- }
371
- if ((is_client && !filter_impl->IsSupportedOnClients()) ||
372
- (!is_client && !filter_impl->IsSupportedOnServers())) {
373
- if (!is_optional) {
374
- errors.emplace_back(absl::StrFormat(
375
- "Filter %s is not supported on %s", filter_type->type,
376
- is_client ? "clients" : "servers"));
413
+ absl::optional<XdsHttpFilterImpl::FilterConfig> filter_config =
414
+ filter_impl->GenerateFilterConfig(context, std::move(*extension),
415
+ errors);
416
+ if (filter_config.has_value()) {
417
+ http_connection_manager.http_filters.emplace_back(
418
+ XdsListenerResource::HttpConnectionManager::HttpFilter{
419
+ std::string(name), std::move(*filter_config)});
377
420
  }
378
- continue;
379
- }
380
- absl::StatusOr<XdsHttpFilterImpl::FilterConfig> filter_config =
381
- filter_impl->GenerateFilterConfig(google_protobuf_Any_value(any),
382
- context.arena);
383
- if (!filter_config.ok()) {
384
- errors.emplace_back(absl::StrCat(
385
- "filter config for type ", filter_type->type,
386
- " failed to parse: ", StatusToString(filter_config.status())));
387
- continue;
388
421
  }
389
- http_connection_manager.http_filters.emplace_back(
390
- XdsListenerResource::HttpConnectionManager::HttpFilter{
391
- std::string(name), std::move(*filter_config)});
392
422
  }
393
- if (http_connection_manager.http_filters.empty()) {
394
- errors.emplace_back("Expected at least one HTTP filter");
423
+ if (errors->size() == original_error_size &&
424
+ http_connection_manager.http_filters.empty()) {
425
+ errors->AddError("expected at least one HTTP filter");
395
426
  }
396
427
  // Make sure that the last filter is terminal and non-last filters are
397
428
  // non-terminal. Note that this check is being performed in a separate loop
@@ -399,12 +430,12 @@ HttpConnectionManagerParse(
399
430
  // out of which only one gets added in the final list.
400
431
  for (const auto& http_filter : http_connection_manager.http_filters) {
401
432
  const XdsHttpFilterImpl* filter_impl =
402
- XdsHttpFilterRegistry::GetFilterForType(
433
+ http_filter_registry.GetFilterForType(
403
434
  http_filter.config.config_proto_type_name);
404
435
  if (&http_filter != &http_connection_manager.http_filters.back()) {
405
436
  // Filters before the last filter must not be terminal.
406
437
  if (filter_impl->IsTerminalFilter()) {
407
- errors.emplace_back(
438
+ errors->AddError(
408
439
  absl::StrCat("terminal filter for config type ",
409
440
  http_filter.config.config_proto_type_name,
410
441
  " must be the last filter in the chain"));
@@ -412,187 +443,168 @@ HttpConnectionManagerParse(
412
443
  } else {
413
444
  // The last filter must be terminal.
414
445
  if (!filter_impl->IsTerminalFilter()) {
415
- errors.emplace_back(
446
+ errors->AddError(
416
447
  absl::StrCat("non-terminal filter for config type ",
417
448
  http_filter.config.config_proto_type_name,
418
449
  " is the last filter in the chain"));
419
450
  }
420
451
  }
421
452
  }
453
+ }
454
+ // Found inlined route_config. Parse it to find the cluster_name.
455
+ if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(
456
+ http_connection_manager_proto)) {
457
+ const envoy_config_route_v3_RouteConfiguration* route_config =
458
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(
459
+ http_connection_manager_proto);
460
+ ValidationErrors::ScopedField field(errors, ".route_config");
461
+ http_connection_manager.route_config =
462
+ XdsRouteConfigResource::Parse(context, route_config, errors);
422
463
  } else {
423
- // If using a v2 config, we just hard-code a list containing only the
424
- // router filter without actually looking at the config. This ensures
425
- // that the right thing happens in the xds resolver without having
426
- // to expose whether the resource we received was v2 or v3.
427
- http_connection_manager.http_filters.emplace_back(
428
- XdsListenerResource::HttpConnectionManager::HttpFilter{
429
- "router", {kXdsHttpRouterFilterConfigName, Json()}});
430
- }
431
- // Guarding parsing of RouteConfig on the server side with the environmental
432
- // variable since that's the first feature on the server side that will be
433
- // using this.
434
- if (is_client || XdsRbacEnabled()) {
435
- // Found inlined route_config. Parse it to find the cluster_name.
436
- if (envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_has_route_config(
437
- http_connection_manager_proto)) {
438
- const envoy_config_route_v3_RouteConfiguration* route_config =
439
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_route_config(
440
- http_connection_manager_proto);
441
- auto rds_update = XdsRouteConfigResource::Parse(context, route_config);
442
- if (!rds_update.ok()) {
443
- errors.emplace_back(rds_update.status().message());
444
- } else {
445
- http_connection_manager.rds_update = std::move(*rds_update);
446
- }
464
+ // Validate that RDS must be used to get the route_config dynamically.
465
+ const envoy_extensions_filters_network_http_connection_manager_v3_Rds* rds =
466
+ envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(
467
+ http_connection_manager_proto);
468
+ if (rds == nullptr) {
469
+ errors->AddError("neither route_config nor rds fields are present");
447
470
  } else {
448
- // Validate that RDS must be used to get the route_config dynamically.
449
- const envoy_extensions_filters_network_http_connection_manager_v3_Rds* rds =
450
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_rds(
451
- http_connection_manager_proto);
452
- if (rds == nullptr) {
453
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
454
- "HttpConnectionManager neither has inlined route_config nor RDS.");
455
- }
471
+ // Get the route_config_name.
472
+ http_connection_manager.route_config = UpbStringToStdString(
473
+ envoy_extensions_filters_network_http_connection_manager_v3_Rds_route_config_name(
474
+ rds));
456
475
  // Check that the ConfigSource specifies ADS.
457
476
  const envoy_config_core_v3_ConfigSource* config_source =
458
477
  envoy_extensions_filters_network_http_connection_manager_v3_Rds_config_source(
459
478
  rds);
479
+ ValidationErrors::ScopedField field(errors, ".rds.config_source");
460
480
  if (config_source == nullptr) {
461
- errors.emplace_back(
462
- "HttpConnectionManager missing config_source for RDS.");
481
+ errors->AddError("field not present");
463
482
  } else if (!envoy_config_core_v3_ConfigSource_has_ads(config_source) &&
464
483
  !envoy_config_core_v3_ConfigSource_has_self(config_source)) {
465
- errors.emplace_back(
466
- "HttpConnectionManager ConfigSource for RDS does not specify ADS "
467
- "or SELF.");
468
- } else {
469
- // Get the route_config_name.
470
- http_connection_manager.route_config_name = UpbStringToStdString(
471
- envoy_extensions_filters_network_http_connection_manager_v3_Rds_route_config_name(
472
- rds));
484
+ errors->AddError("ConfigSource does not specify ADS or SELF");
473
485
  }
474
486
  }
475
487
  }
476
- // Return result.
477
- if (!errors.empty()) {
478
- return absl::InvalidArgumentError(
479
- absl::StrCat("Errors parsing HttpConnectionManager config: [",
480
- absl::StrJoin(errors, "; "), "]"));
481
- }
482
488
  return http_connection_manager;
483
489
  }
484
490
 
485
491
  absl::StatusOr<XdsListenerResource> LdsResourceParseClient(
486
492
  const XdsResourceType::DecodeContext& context,
487
- const envoy_config_listener_v3_ApiListener* api_listener, bool is_v2) {
488
- const upb_StringView encoded_api_listener = google_protobuf_Any_value(
489
- envoy_config_listener_v3_ApiListener_api_listener(api_listener));
490
- const auto* http_connection_manager =
491
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_parse(
492
- encoded_api_listener.data, encoded_api_listener.size, context.arena);
493
- if (http_connection_manager == nullptr) {
494
- return absl::InvalidArgumentError(
495
- "Could not parse HttpConnectionManager config from ApiListener");
496
- }
497
- auto hcm = HttpConnectionManagerParse(true /* is_client */, context,
498
- http_connection_manager, is_v2);
499
- if (!hcm.ok()) return hcm.status();
493
+ const envoy_config_listener_v3_ApiListener* api_listener) {
500
494
  XdsListenerResource lds_update;
501
- lds_update.type = XdsListenerResource::ListenerType::kHttpApiListener;
502
- lds_update.http_connection_manager = std::move(*hcm);
503
- return lds_update;
495
+ ValidationErrors errors;
496
+ ValidationErrors::ScopedField field(&errors, "api_listener.api_listener");
497
+ auto* api_listener_field =
498
+ envoy_config_listener_v3_ApiListener_api_listener(api_listener);
499
+ auto extension = ExtractXdsExtension(context, api_listener_field, &errors);
500
+ if (extension.has_value()) {
501
+ lds_update.listener = HttpConnectionManagerParse(
502
+ /*is_client=*/true, context, std::move(*extension), &errors);
503
+ }
504
+ if (!errors.ok()) return errors.status("errors validating ApiListener");
505
+ return std::move(lds_update);
504
506
  }
505
507
 
506
- absl::StatusOr<XdsListenerResource::DownstreamTlsContext>
507
- DownstreamTlsContextParse(
508
+ XdsListenerResource::DownstreamTlsContext DownstreamTlsContextParse(
508
509
  const XdsResourceType::DecodeContext& context,
509
- const envoy_config_core_v3_TransportSocket* transport_socket) {
510
+ const envoy_config_core_v3_TransportSocket* transport_socket,
511
+ ValidationErrors* errors) {
512
+ ValidationErrors::ScopedField field(errors, ".typed_config");
510
513
  const auto* typed_config =
511
514
  envoy_config_core_v3_TransportSocket_typed_config(transport_socket);
512
- if (typed_config == nullptr) {
513
- return absl::InvalidArgumentError("transport socket typed config unset");
514
- }
515
- absl::string_view type_url = absl::StripPrefix(
516
- UpbStringToAbsl(google_protobuf_Any_type_url(typed_config)),
517
- "type.googleapis.com/");
518
- if (type_url !=
515
+ auto extension = ExtractXdsExtension(context, typed_config, errors);
516
+ if (!extension.has_value()) return {};
517
+ if (extension->type !=
519
518
  "envoy.extensions.transport_sockets.tls.v3.DownstreamTlsContext") {
520
- return absl::InvalidArgumentError(
521
- absl::StrCat("Unrecognized transport socket type: ", type_url));
519
+ ValidationErrors::ScopedField field(errors, ".type_url");
520
+ errors->AddError("unsupported transport socket type");
521
+ return {};
522
+ }
523
+ absl::string_view* serialized_downstream_tls_context =
524
+ absl::get_if<absl::string_view>(&extension->value);
525
+ if (serialized_downstream_tls_context == nullptr) {
526
+ errors->AddError("can't decode DownstreamTlsContext");
527
+ return {};
522
528
  }
523
- const upb_StringView encoded_downstream_tls_context =
524
- google_protobuf_Any_value(typed_config);
525
529
  const auto* downstream_tls_context_proto =
526
530
  envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_parse(
527
- encoded_downstream_tls_context.data,
528
- encoded_downstream_tls_context.size, context.arena);
531
+ serialized_downstream_tls_context->data(),
532
+ serialized_downstream_tls_context->size(), context.arena);
529
533
  if (downstream_tls_context_proto == nullptr) {
530
- return absl::InvalidArgumentError("Can't decode downstream tls context.");
534
+ errors->AddError("can't decode DownstreamTlsContext");
535
+ return {};
531
536
  }
532
- std::vector<std::string> errors;
533
537
  XdsListenerResource::DownstreamTlsContext downstream_tls_context;
534
538
  auto* common_tls_context =
535
539
  envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_common_tls_context(
536
540
  downstream_tls_context_proto);
537
541
  if (common_tls_context != nullptr) {
538
- auto common_context = CommonTlsContext::Parse(context, common_tls_context);
539
- if (!common_context.ok()) {
540
- errors.emplace_back(common_context.status().message());
541
- } else {
542
- downstream_tls_context.common_tls_context = std::move(*common_context);
542
+ ValidationErrors::ScopedField field(errors, ".common_tls_context");
543
+ downstream_tls_context.common_tls_context =
544
+ CommonTlsContext::Parse(context, common_tls_context, errors);
545
+ // Note: We can't be more specific about the field name for this
546
+ // error, because we don't know which fields they were found in
547
+ // inside of CommonTlsContext, so we make the error message a bit
548
+ // more verbose to compensate.
549
+ if (!downstream_tls_context.common_tls_context
550
+ .certificate_validation_context.match_subject_alt_names.empty()) {
551
+ errors->AddError("match_subject_alt_names not supported on servers");
543
552
  }
544
553
  }
554
+ // Note: We can't be more specific about the field name for this
555
+ // error, because we don't know which fields they were found in
556
+ // inside of CommonTlsContext, so we make the error message a bit
557
+ // more verbose to compensate.
558
+ if (downstream_tls_context.common_tls_context
559
+ .tls_certificate_provider_instance.instance_name.empty()) {
560
+ errors->AddError(
561
+ "TLS configuration provided but no "
562
+ "tls_certificate_provider_instance found");
563
+ }
545
564
  auto* require_client_certificate =
546
565
  envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_client_certificate(
547
566
  downstream_tls_context_proto);
548
567
  if (require_client_certificate != nullptr) {
549
568
  downstream_tls_context.require_client_certificate =
550
569
  google_protobuf_BoolValue_value(require_client_certificate);
570
+ if (downstream_tls_context.require_client_certificate &&
571
+ downstream_tls_context.common_tls_context.certificate_validation_context
572
+ .ca_certificate_provider_instance.instance_name.empty()) {
573
+ ValidationErrors::ScopedField field(errors,
574
+ ".require_client_certificate");
575
+ errors->AddError(
576
+ "client certificate required but no certificate "
577
+ "provider instance specified for validation");
578
+ }
551
579
  }
552
580
  auto* require_sni =
553
581
  envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_require_sni(
554
582
  downstream_tls_context_proto);
555
583
  if (require_sni != nullptr && google_protobuf_BoolValue_value(require_sni)) {
556
- errors.emplace_back("require_sni: unsupported");
584
+ ValidationErrors::ScopedField field(errors, ".require_sni");
585
+ errors->AddError("field unsupported");
557
586
  }
558
587
  if (envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_ocsp_staple_policy(
559
588
  downstream_tls_context_proto) !=
560
589
  envoy_extensions_transport_sockets_tls_v3_DownstreamTlsContext_LENIENT_STAPLING) {
561
- errors.emplace_back("ocsp_staple_policy: Only LENIENT_STAPLING supported");
562
- }
563
- if (downstream_tls_context.common_tls_context
564
- .tls_certificate_provider_instance.instance_name.empty()) {
565
- errors.emplace_back(
566
- "TLS configuration provided but no "
567
- "tls_certificate_provider_instance found.");
568
- }
569
- if (downstream_tls_context.require_client_certificate &&
570
- downstream_tls_context.common_tls_context.certificate_validation_context
571
- .ca_certificate_provider_instance.instance_name.empty()) {
572
- errors.emplace_back(
573
- "TLS configuration requires client certificates but no certificate "
574
- "provider instance specified for validation.");
575
- }
576
- if (!downstream_tls_context.common_tls_context.certificate_validation_context
577
- .match_subject_alt_names.empty()) {
578
- errors.emplace_back("match_subject_alt_names not supported on servers");
579
- }
580
- // Return result.
581
- if (!errors.empty()) {
582
- return absl::InvalidArgumentError(
583
- absl::StrCat("Errors parsing DownstreamTlsContext: [",
584
- absl::StrJoin(errors, "; "), "]"));
590
+ ValidationErrors::ScopedField field(errors, ".ocsp_staple_policy");
591
+ errors->AddError("value must be LENIENT_STAPLING");
585
592
  }
586
593
  return downstream_tls_context;
587
594
  }
588
595
 
589
- absl::StatusOr<XdsListenerResource::FilterChainMap::CidrRange> CidrRangeParse(
590
- const envoy_config_core_v3_CidrRange* cidr_range_proto) {
596
+ absl::optional<XdsListenerResource::FilterChainMap::CidrRange> CidrRangeParse(
597
+ const envoy_config_core_v3_CidrRange* cidr_range_proto,
598
+ ValidationErrors* errors) {
599
+ ValidationErrors::ScopedField field(errors, ".address_prefix");
591
600
  XdsListenerResource::FilterChainMap::CidrRange cidr_range;
592
601
  std::string address_prefix = UpbStringToStdString(
593
602
  envoy_config_core_v3_CidrRange_address_prefix(cidr_range_proto));
594
603
  auto address = StringToSockaddr(address_prefix, /*port=*/0);
595
- if (!address.ok()) return address.status();
604
+ if (!address.ok()) {
605
+ errors->AddError(address.status().message());
606
+ return absl::nullopt;
607
+ }
596
608
  cidr_range.address = *address;
597
609
  cidr_range.prefix_len = 0;
598
610
  auto* prefix_len_proto =
@@ -602,18 +614,20 @@ absl::StatusOr<XdsListenerResource::FilterChainMap::CidrRange> CidrRangeParse(
602
614
  google_protobuf_UInt32Value_value(prefix_len_proto),
603
615
  (reinterpret_cast<const grpc_sockaddr*>(cidr_range.address.addr))
604
616
  ->sa_family == GRPC_AF_INET
605
- ? uint32_t(32)
606
- : uint32_t(128));
617
+ ? uint32_t{32}
618
+ : uint32_t{128});
607
619
  }
608
620
  // Normalize the network address by masking it with prefix_len
609
621
  grpc_sockaddr_mask_bits(&cidr_range.address, cidr_range.prefix_len);
610
622
  return cidr_range;
611
623
  }
612
624
 
613
- absl::StatusOr<FilterChain::FilterChainMatch> FilterChainMatchParse(
614
- const envoy_config_listener_v3_FilterChainMatch* filter_chain_match_proto) {
615
- std::vector<std::string> errors;
625
+ absl::optional<FilterChain::FilterChainMatch> FilterChainMatchParse(
626
+ const envoy_config_listener_v3_FilterChainMatch* filter_chain_match_proto,
627
+ ValidationErrors* errors) {
616
628
  FilterChain::FilterChainMatch filter_chain_match;
629
+ const size_t original_error_size = errors->size();
630
+ // destination_port
617
631
  auto* destination_port =
618
632
  envoy_config_listener_v3_FilterChainMatch_destination_port(
619
633
  filter_chain_match_proto);
@@ -621,51 +635,56 @@ absl::StatusOr<FilterChain::FilterChainMatch> FilterChainMatchParse(
621
635
  filter_chain_match.destination_port =
622
636
  google_protobuf_UInt32Value_value(destination_port);
623
637
  }
638
+ // prefix_ranges
624
639
  size_t size = 0;
625
640
  auto* prefix_ranges = envoy_config_listener_v3_FilterChainMatch_prefix_ranges(
626
641
  filter_chain_match_proto, &size);
627
642
  filter_chain_match.prefix_ranges.reserve(size);
628
643
  for (size_t i = 0; i < size; i++) {
629
- auto cidr_range = CidrRangeParse(prefix_ranges[i]);
630
- if (!cidr_range.ok()) {
631
- errors.emplace_back(absl::StrCat("prefix range ", i, ": ",
632
- cidr_range.status().message()));
633
- continue;
644
+ ValidationErrors::ScopedField field(
645
+ errors, absl::StrCat(".prefix_ranges[", i, "]"));
646
+ auto cidr_range = CidrRangeParse(prefix_ranges[i], errors);
647
+ if (cidr_range.has_value()) {
648
+ filter_chain_match.prefix_ranges.push_back(*cidr_range);
634
649
  }
635
- filter_chain_match.prefix_ranges.push_back(*cidr_range);
636
650
  }
651
+ // source_type
637
652
  filter_chain_match.source_type =
638
653
  static_cast<XdsListenerResource::FilterChainMap::ConnectionSourceType>(
639
654
  envoy_config_listener_v3_FilterChainMatch_source_type(
640
655
  filter_chain_match_proto));
656
+ // source_prefix_ranges
641
657
  auto* source_prefix_ranges =
642
658
  envoy_config_listener_v3_FilterChainMatch_source_prefix_ranges(
643
659
  filter_chain_match_proto, &size);
644
660
  filter_chain_match.source_prefix_ranges.reserve(size);
645
661
  for (size_t i = 0; i < size; i++) {
646
- auto cidr_range = CidrRangeParse(source_prefix_ranges[i]);
647
- if (!cidr_range.ok()) {
648
- errors.emplace_back(absl::StrCat("source prefix range ", i, ": ",
649
- cidr_range.status().message()));
650
- continue;
662
+ ValidationErrors::ScopedField field(
663
+ errors, absl::StrCat(".source_prefix_ranges[", i, "]"));
664
+ auto cidr_range = CidrRangeParse(source_prefix_ranges[i], errors);
665
+ if (cidr_range.has_value()) {
666
+ filter_chain_match.source_prefix_ranges.push_back(*cidr_range);
651
667
  }
652
- filter_chain_match.source_prefix_ranges.push_back(*cidr_range);
653
668
  }
669
+ // source_ports
654
670
  auto* source_ports = envoy_config_listener_v3_FilterChainMatch_source_ports(
655
671
  filter_chain_match_proto, &size);
656
672
  filter_chain_match.source_ports.reserve(size);
657
673
  for (size_t i = 0; i < size; i++) {
658
674
  filter_chain_match.source_ports.push_back(source_ports[i]);
659
675
  }
676
+ // server_names
660
677
  auto* server_names = envoy_config_listener_v3_FilterChainMatch_server_names(
661
678
  filter_chain_match_proto, &size);
662
679
  for (size_t i = 0; i < size; i++) {
663
680
  filter_chain_match.server_names.push_back(
664
681
  UpbStringToStdString(server_names[i]));
665
682
  }
683
+ // transport_protocol
666
684
  filter_chain_match.transport_protocol = UpbStringToStdString(
667
685
  envoy_config_listener_v3_FilterChainMatch_transport_protocol(
668
686
  filter_chain_match_proto));
687
+ // application_protocols
669
688
  auto* application_protocols =
670
689
  envoy_config_listener_v3_FilterChainMatch_application_protocols(
671
690
  filter_chain_match_proto, &size);
@@ -674,112 +693,93 @@ absl::StatusOr<FilterChain::FilterChainMatch> FilterChainMatchParse(
674
693
  UpbStringToStdString(application_protocols[i]));
675
694
  }
676
695
  // Return result.
677
- if (!errors.empty()) {
678
- return absl::InvalidArgumentError(
679
- absl::StrCat("errors parsing filter chain match: [",
680
- absl::StrJoin(errors, "; "), "]"));
681
- }
696
+ if (errors->size() != original_error_size) return absl::nullopt;
682
697
  return filter_chain_match;
683
698
  }
684
699
 
685
- absl::StatusOr<FilterChain> FilterChainParse(
700
+ absl::optional<FilterChain> FilterChainParse(
686
701
  const XdsResourceType::DecodeContext& context,
687
702
  const envoy_config_listener_v3_FilterChain* filter_chain_proto,
688
- bool is_v2) {
703
+ ValidationErrors* errors) {
689
704
  FilterChain filter_chain;
690
- std::vector<std::string> errors;
705
+ const size_t original_error_size = errors->size();
706
+ // filter_chain_match
691
707
  auto* filter_chain_match =
692
708
  envoy_config_listener_v3_FilterChain_filter_chain_match(
693
709
  filter_chain_proto);
694
710
  if (filter_chain_match != nullptr) {
695
- auto match = FilterChainMatchParse(filter_chain_match);
696
- if (!match.ok()) {
697
- errors.emplace_back(match.status().message());
698
- } else {
711
+ ValidationErrors::ScopedField field(errors, ".filter_chain_match");
712
+ auto match = FilterChainMatchParse(filter_chain_match, errors);
713
+ if (match.has_value()) {
699
714
  filter_chain.filter_chain_match = std::move(*match);
700
715
  }
701
716
  }
702
- filter_chain.filter_chain_data =
703
- std::make_shared<XdsListenerResource::FilterChainData>();
704
- // Parse the filters list. Currently we only support HttpConnectionManager.
705
- size_t size = 0;
706
- auto* filters =
707
- envoy_config_listener_v3_FilterChain_filters(filter_chain_proto, &size);
708
- if (size != 1) {
709
- errors.push_back(
710
- "FilterChain should have exactly one filter: HttpConnectionManager; no "
711
- "other filter is supported at the moment");
712
- } else {
713
- auto* typed_config =
714
- envoy_config_listener_v3_Filter_typed_config(filters[0]);
715
- if (typed_config == nullptr) {
716
- errors.emplace_back("No typed_config found in filter.");
717
- } else {
718
- absl::string_view type_url = absl::StripPrefix(
719
- UpbStringToAbsl(google_protobuf_Any_type_url(typed_config)),
720
- "type.googleapis.com/");
721
- if (type_url !=
722
- "envoy.extensions.filters.network.http_connection_manager.v3."
723
- "HttpConnectionManager") {
724
- errors.emplace_back(absl::StrCat("Unsupported filter type ", type_url));
725
- } else {
726
- const upb_StringView encoded_http_connection_manager =
727
- google_protobuf_Any_value(typed_config);
728
- const auto* http_connection_manager =
729
- envoy_extensions_filters_network_http_connection_manager_v3_HttpConnectionManager_parse(
730
- encoded_http_connection_manager.data,
731
- encoded_http_connection_manager.size, context.arena);
732
- if (http_connection_manager == nullptr) {
733
- errors.emplace_back(
734
- "Could not parse HttpConnectionManager config from filter "
735
- "typed_config");
736
- } else {
737
- auto hcm = HttpConnectionManagerParse(
738
- /*is_client=*/false, context, http_connection_manager, is_v2);
739
- if (!hcm.ok()) {
740
- errors.emplace_back(hcm.status().message());
741
- } else {
742
- filter_chain.filter_chain_data->http_connection_manager =
743
- std::move(*hcm);
744
- }
745
- }
717
+ // filters
718
+ {
719
+ ValidationErrors::ScopedField field(errors, ".filters");
720
+ filter_chain.filter_chain_data =
721
+ std::make_shared<XdsListenerResource::FilterChainData>();
722
+ size_t size = 0;
723
+ auto* filters =
724
+ envoy_config_listener_v3_FilterChain_filters(filter_chain_proto, &size);
725
+ if (size != 1) {
726
+ errors->AddError(
727
+ "must have exactly one filter (HttpConnectionManager -- "
728
+ "no other filter is supported at the moment)");
729
+ }
730
+ // entries in filters list
731
+ for (size_t i = 0; i < size; ++i) {
732
+ ValidationErrors::ScopedField field(
733
+ errors, absl::StrCat("[", i, "].typed_config"));
734
+ auto* typed_config =
735
+ envoy_config_listener_v3_Filter_typed_config(filters[i]);
736
+ auto extension = ExtractXdsExtension(context, typed_config, errors);
737
+ if (extension.has_value()) {
738
+ filter_chain.filter_chain_data->http_connection_manager =
739
+ HttpConnectionManagerParse(/*is_client=*/false, context,
740
+ std::move(*extension), errors);
746
741
  }
747
742
  }
748
743
  }
744
+ // transport_socket
749
745
  auto* transport_socket =
750
746
  envoy_config_listener_v3_FilterChain_transport_socket(filter_chain_proto);
751
747
  if (transport_socket != nullptr) {
752
- auto downstream_context =
753
- DownstreamTlsContextParse(context, transport_socket);
754
- if (!downstream_context.ok()) {
755
- errors.emplace_back(downstream_context.status().message());
756
- } else {
757
- filter_chain.filter_chain_data->downstream_tls_context =
758
- std::move(*downstream_context);
759
- }
748
+ ValidationErrors::ScopedField field(errors, ".transport_socket");
749
+ filter_chain.filter_chain_data->downstream_tls_context =
750
+ DownstreamTlsContextParse(context, transport_socket, errors);
760
751
  }
761
752
  // Return result.
762
- if (!errors.empty()) {
763
- return absl::InvalidArgumentError(absl::StrCat(
764
- "Errors parsing FilterChain: [", absl::StrJoin(errors, "; "), "]"));
765
- }
753
+ if (errors->size() != original_error_size) return absl::nullopt;
766
754
  return filter_chain;
767
755
  }
768
756
 
769
- absl::StatusOr<std::string> AddressParse(
770
- const envoy_config_core_v3_Address* address_proto) {
757
+ absl::optional<std::string> AddressParse(
758
+ const envoy_config_core_v3_Address* address_proto,
759
+ ValidationErrors* errors) {
760
+ if (address_proto == nullptr) {
761
+ errors->AddError("field not present");
762
+ return absl::nullopt;
763
+ }
764
+ ValidationErrors::ScopedField field(errors, ".socket_address");
771
765
  const auto* socket_address =
772
766
  envoy_config_core_v3_Address_socket_address(address_proto);
773
767
  if (socket_address == nullptr) {
774
- return absl::InvalidArgumentError("Address does not have socket_address");
775
- }
776
- if (envoy_config_core_v3_SocketAddress_protocol(socket_address) !=
777
- envoy_config_core_v3_SocketAddress_TCP) {
778
- return absl::InvalidArgumentError("SocketAddress protocol is not TCP");
768
+ errors->AddError("field not present");
769
+ return absl::nullopt;
770
+ }
771
+ {
772
+ ValidationErrors::ScopedField field(errors, ".protocol");
773
+ if (envoy_config_core_v3_SocketAddress_protocol(socket_address) !=
774
+ envoy_config_core_v3_SocketAddress_TCP) {
775
+ errors->AddError("value must be TCP");
776
+ }
779
777
  }
778
+ ValidationErrors::ScopedField field2(errors, ".port_value");
780
779
  uint32_t port = envoy_config_core_v3_SocketAddress_port_value(socket_address);
781
780
  if (port > 65535) {
782
- return absl::InvalidArgumentError("Invalid port");
781
+ errors->AddError("invalid port");
782
+ return absl::nullopt;
783
783
  }
784
784
  return JoinHostPort(
785
785
  UpbStringToAbsl(
@@ -803,97 +803,103 @@ struct InternalFilterChainMap {
803
803
  DestinationIpMap destination_ip_map;
804
804
  };
805
805
 
806
- absl::Status AddFilterChainDataForSourcePort(
806
+ void AddFilterChainDataForSourcePort(
807
807
  const FilterChain& filter_chain, uint32_t port,
808
- XdsListenerResource::FilterChainMap::SourcePortsMap* ports_map) {
808
+ XdsListenerResource::FilterChainMap::SourcePortsMap* ports_map,
809
+ ValidationErrors* errors) {
809
810
  auto insert_result = ports_map->emplace(
810
811
  port, XdsListenerResource::FilterChainMap::FilterChainDataSharedPtr{
811
812
  filter_chain.filter_chain_data});
812
813
  if (!insert_result.second) {
813
- return absl::InvalidArgumentError(absl::StrCat(
814
- "Duplicate matching rules detected when adding filter chain: ",
814
+ errors->AddError(absl::StrCat(
815
+ "duplicate matching rules detected when adding filter chain: ",
815
816
  filter_chain.filter_chain_match.ToString()));
816
817
  }
817
- return absl::OkStatus();
818
818
  }
819
819
 
820
- absl::Status AddFilterChainDataForSourcePorts(
820
+ void AddFilterChainDataForSourcePorts(
821
821
  const FilterChain& filter_chain,
822
- XdsListenerResource::FilterChainMap::SourcePortsMap* ports_map) {
822
+ XdsListenerResource::FilterChainMap::SourcePortsMap* ports_map,
823
+ ValidationErrors* errors) {
823
824
  if (filter_chain.filter_chain_match.source_ports.empty()) {
824
- return AddFilterChainDataForSourcePort(filter_chain, 0, ports_map);
825
+ AddFilterChainDataForSourcePort(filter_chain, 0, ports_map, errors);
825
826
  } else {
826
827
  for (uint32_t port : filter_chain.filter_chain_match.source_ports) {
827
- absl::Status status =
828
- AddFilterChainDataForSourcePort(filter_chain, port, ports_map);
829
- if (!status.ok()) return status;
828
+ AddFilterChainDataForSourcePort(filter_chain, port, ports_map, errors);
830
829
  }
831
830
  }
832
- return absl::OkStatus();
833
831
  }
834
832
 
835
- absl::Status AddFilterChainDataForSourceIpRange(
833
+ void AddFilterChainDataForSourceIpRange(
836
834
  const FilterChain& filter_chain,
837
- InternalFilterChainMap::SourceIpMap* source_ip_map) {
835
+ InternalFilterChainMap::SourceIpMap* source_ip_map,
836
+ ValidationErrors* errors) {
838
837
  if (filter_chain.filter_chain_match.source_prefix_ranges.empty()) {
839
838
  auto insert_result = source_ip_map->emplace(
840
839
  "", XdsListenerResource::FilterChainMap::SourceIp());
841
- return AddFilterChainDataForSourcePorts(
842
- filter_chain, &insert_result.first->second.ports_map);
840
+ AddFilterChainDataForSourcePorts(
841
+ filter_chain, &insert_result.first->second.ports_map, errors);
843
842
  } else {
844
843
  for (const auto& prefix_range :
845
844
  filter_chain.filter_chain_match.source_prefix_ranges) {
846
845
  auto addr_str = grpc_sockaddr_to_string(&prefix_range.address, false);
847
- if (!addr_str.ok()) return addr_str.status();
846
+ if (!addr_str.ok()) {
847
+ errors->AddError(absl::StrCat(
848
+ "error parsing source IP sockaddr (should not happen): ",
849
+ addr_str.status().message()));
850
+ continue;
851
+ }
848
852
  auto insert_result = source_ip_map->emplace(
849
853
  absl::StrCat(*addr_str, "/", prefix_range.prefix_len),
850
854
  XdsListenerResource::FilterChainMap::SourceIp());
851
855
  if (insert_result.second) {
852
856
  insert_result.first->second.prefix_range.emplace(prefix_range);
853
857
  }
854
- absl::Status status = AddFilterChainDataForSourcePorts(
855
- filter_chain, &insert_result.first->second.ports_map);
856
- if (!status.ok()) return status;
858
+ AddFilterChainDataForSourcePorts(
859
+ filter_chain, &insert_result.first->second.ports_map, errors);
857
860
  }
858
861
  }
859
- return absl::OkStatus();
860
862
  }
861
863
 
862
- absl::Status AddFilterChainDataForSourceType(
864
+ void AddFilterChainDataForSourceType(
863
865
  const FilterChain& filter_chain,
864
- InternalFilterChainMap::DestinationIp* destination_ip) {
866
+ InternalFilterChainMap::DestinationIp* destination_ip,
867
+ ValidationErrors* errors) {
865
868
  GPR_ASSERT(static_cast<unsigned int>(
866
869
  filter_chain.filter_chain_match.source_type) < 3);
867
- return AddFilterChainDataForSourceIpRange(
868
- filter_chain, &destination_ip->source_types_array[static_cast<int>(
869
- filter_chain.filter_chain_match.source_type)]);
870
+ AddFilterChainDataForSourceIpRange(
871
+ filter_chain,
872
+ &destination_ip->source_types_array[static_cast<int>(
873
+ filter_chain.filter_chain_match.source_type)],
874
+ errors);
870
875
  }
871
876
 
872
- absl::Status AddFilterChainDataForApplicationProtocols(
877
+ void AddFilterChainDataForApplicationProtocols(
873
878
  const FilterChain& filter_chain,
874
- InternalFilterChainMap::DestinationIp* destination_ip) {
879
+ InternalFilterChainMap::DestinationIp* destination_ip,
880
+ ValidationErrors* errors) {
875
881
  // Only allow filter chains that do not mention application protocols
876
- if (!filter_chain.filter_chain_match.application_protocols.empty()) {
877
- return absl::OkStatus();
882
+ if (filter_chain.filter_chain_match.application_protocols.empty()) {
883
+ AddFilterChainDataForSourceType(filter_chain, destination_ip, errors);
878
884
  }
879
- return AddFilterChainDataForSourceType(filter_chain, destination_ip);
880
885
  }
881
886
 
882
- absl::Status AddFilterChainDataForTransportProtocol(
887
+ void AddFilterChainDataForTransportProtocol(
883
888
  const FilterChain& filter_chain,
884
- InternalFilterChainMap::DestinationIp* destination_ip) {
889
+ InternalFilterChainMap::DestinationIp* destination_ip,
890
+ ValidationErrors* errors) {
885
891
  const std::string& transport_protocol =
886
892
  filter_chain.filter_chain_match.transport_protocol;
887
893
  // Only allow filter chains with no transport protocol or "raw_buffer"
888
894
  if (!transport_protocol.empty() && transport_protocol != "raw_buffer") {
889
- return absl::OkStatus();
895
+ return;
890
896
  }
891
897
  // If for this configuration, we've already seen filter chains that mention
892
898
  // the transport protocol as "raw_buffer", we will never match filter chains
893
899
  // that do not mention it.
894
900
  if (destination_ip->transport_protocol_raw_buffer_provided &&
895
901
  transport_protocol.empty()) {
896
- return absl::OkStatus();
902
+ return;
897
903
  }
898
904
  if (!transport_protocol.empty() &&
899
905
  !destination_ip->transport_protocol_raw_buffer_provided) {
@@ -903,45 +909,50 @@ absl::Status AddFilterChainDataForTransportProtocol(
903
909
  destination_ip->source_types_array =
904
910
  InternalFilterChainMap::ConnectionSourceTypesArray();
905
911
  }
906
- return AddFilterChainDataForApplicationProtocols(filter_chain,
907
- destination_ip);
912
+ AddFilterChainDataForApplicationProtocols(filter_chain, destination_ip,
913
+ errors);
908
914
  }
909
915
 
910
- absl::Status AddFilterChainDataForServerNames(
916
+ void AddFilterChainDataForServerNames(
911
917
  const FilterChain& filter_chain,
912
- InternalFilterChainMap::DestinationIp* destination_ip) {
918
+ InternalFilterChainMap::DestinationIp* destination_ip,
919
+ ValidationErrors* errors) {
913
920
  // Don't continue adding filter chains with server names mentioned
914
- if (!filter_chain.filter_chain_match.server_names.empty()) {
915
- return absl::OkStatus();
921
+ if (filter_chain.filter_chain_match.server_names.empty()) {
922
+ AddFilterChainDataForTransportProtocol(filter_chain, destination_ip,
923
+ errors);
916
924
  }
917
- return AddFilterChainDataForTransportProtocol(filter_chain, destination_ip);
918
925
  }
919
926
 
920
- absl::Status AddFilterChainDataForDestinationIpRange(
927
+ void AddFilterChainDataForDestinationIpRange(
921
928
  const FilterChain& filter_chain,
922
- InternalFilterChainMap::DestinationIpMap* destination_ip_map) {
929
+ InternalFilterChainMap::DestinationIpMap* destination_ip_map,
930
+ ValidationErrors* errors) {
923
931
  if (filter_chain.filter_chain_match.prefix_ranges.empty()) {
924
932
  auto insert_result = destination_ip_map->emplace(
925
933
  "", InternalFilterChainMap::DestinationIp());
926
- return AddFilterChainDataForServerNames(filter_chain,
927
- &insert_result.first->second);
934
+ AddFilterChainDataForServerNames(filter_chain, &insert_result.first->second,
935
+ errors);
928
936
  } else {
929
937
  for (const auto& prefix_range :
930
938
  filter_chain.filter_chain_match.prefix_ranges) {
931
939
  auto addr_str = grpc_sockaddr_to_string(&prefix_range.address, false);
932
- if (!addr_str.ok()) return addr_str.status();
940
+ if (!addr_str.ok()) {
941
+ errors->AddError(absl::StrCat(
942
+ "error parsing destination IP sockaddr (should not happen): ",
943
+ addr_str.status().message()));
944
+ continue;
945
+ }
933
946
  auto insert_result = destination_ip_map->emplace(
934
947
  absl::StrCat(*addr_str, "/", prefix_range.prefix_len),
935
948
  InternalFilterChainMap::DestinationIp());
936
949
  if (insert_result.second) {
937
950
  insert_result.first->second.prefix_range.emplace(prefix_range);
938
951
  }
939
- absl::Status status = AddFilterChainDataForServerNames(
940
- filter_chain, &insert_result.first->second);
941
- if (!status.ok()) return status;
952
+ AddFilterChainDataForServerNames(filter_chain,
953
+ &insert_result.first->second, errors);
942
954
  }
943
955
  }
944
- return absl::OkStatus();
945
956
  }
946
957
 
947
958
  XdsListenerResource::FilterChainMap BuildFromInternalFilterChainMap(
@@ -963,68 +974,86 @@ XdsListenerResource::FilterChainMap BuildFromInternalFilterChainMap(
963
974
  return filter_chain_map;
964
975
  }
965
976
 
966
- absl::StatusOr<XdsListenerResource::FilterChainMap> BuildFilterChainMap(
967
- const std::vector<FilterChain>& filter_chains) {
977
+ XdsListenerResource::FilterChainMap BuildFilterChainMap(
978
+ const std::vector<FilterChain>& filter_chains, ValidationErrors* errors) {
968
979
  InternalFilterChainMap internal_filter_chain_map;
969
980
  for (const auto& filter_chain : filter_chains) {
970
981
  // Discard filter chain entries that specify destination port
971
982
  if (filter_chain.filter_chain_match.destination_port != 0) continue;
972
- absl::Status status = AddFilterChainDataForDestinationIpRange(
973
- filter_chain, &internal_filter_chain_map.destination_ip_map);
974
- if (!status.ok()) return status;
983
+ AddFilterChainDataForDestinationIpRange(
984
+ filter_chain, &internal_filter_chain_map.destination_ip_map, errors);
975
985
  }
976
986
  return BuildFromInternalFilterChainMap(&internal_filter_chain_map);
977
987
  }
978
988
 
979
989
  absl::StatusOr<XdsListenerResource> LdsResourceParseServer(
980
990
  const XdsResourceType::DecodeContext& context,
981
- const envoy_config_listener_v3_Listener* listener, bool is_v2) {
982
- XdsListenerResource lds_update;
983
- lds_update.type = XdsListenerResource::ListenerType::kTcpListener;
984
- auto address =
985
- AddressParse(envoy_config_listener_v3_Listener_address(listener));
986
- if (!address.ok()) return address.status();
987
- lds_update.address = std::move(*address);
988
- const auto* use_original_dst =
989
- envoy_config_listener_v3_Listener_use_original_dst(listener);
990
- if (use_original_dst != nullptr) {
991
- if (google_protobuf_BoolValue_value(use_original_dst)) {
992
- return absl::InvalidArgumentError(
993
- "Field \'use_original_dst\' is not supported.");
991
+ const envoy_config_listener_v3_Listener* listener) {
992
+ ValidationErrors errors;
993
+ XdsListenerResource::TcpListener tcp_listener;
994
+ // address
995
+ {
996
+ ValidationErrors::ScopedField field(&errors, "address");
997
+ auto address = AddressParse(
998
+ envoy_config_listener_v3_Listener_address(listener), &errors);
999
+ if (address.has_value()) tcp_listener.address = std::move(*address);
1000
+ }
1001
+ // use_original_dst
1002
+ {
1003
+ ValidationErrors::ScopedField field(&errors, "use_original_dst");
1004
+ const auto* use_original_dst =
1005
+ envoy_config_listener_v3_Listener_use_original_dst(listener);
1006
+ if (use_original_dst != nullptr &&
1007
+ google_protobuf_BoolValue_value(use_original_dst)) {
1008
+ errors.AddError("field not supported");
994
1009
  }
995
1010
  }
996
- size_t size = 0;
997
- auto* filter_chains =
998
- envoy_config_listener_v3_Listener_filter_chains(listener, &size);
999
- std::vector<FilterChain> parsed_filter_chains;
1000
- parsed_filter_chains.reserve(size);
1001
- for (size_t i = 0; i < size; i++) {
1002
- auto filter_chain = FilterChainParse(context, filter_chains[i], is_v2);
1003
- if (!filter_chain.ok()) return filter_chain.status();
1004
- parsed_filter_chains.push_back(std::move(*filter_chain));
1005
- }
1006
- auto filter_chain_map = BuildFilterChainMap(parsed_filter_chains);
1007
- if (!filter_chain_map.ok()) return filter_chain_map.status();
1008
- lds_update.filter_chain_map = std::move(*filter_chain_map);
1009
- auto* default_filter_chain =
1010
- envoy_config_listener_v3_Listener_default_filter_chain(listener);
1011
- if (default_filter_chain != nullptr) {
1012
- auto filter_chain = FilterChainParse(context, default_filter_chain, is_v2);
1013
- if (!filter_chain.ok()) return filter_chain.status();
1014
- if (filter_chain->filter_chain_data != nullptr) {
1015
- lds_update.default_filter_chain =
1016
- std::move(*filter_chain->filter_chain_data);
1011
+ // filter_chains
1012
+ size_t num_filter_chains = 0;
1013
+ {
1014
+ ValidationErrors::ScopedField field(&errors, "filter_chains");
1015
+ auto* filter_chains = envoy_config_listener_v3_Listener_filter_chains(
1016
+ listener, &num_filter_chains);
1017
+ std::vector<FilterChain> parsed_filter_chains;
1018
+ parsed_filter_chains.reserve(num_filter_chains);
1019
+ for (size_t i = 0; i < num_filter_chains; i++) {
1020
+ ValidationErrors::ScopedField field(&errors, absl::StrCat("[", i, "]"));
1021
+ auto filter_chain = FilterChainParse(context, filter_chains[i], &errors);
1022
+ if (filter_chain.has_value()) {
1023
+ parsed_filter_chains.push_back(std::move(*filter_chain));
1024
+ }
1025
+ }
1026
+ tcp_listener.filter_chain_map =
1027
+ BuildFilterChainMap(parsed_filter_chains, &errors);
1028
+ }
1029
+ // default_filter_chain
1030
+ {
1031
+ ValidationErrors::ScopedField field(&errors, "default_filter_chain");
1032
+ auto* default_filter_chain =
1033
+ envoy_config_listener_v3_Listener_default_filter_chain(listener);
1034
+ if (default_filter_chain != nullptr) {
1035
+ auto filter_chain =
1036
+ FilterChainParse(context, default_filter_chain, &errors);
1037
+ if (filter_chain.has_value() &&
1038
+ filter_chain->filter_chain_data != nullptr) {
1039
+ tcp_listener.default_filter_chain =
1040
+ std::move(*filter_chain->filter_chain_data);
1041
+ }
1042
+ } else if (num_filter_chains == 0) {
1043
+ // Make sure that there is at least one filter chain to use.
1044
+ errors.AddError("must be set if filter_chains is unset");
1017
1045
  }
1018
1046
  }
1019
- if (size == 0 && default_filter_chain == nullptr) {
1020
- return absl::InvalidArgumentError("No filter chain provided.");
1021
- }
1047
+ // Return result.
1048
+ if (!errors.ok()) return errors.status("errors validating server Listener");
1049
+ XdsListenerResource lds_update;
1050
+ lds_update.listener = std::move(tcp_listener);
1022
1051
  return lds_update;
1023
1052
  }
1024
1053
 
1025
1054
  absl::StatusOr<XdsListenerResource> LdsResourceParse(
1026
1055
  const XdsResourceType::DecodeContext& context,
1027
- const envoy_config_listener_v3_Listener* listener, bool is_v2) {
1056
+ const envoy_config_listener_v3_Listener* listener) {
1028
1057
  // Check whether it's a client or server listener.
1029
1058
  const envoy_config_listener_v3_ApiListener* api_listener =
1030
1059
  envoy_config_listener_v3_Listener_api_listener(listener);
@@ -1043,9 +1072,9 @@ absl::StatusOr<XdsListenerResource> LdsResourceParse(
1043
1072
  // If api_listener is present, it's for a client; otherwise, it's
1044
1073
  // for a server.
1045
1074
  if (api_listener != nullptr) {
1046
- return LdsResourceParseClient(context, api_listener, is_v2);
1075
+ return LdsResourceParseClient(context, api_listener);
1047
1076
  }
1048
- return LdsResourceParseServer(context, listener, is_v2);
1077
+ return LdsResourceParseServer(context, listener);
1049
1078
  }
1050
1079
 
1051
1080
  void MaybeLogListener(const XdsResourceType::DecodeContext& context,
@@ -1064,7 +1093,7 @@ void MaybeLogListener(const XdsResourceType::DecodeContext& context,
1064
1093
 
1065
1094
  XdsResourceType::DecodeResult XdsListenerResourceType::Decode(
1066
1095
  const XdsResourceType::DecodeContext& context,
1067
- absl::string_view serialized_resource, bool is_v2) const {
1096
+ absl::string_view serialized_resource) const {
1068
1097
  DecodeResult result;
1069
1098
  // Parse serialized proto.
1070
1099
  auto* resource = envoy_config_listener_v3_Listener_parse(
@@ -1078,7 +1107,7 @@ XdsResourceType::DecodeResult XdsListenerResourceType::Decode(
1078
1107
  // Validate resource.
1079
1108
  result.name =
1080
1109
  UpbStringToStdString(envoy_config_listener_v3_Listener_name(resource));
1081
- auto listener = LdsResourceParse(context, resource, is_v2);
1110
+ auto listener = LdsResourceParse(context, resource);
1082
1111
  if (!listener.ok()) {
1083
1112
  if (GRPC_TRACE_FLAG_ENABLED(*context.tracer)) {
1084
1113
  gpr_log(GPR_ERROR, "[xds_client %p] invalid Listener %s: %s",
@@ -1092,9 +1121,8 @@ XdsResourceType::DecodeResult XdsListenerResourceType::Decode(
1092
1121
  context.client, result.name->c_str(),
1093
1122
  listener->ToString().c_str());
1094
1123
  }
1095
- auto resource = absl::make_unique<ResourceDataSubclass>();
1096
- resource->resource = std::move(*listener);
1097
- result.resource = std::move(resource);
1124
+ result.resource =
1125
+ std::make_unique<XdsListenerResource>(std::move(*listener));
1098
1126
  }
1099
1127
  return result;
1100
1128
  }