grpc 1.26.0 → 1.30.0

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

Potentially problematic release.


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

Files changed (1240) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +7860 -11139
  3. data/etc/roots.pem +44 -0
  4. data/include/grpc/grpc.h +2 -2
  5. data/include/grpc/grpc_security.h +59 -24
  6. data/include/grpc/grpc_security_constants.h +28 -0
  7. data/include/grpc/impl/codegen/grpc_types.h +38 -21
  8. data/include/grpc/impl/codegen/port_platform.h +14 -3
  9. data/include/grpc/impl/codegen/sync.h +5 -3
  10. data/include/grpc/impl/codegen/sync_abseil.h +36 -0
  11. data/include/grpc/module.modulemap +25 -37
  12. data/include/grpc/support/sync_abseil.h +26 -0
  13. data/src/core/ext/filters/client_channel/backend_metric.cc +7 -4
  14. data/src/core/ext/filters/client_channel/client_channel.cc +273 -264
  15. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +31 -47
  16. data/src/core/ext/filters/client_channel/client_channel_channelz.h +1 -3
  17. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +3 -2
  18. data/src/core/ext/filters/client_channel/health/health_check_client.cc +7 -22
  19. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  20. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  21. data/src/core/ext/filters/client_channel/http_proxy.cc +25 -15
  22. data/src/core/ext/filters/client_channel/lb_policy.cc +20 -18
  23. data/src/core/ext/filters/client_channel/lb_policy.h +42 -33
  24. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +83 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +99 -0
  26. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +297 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +83 -0
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +423 -627
  29. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +89 -0
  30. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +40 -0
  31. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +11 -9
  32. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +3 -2
  33. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +88 -121
  34. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +28 -57
  35. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +18 -21
  36. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +871 -0
  37. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +10 -14
  38. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +5 -11
  39. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +734 -0
  40. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +150 -101
  41. data/src/core/ext/filters/client_channel/lb_policy/xds/eds.cc +938 -0
  42. data/src/core/ext/filters/client_channel/lb_policy/xds/lrs.cc +528 -0
  43. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -2
  44. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_routing.cc +834 -0
  45. data/src/core/ext/filters/client_channel/lb_policy_factory.h +3 -3
  46. data/src/core/ext/filters/client_channel/lb_policy_registry.cc +49 -77
  47. data/src/core/ext/filters/client_channel/lb_policy_registry.h +1 -1
  48. data/src/core/ext/filters/client_channel/local_subchannel_pool.h +2 -1
  49. data/src/core/ext/filters/client_channel/parse_address.cc +22 -21
  50. data/src/core/ext/filters/client_channel/resolver.cc +5 -8
  51. data/src/core/ext/filters/client_channel/resolver.h +12 -14
  52. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +129 -128
  53. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +35 -35
  54. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +8 -7
  55. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +17 -21
  56. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +5 -5
  57. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +72 -117
  58. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +186 -135
  59. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +5 -3
  60. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +7 -4
  61. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +42 -45
  62. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +94 -103
  63. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +0 -4
  64. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  65. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +61 -10
  66. data/src/core/ext/filters/client_channel/resolver_factory.h +2 -2
  67. data/src/core/ext/filters/client_channel/resolver_registry.cc +6 -3
  68. data/src/core/ext/filters/client_channel/resolver_registry.h +8 -8
  69. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +242 -300
  70. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +21 -18
  71. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +56 -206
  72. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +11 -14
  73. data/src/core/ext/filters/client_channel/server_address.cc +6 -9
  74. data/src/core/ext/filters/client_channel/server_address.h +6 -12
  75. data/src/core/ext/filters/client_channel/service_config.cc +144 -253
  76. data/src/core/ext/filters/client_channel/service_config.h +32 -109
  77. data/src/core/ext/filters/client_channel/service_config_call_data.h +68 -0
  78. data/src/core/ext/filters/client_channel/service_config_parser.cc +87 -0
  79. data/src/core/ext/filters/client_channel/service_config_parser.h +89 -0
  80. data/src/core/ext/filters/client_channel/subchannel.cc +54 -24
  81. data/src/core/ext/filters/client_channel/subchannel.h +35 -11
  82. data/src/core/ext/filters/client_channel/xds/xds_api.cc +1556 -232
  83. data/src/core/ext/filters/client_channel/xds/xds_api.h +213 -114
  84. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +237 -345
  85. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +34 -46
  86. data/src/core/ext/filters/client_channel/xds/xds_channel.h +3 -1
  87. data/src/core/ext/filters/client_channel/xds/xds_channel_secure.cc +18 -11
  88. data/src/core/ext/filters/client_channel/xds/xds_client.cc +1326 -399
  89. data/src/core/ext/filters/client_channel/xds/xds_client.h +124 -41
  90. data/src/core/ext/filters/client_channel/xds/xds_client_stats.cc +59 -138
  91. data/src/core/ext/filters/client_channel/xds/xds_client_stats.h +133 -154
  92. data/src/core/ext/filters/http/client/http_client_filter.cc +23 -28
  93. data/src/core/ext/filters/http/client_authority_filter.cc +4 -4
  94. data/src/core/ext/filters/http/http_filters_plugin.cc +27 -12
  95. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +258 -221
  96. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +358 -0
  97. data/src/core/ext/filters/http/message_compress/message_decompress_filter.h +29 -0
  98. data/src/core/ext/filters/message_size/message_size_filter.cc +38 -44
  99. data/src/core/ext/filters/message_size/message_size_filter.h +5 -5
  100. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +7 -10
  101. data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +4 -6
  102. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +28 -29
  103. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +1 -0
  104. data/src/core/ext/transport/chttp2/transport/flow_control.cc +3 -3
  105. data/src/core/ext/transport/chttp2/transport/frame_goaway.h +2 -3
  106. data/src/core/ext/transport/chttp2/transport/frame_ping.h +2 -3
  107. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.h +2 -3
  108. data/src/core/ext/transport/chttp2/transport/frame_settings.h +2 -3
  109. data/src/core/ext/transport/chttp2/transport/frame_window_update.h +2 -3
  110. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +29 -16
  111. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +2 -3
  112. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +2 -3
  113. data/src/core/ext/transport/chttp2/transport/hpack_table.h +2 -2
  114. data/src/core/ext/transport/chttp2/transport/http2_settings.h +4 -5
  115. data/src/core/ext/transport/chttp2/transport/huffsyms.h +2 -3
  116. data/src/core/ext/transport/chttp2/transport/internal.h +14 -21
  117. data/src/core/ext/transport/chttp2/transport/stream_map.h +2 -3
  118. data/src/core/ext/transport/chttp2/transport/writing.cc +16 -9
  119. data/src/core/ext/transport/inproc/inproc_transport.cc +41 -42
  120. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.c +17 -0
  121. data/src/core/ext/upb-generated/envoy/annotations/deprecation.upb.h +30 -0
  122. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.c +27 -0
  123. data/src/core/ext/upb-generated/envoy/annotations/resource.upb.h +54 -0
  124. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.c +5 -205
  125. data/src/core/ext/upb-generated/envoy/api/v2/auth/cert.upb.h +5 -788
  126. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.c +114 -0
  127. data/src/core/ext/upb-generated/envoy/api/v2/auth/common.upb.h +418 -0
  128. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.c +72 -0
  129. data/src/core/ext/upb-generated/envoy/api/v2/auth/secret.upb.h +197 -0
  130. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.c +105 -0
  131. data/src/core/ext/upb-generated/envoy/api/v2/auth/tls.upb.h +378 -0
  132. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.c +5 -362
  133. data/src/core/ext/upb-generated/envoy/api/v2/cds.upb.h +14 -1337
  134. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.c +403 -0
  135. data/src/core/ext/upb-generated/envoy/api/v2/cluster.upb.h +1447 -0
  136. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.c +30 -8
  137. data/src/core/ext/upb-generated/envoy/api/v2/cluster/circuit_breaker.upb.h +60 -0
  138. data/src/core/ext/upb-generated/envoy/api/v2/cluster/filter.upb.c +2 -0
  139. data/src/core/ext/upb-generated/envoy/api/v2/cluster/outlier_detection.upb.c +2 -0
  140. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.c +7 -4
  141. data/src/core/ext/upb-generated/envoy/api/v2/core/address.upb.h +6 -2
  142. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.c +35 -0
  143. data/src/core/ext/upb-generated/envoy/api/v2/core/backoff.upb.h +78 -0
  144. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.c +87 -23
  145. data/src/core/ext/upb-generated/envoy/api/v2/core/base.upb.h +262 -62
  146. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.c +20 -15
  147. data/src/core/ext/upb-generated/envoy/api/v2/core/config_source.upb.h +46 -32
  148. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.c +34 -0
  149. data/src/core/ext/upb-generated/envoy/api/v2/core/event_service_config.upb.h +72 -0
  150. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.c +27 -4
  151. data/src/core/ext/upb-generated/envoy/api/v2/core/grpc_service.upb.h +70 -0
  152. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.c +46 -25
  153. data/src/core/ext/upb-generated/envoy/api/v2/core/health_check.upb.h +98 -25
  154. data/src/core/ext/upb-generated/envoy/api/v2/core/http_uri.upb.c +2 -0
  155. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.c +77 -21
  156. data/src/core/ext/upb-generated/envoy/api/v2/core/protocol.upb.h +201 -4
  157. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.c +34 -0
  158. data/src/core/ext/upb-generated/envoy/api/v2/core/socket_option.upb.h +89 -0
  159. data/src/core/ext/upb-generated/envoy/api/v2/discovery.upb.c +2 -0
  160. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.c +8 -68
  161. data/src/core/ext/upb-generated/envoy/api/v2/eds.upb.h +14 -201
  162. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.c +92 -0
  163. data/src/core/ext/upb-generated/envoy/api/v2/endpoint.upb.h +240 -0
  164. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.c +2 -71
  165. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint.upb.h +3 -228
  166. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.c +91 -0
  167. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/endpoint_components.upb.h +266 -0
  168. data/src/core/ext/upb-generated/envoy/api/v2/endpoint/load_report.upb.c +2 -0
  169. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.c +31 -0
  170. data/src/core/ext/upb-generated/envoy/api/v2/lds.upb.h +53 -0
  171. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.c +109 -0
  172. data/src/core/ext/upb-generated/envoy/api/v2/listener.upb.h +399 -0
  173. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.c +18 -0
  174. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener.upb.h +33 -0
  175. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.c +145 -0
  176. data/src/core/ext/upb-generated/envoy/api/v2/listener/listener_components.upb.h +527 -0
  177. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.c +43 -0
  178. data/src/core/ext/upb-generated/envoy/api/v2/listener/udp_listener_config.upb.h +112 -0
  179. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.c +30 -0
  180. data/src/core/ext/upb-generated/envoy/api/v2/rds.upb.h +53 -0
  181. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.c +63 -0
  182. data/src/core/ext/upb-generated/envoy/api/v2/route.upb.h +199 -0
  183. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.c +18 -0
  184. data/src/core/ext/upb-generated/envoy/api/v2/route/route.upb.h +33 -0
  185. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.c +815 -0
  186. data/src/core/ext/upb-generated/envoy/api/v2/route/route_components.upb.h +3032 -0
  187. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.c +59 -0
  188. data/src/core/ext/upb-generated/envoy/api/v2/scoped_route.upb.h +134 -0
  189. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.c +28 -0
  190. data/src/core/ext/upb-generated/envoy/api/v2/srds.upb.h +53 -0
  191. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.c +228 -0
  192. data/src/core/ext/upb-generated/envoy/config/filter/accesslog/v2/accesslog.upb.h +725 -0
  193. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.c +316 -0
  194. data/src/core/ext/upb-generated/envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h +1132 -0
  195. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.c +33 -0
  196. data/src/core/ext/upb-generated/envoy/config/listener/v2/api_listener.upb.h +65 -0
  197. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.c +51 -0
  198. data/src/core/ext/upb-generated/envoy/config/trace/v2/http_tracer.upb.h +125 -0
  199. data/src/core/ext/upb-generated/envoy/service/discovery/v2/ads.upb.c +1 -0
  200. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.c +4 -2
  201. data/src/core/ext/upb-generated/envoy/service/load_stats/v2/lrs.upb.h +4 -0
  202. data/src/core/ext/upb-generated/envoy/type/http.upb.c +1 -0
  203. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.c +63 -0
  204. data/src/core/ext/upb-generated/envoy/type/matcher/regex.upb.h +144 -0
  205. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.c +53 -0
  206. data/src/core/ext/upb-generated/envoy/type/matcher/string.upb.h +133 -0
  207. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.c +88 -0
  208. data/src/core/ext/upb-generated/envoy/type/metadata/v2/metadata.upb.h +258 -0
  209. data/src/core/ext/upb-generated/envoy/type/percent.upb.c +1 -0
  210. data/src/core/ext/upb-generated/envoy/type/range.upb.c +12 -0
  211. data/src/core/ext/upb-generated/envoy/type/range.upb.h +27 -0
  212. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.c +29 -0
  213. data/src/core/ext/upb-generated/envoy/type/semantic_version.upb.h +62 -0
  214. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.c +89 -0
  215. data/src/core/ext/upb-generated/envoy/type/tracing/v2/custom_tag.upb.h +249 -0
  216. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.c +9 -8
  217. data/src/core/ext/upb-generated/google/protobuf/descriptor.upb.h +30 -24
  218. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.c +30 -27
  219. data/src/core/ext/upb-generated/src/proto/grpc/gcp/handshaker.upb.h +64 -52
  220. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.c +13 -5
  221. data/src/core/ext/upb-generated/src/proto/grpc/lb/v1/load_balancer.upb.h +34 -0
  222. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.c +48 -0
  223. data/src/core/ext/upb-generated/udpa/annotations/migrate.upb.h +104 -0
  224. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.c +17 -0
  225. data/src/core/ext/upb-generated/udpa/annotations/sensitive.upb.h +30 -0
  226. data/src/core/ext/upb-generated/udpa/annotations/status.upb.c +28 -0
  227. data/src/core/ext/upb-generated/udpa/annotations/status.upb.h +65 -0
  228. data/src/core/ext/upb-generated/validate/validate.upb.c +44 -39
  229. data/src/core/ext/upb-generated/validate/validate.upb.h +155 -119
  230. data/src/core/lib/channel/channel_args.cc +15 -14
  231. data/src/core/lib/channel/channel_args.h +3 -1
  232. data/src/core/lib/channel/channel_stack.h +20 -13
  233. data/src/core/lib/channel/channel_trace.cc +32 -41
  234. data/src/core/lib/channel/channel_trace.h +3 -3
  235. data/src/core/lib/channel/channelz.cc +163 -254
  236. data/src/core/lib/channel/channelz.h +20 -12
  237. data/src/core/lib/channel/channelz_registry.cc +52 -77
  238. data/src/core/lib/channel/channelz_registry.h +4 -4
  239. data/src/core/lib/channel/connected_channel.cc +7 -5
  240. data/src/core/lib/channel/context.h +1 -1
  241. data/src/core/lib/channel/handshaker.cc +11 -13
  242. data/src/core/lib/channel/handshaker.h +4 -2
  243. data/src/core/lib/channel/handshaker_registry.cc +5 -17
  244. data/src/core/lib/channel/status_util.cc +2 -3
  245. data/src/core/lib/compression/message_compress.cc +5 -1
  246. data/src/core/lib/debug/stats.cc +21 -27
  247. data/src/core/lib/debug/stats.h +3 -1
  248. data/src/core/lib/gpr/spinlock.h +2 -3
  249. data/src/core/lib/gpr/string.cc +2 -26
  250. data/src/core/lib/gpr/string.h +0 -16
  251. data/src/core/lib/gpr/sync_abseil.cc +116 -0
  252. data/src/core/lib/gpr/sync_posix.cc +8 -5
  253. data/src/core/lib/gpr/sync_windows.cc +4 -2
  254. data/src/core/lib/gpr/time.cc +4 -0
  255. data/src/core/lib/gpr/time_posix.cc +1 -1
  256. data/src/core/lib/gpr/time_precise.cc +1 -1
  257. data/src/core/lib/gprpp/atomic.h +6 -6
  258. data/src/core/lib/gprpp/fork.cc +1 -1
  259. data/src/core/lib/gprpp/host_port.cc +30 -36
  260. data/src/core/lib/gprpp/host_port.h +14 -17
  261. data/src/core/lib/gprpp/map.h +5 -11
  262. data/src/core/lib/gprpp/memory.h +2 -6
  263. data/src/core/lib/gprpp/ref_counted_ptr.h +5 -0
  264. data/src/core/lib/gprpp/sync.h +9 -0
  265. data/src/core/lib/http/format_request.cc +46 -65
  266. data/src/core/lib/http/httpcli.cc +2 -3
  267. data/src/core/lib/http/httpcli.h +2 -3
  268. data/src/core/lib/http/httpcli_security_connector.cc +5 -5
  269. data/src/core/lib/http/parser.h +2 -3
  270. data/src/core/lib/iomgr/buffer_list.cc +36 -35
  271. data/src/core/lib/iomgr/buffer_list.h +22 -21
  272. data/src/core/lib/iomgr/call_combiner.h +3 -2
  273. data/src/core/lib/iomgr/cfstream_handle.cc +3 -2
  274. data/src/core/lib/iomgr/closure.h +2 -3
  275. data/src/core/lib/iomgr/dualstack_socket_posix.cc +47 -0
  276. data/src/core/lib/iomgr/endpoint_cfstream.cc +2 -3
  277. data/src/core/lib/iomgr/endpoint_pair.h +2 -3
  278. data/src/core/lib/iomgr/error.cc +6 -9
  279. data/src/core/lib/iomgr/error.h +4 -5
  280. data/src/core/lib/iomgr/ev_apple.cc +356 -0
  281. data/src/core/lib/iomgr/ev_apple.h +43 -0
  282. data/src/core/lib/iomgr/ev_epoll1_linux.cc +20 -23
  283. data/src/core/lib/iomgr/ev_epollex_linux.cc +14 -7
  284. data/src/core/lib/iomgr/ev_poll_posix.cc +3 -3
  285. data/src/core/lib/iomgr/ev_posix.cc +2 -3
  286. data/src/core/lib/iomgr/exec_ctx.h +14 -2
  287. data/src/core/lib/iomgr/executor.cc +1 -1
  288. data/src/core/lib/iomgr/fork_posix.cc +4 -0
  289. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +84 -20
  290. data/src/core/lib/iomgr/load_file.cc +1 -0
  291. data/src/core/lib/iomgr/poller/eventmanager_libuv.cc +87 -0
  292. data/src/core/lib/iomgr/poller/eventmanager_libuv.h +88 -0
  293. data/src/core/lib/iomgr/pollset_set_custom.cc +10 -10
  294. data/src/core/lib/iomgr/pollset_uv.h +32 -0
  295. data/src/core/lib/iomgr/port.h +1 -0
  296. data/src/core/lib/iomgr/python_util.h +46 -0
  297. data/src/core/lib/iomgr/resolve_address.h +4 -6
  298. data/src/core/lib/iomgr/resolve_address_custom.cc +29 -39
  299. data/src/core/lib/iomgr/resolve_address_custom.h +4 -2
  300. data/src/core/lib/iomgr/resolve_address_posix.cc +10 -11
  301. data/src/core/lib/iomgr/resolve_address_windows.cc +8 -17
  302. data/src/core/lib/iomgr/resource_quota.cc +4 -6
  303. data/src/core/lib/iomgr/sockaddr_utils.cc +23 -29
  304. data/src/core/lib/iomgr/sockaddr_utils.h +9 -14
  305. data/src/core/lib/iomgr/socket_factory_posix.h +2 -3
  306. data/src/core/lib/iomgr/socket_mutator.h +2 -3
  307. data/src/core/lib/iomgr/socket_utils_common_posix.cc +21 -26
  308. data/src/core/lib/iomgr/socket_utils_posix.h +15 -0
  309. data/src/core/lib/iomgr/tcp_client_cfstream.cc +5 -7
  310. data/src/core/lib/iomgr/tcp_client_posix.cc +25 -22
  311. data/src/core/lib/iomgr/tcp_client_posix.h +6 -6
  312. data/src/core/lib/iomgr/tcp_client_windows.cc +2 -3
  313. data/src/core/lib/iomgr/tcp_custom.cc +2 -3
  314. data/src/core/lib/iomgr/tcp_custom.h +3 -0
  315. data/src/core/lib/iomgr/tcp_posix.cc +608 -56
  316. data/src/core/lib/iomgr/tcp_server_custom.cc +20 -11
  317. data/src/core/lib/iomgr/tcp_server_posix.cc +5 -4
  318. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +13 -4
  319. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +8 -11
  320. data/src/core/lib/iomgr/tcp_uv.cc +3 -2
  321. data/src/core/lib/iomgr/time_averaged_stats.h +2 -3
  322. data/src/core/lib/iomgr/timer_generic.cc +2 -3
  323. data/src/core/lib/iomgr/timer_generic.h +39 -0
  324. data/src/core/lib/iomgr/timer_heap.h +2 -3
  325. data/src/core/lib/iomgr/udp_server.cc +9 -14
  326. data/src/core/lib/iomgr/work_serializer.cc +155 -0
  327. data/src/core/lib/iomgr/work_serializer.h +65 -0
  328. data/src/core/lib/json/json.h +209 -68
  329. data/src/core/lib/json/json_reader.cc +511 -319
  330. data/src/core/lib/json/json_writer.cc +202 -110
  331. data/src/core/lib/security/credentials/alts/check_gcp_environment.cc +1 -1
  332. data/src/core/lib/security/credentials/composite/composite_credentials.cc +19 -0
  333. data/src/core/lib/security/credentials/composite/composite_credentials.h +11 -4
  334. data/src/core/lib/security/credentials/credentials.cc +0 -84
  335. data/src/core/lib/security/credentials/credentials.h +18 -60
  336. data/src/core/lib/security/credentials/fake/fake_credentials.h +6 -1
  337. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +9 -12
  338. data/src/core/lib/security/credentials/iam/iam_credentials.cc +8 -6
  339. data/src/core/lib/security/credentials/iam/iam_credentials.h +4 -0
  340. data/src/core/lib/security/credentials/jwt/json_token.cc +26 -56
  341. data/src/core/lib/security/credentials/jwt/json_token.h +4 -6
  342. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +8 -18
  343. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +12 -0
  344. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +151 -168
  345. data/src/core/lib/security/credentials/jwt/jwt_verifier.h +4 -6
  346. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +92 -61
  347. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +10 -4
  348. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +19 -4
  349. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +4 -1
  350. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +43 -13
  351. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +47 -11
  352. data/src/core/lib/security/credentials/tls/tls_credentials.cc +128 -0
  353. data/src/core/lib/security/credentials/tls/tls_credentials.h +62 -0
  354. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +34 -6
  355. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +29 -9
  356. data/src/core/lib/security/security_connector/load_system_roots_fallback.cc +2 -2
  357. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +5 -4
  358. data/src/core/lib/security/security_connector/local/local_security_connector.cc +32 -7
  359. data/src/core/lib/security/security_connector/security_connector.h +1 -1
  360. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +20 -37
  361. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.h +4 -6
  362. data/src/core/lib/security/security_connector/ssl_utils.cc +107 -16
  363. data/src/core/lib/security/security_connector/ssl_utils.h +24 -11
  364. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +603 -0
  365. data/src/core/lib/security/security_connector/tls/tls_security_connector.h +183 -0
  366. data/src/core/lib/security/transport/client_auth_filter.cc +34 -2
  367. data/src/core/lib/security/transport/security_handshaker.cc +2 -2
  368. data/src/core/lib/security/util/json_util.cc +22 -15
  369. data/src/core/lib/security/util/json_util.h +2 -2
  370. data/src/core/lib/slice/slice_intern.cc +2 -3
  371. data/src/core/lib/slice/slice_internal.h +14 -0
  372. data/src/core/lib/slice/slice_utils.h +9 -0
  373. data/src/core/lib/surface/byte_buffer_reader.cc +2 -47
  374. data/src/core/lib/surface/call.cc +2 -3
  375. data/src/core/lib/surface/call_log_batch.cc +50 -58
  376. data/src/core/lib/surface/channel.cc +53 -31
  377. data/src/core/lib/surface/channel.h +35 -4
  378. data/src/core/lib/surface/channel_ping.cc +2 -3
  379. data/src/core/lib/surface/completion_queue.cc +55 -34
  380. data/src/core/lib/surface/event_string.cc +18 -25
  381. data/src/core/lib/surface/event_string.h +3 -1
  382. data/src/core/lib/surface/init_secure.cc +1 -4
  383. data/src/core/lib/surface/server.cc +570 -369
  384. data/src/core/lib/surface/server.h +32 -0
  385. data/src/core/lib/surface/version.cc +2 -2
  386. data/src/core/lib/transport/byte_stream.h +7 -2
  387. data/src/core/lib/transport/connectivity_state.cc +7 -6
  388. data/src/core/lib/transport/connectivity_state.h +5 -3
  389. data/src/core/lib/transport/metadata.cc +3 -3
  390. data/src/core/lib/transport/metadata_batch.h +2 -3
  391. data/src/core/lib/transport/static_metadata.h +1 -1
  392. data/src/core/lib/transport/status_conversion.cc +6 -14
  393. data/src/core/lib/transport/transport.cc +2 -3
  394. data/src/core/lib/transport/transport.h +3 -2
  395. data/src/core/lib/transport/transport_op_string.cc +61 -102
  396. data/src/core/lib/uri/uri_parser.h +2 -3
  397. data/src/core/plugin_registry/grpc_plugin_registry.cc +20 -4
  398. data/src/core/tsi/alts/crypt/aes_gcm.cc +0 -2
  399. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +9 -2
  400. data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +8 -4
  401. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +44 -4
  402. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.h +10 -2
  403. data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.h +2 -3
  404. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +3 -3
  405. data/src/core/tsi/fake_transport_security.cc +17 -18
  406. data/src/core/tsi/fake_transport_security.h +2 -0
  407. data/src/core/tsi/ssl/session_cache/ssl_session.h +0 -2
  408. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
  409. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +0 -2
  410. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -1
  411. data/src/core/tsi/ssl_transport_security.cc +197 -47
  412. data/src/core/tsi/ssl_transport_security.h +23 -9
  413. data/src/core/tsi/ssl_types.h +0 -2
  414. data/src/core/tsi/transport_security.cc +13 -0
  415. data/src/core/tsi/transport_security.h +6 -9
  416. data/src/core/tsi/transport_security_grpc.cc +2 -2
  417. data/src/core/tsi/transport_security_grpc.h +4 -5
  418. data/src/core/tsi/transport_security_interface.h +15 -3
  419. data/src/ruby/bin/math_pb.rb +5 -5
  420. data/src/ruby/ext/grpc/rb_call.c +9 -1
  421. data/src/ruby/ext/grpc/rb_call_credentials.c +4 -1
  422. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  423. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +4 -1
  424. data/src/ruby/lib/grpc/errors.rb +103 -42
  425. data/src/ruby/lib/grpc/generic/active_call.rb +2 -3
  426. data/src/ruby/lib/grpc/generic/interceptors.rb +4 -4
  427. data/src/ruby/lib/grpc/generic/rpc_server.rb +9 -10
  428. data/src/ruby/lib/grpc/generic/service.rb +5 -4
  429. data/src/ruby/lib/grpc/structs.rb +1 -1
  430. data/src/ruby/lib/grpc/version.rb +1 -1
  431. data/src/ruby/pb/generate_proto_ruby.sh +5 -3
  432. data/src/ruby/pb/grpc/health/v1/health_pb.rb +3 -3
  433. data/src/ruby/pb/src/proto/grpc/testing/empty_pb.rb +1 -1
  434. data/src/ruby/pb/src/proto/grpc/testing/messages_pb.rb +34 -13
  435. data/src/ruby/pb/src/proto/grpc/testing/test_services_pb.rb +16 -0
  436. data/src/ruby/spec/debug_message_spec.rb +134 -0
  437. data/src/ruby/spec/generic/service_spec.rb +2 -0
  438. data/src/ruby/spec/pb/codegen/grpc/testing/package_options_ruby_style.proto +5 -0
  439. data/src/ruby/spec/pb/codegen/package_option_spec.rb +2 -0
  440. data/src/ruby/spec/testdata/ca.pem +18 -13
  441. data/src/ruby/spec/testdata/client.key +26 -14
  442. data/src/ruby/spec/testdata/client.pem +18 -12
  443. data/src/ruby/spec/testdata/server1.key +26 -14
  444. data/src/ruby/spec/testdata/server1.pem +20 -14
  445. data/third_party/abseil-cpp/absl/algorithm/algorithm.h +159 -0
  446. data/third_party/abseil-cpp/absl/base/attributes.h +621 -0
  447. data/third_party/abseil-cpp/absl/base/call_once.h +226 -0
  448. data/third_party/abseil-cpp/absl/base/casts.h +184 -0
  449. data/third_party/abseil-cpp/absl/base/config.h +671 -0
  450. data/third_party/abseil-cpp/absl/base/const_init.h +76 -0
  451. data/third_party/abseil-cpp/absl/base/dynamic_annotations.cc +129 -0
  452. data/third_party/abseil-cpp/absl/base/dynamic_annotations.h +389 -0
  453. data/third_party/abseil-cpp/absl/base/internal/atomic_hook.h +200 -0
  454. data/third_party/abseil-cpp/absl/base/internal/bits.h +218 -0
  455. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +107 -0
  456. data/third_party/abseil-cpp/absl/base/internal/cycleclock.h +94 -0
  457. data/third_party/abseil-cpp/absl/base/internal/endian.h +266 -0
  458. data/third_party/abseil-cpp/absl/base/internal/errno_saver.h +43 -0
  459. data/third_party/abseil-cpp/absl/base/internal/hide_ptr.h +51 -0
  460. data/third_party/abseil-cpp/absl/base/internal/identity.h +37 -0
  461. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +107 -0
  462. data/third_party/abseil-cpp/absl/base/internal/invoke.h +187 -0
  463. data/third_party/abseil-cpp/absl/base/internal/low_level_scheduling.h +107 -0
  464. data/third_party/abseil-cpp/absl/base/internal/per_thread_tls.h +52 -0
  465. data/third_party/abseil-cpp/absl/base/internal/raw_logging.cc +240 -0
  466. data/third_party/abseil-cpp/absl/base/internal/raw_logging.h +183 -0
  467. data/third_party/abseil-cpp/absl/base/internal/scheduling_mode.h +58 -0
  468. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +233 -0
  469. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +243 -0
  470. data/third_party/abseil-cpp/absl/base/internal/spinlock_akaros.inc +35 -0
  471. data/third_party/abseil-cpp/absl/base/internal/spinlock_linux.inc +66 -0
  472. data/third_party/abseil-cpp/absl/base/internal/spinlock_posix.inc +46 -0
  473. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.cc +81 -0
  474. data/third_party/abseil-cpp/absl/base/internal/spinlock_wait.h +93 -0
  475. data/third_party/abseil-cpp/absl/base/internal/spinlock_win32.inc +37 -0
  476. data/third_party/abseil-cpp/absl/base/internal/sysinfo.cc +416 -0
  477. data/third_party/abseil-cpp/absl/base/internal/sysinfo.h +66 -0
  478. data/third_party/abseil-cpp/absl/base/internal/thread_annotations.h +271 -0
  479. data/third_party/abseil-cpp/absl/base/internal/thread_identity.cc +152 -0
  480. data/third_party/abseil-cpp/absl/base/internal/thread_identity.h +259 -0
  481. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.cc +108 -0
  482. data/third_party/abseil-cpp/absl/base/internal/throw_delegate.h +75 -0
  483. data/third_party/abseil-cpp/absl/base/internal/tsan_mutex_interface.h +66 -0
  484. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +158 -0
  485. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.cc +140 -0
  486. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +124 -0
  487. data/third_party/abseil-cpp/absl/base/log_severity.cc +27 -0
  488. data/third_party/abseil-cpp/absl/base/log_severity.h +121 -0
  489. data/third_party/abseil-cpp/absl/base/macros.h +220 -0
  490. data/third_party/abseil-cpp/absl/base/optimization.h +181 -0
  491. data/third_party/abseil-cpp/absl/base/options.h +211 -0
  492. data/third_party/abseil-cpp/absl/base/policy_checks.h +111 -0
  493. data/third_party/abseil-cpp/absl/base/port.h +26 -0
  494. data/third_party/abseil-cpp/absl/base/thread_annotations.h +280 -0
  495. data/third_party/abseil-cpp/absl/container/inlined_vector.h +848 -0
  496. data/third_party/abseil-cpp/absl/container/internal/compressed_tuple.h +265 -0
  497. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +892 -0
  498. data/third_party/abseil-cpp/absl/memory/memory.h +695 -0
  499. data/third_party/abseil-cpp/absl/meta/type_traits.h +759 -0
  500. data/third_party/abseil-cpp/absl/numeric/int128.cc +404 -0
  501. data/third_party/abseil-cpp/absl/numeric/int128.h +1091 -0
  502. data/third_party/abseil-cpp/absl/numeric/int128_have_intrinsic.inc +302 -0
  503. data/third_party/abseil-cpp/absl/numeric/int128_no_intrinsic.inc +308 -0
  504. data/third_party/abseil-cpp/absl/strings/ascii.cc +200 -0
  505. data/third_party/abseil-cpp/absl/strings/ascii.h +242 -0
  506. data/third_party/abseil-cpp/absl/strings/charconv.cc +984 -0
  507. data/third_party/abseil-cpp/absl/strings/charconv.h +119 -0
  508. data/third_party/abseil-cpp/absl/strings/escaping.cc +949 -0
  509. data/third_party/abseil-cpp/absl/strings/escaping.h +164 -0
  510. data/third_party/abseil-cpp/absl/strings/internal/char_map.h +156 -0
  511. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +359 -0
  512. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.h +423 -0
  513. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.cc +504 -0
  514. data/third_party/abseil-cpp/absl/strings/internal/charconv_parse.h +99 -0
  515. data/third_party/abseil-cpp/absl/strings/internal/escaping.cc +180 -0
  516. data/third_party/abseil-cpp/absl/strings/internal/escaping.h +58 -0
  517. data/third_party/abseil-cpp/absl/strings/internal/memutil.cc +112 -0
  518. data/third_party/abseil-cpp/absl/strings/internal/memutil.h +148 -0
  519. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.cc +36 -0
  520. data/third_party/abseil-cpp/absl/strings/internal/ostringstream.h +89 -0
  521. data/third_party/abseil-cpp/absl/strings/internal/resize_uninitialized.h +73 -0
  522. data/third_party/abseil-cpp/absl/strings/internal/stl_type_traits.h +248 -0
  523. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +388 -0
  524. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +432 -0
  525. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.cc +245 -0
  526. data/third_party/abseil-cpp/absl/strings/internal/str_format/bind.h +209 -0
  527. data/third_party/abseil-cpp/absl/strings/internal/str_format/checker.h +326 -0
  528. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +51 -0
  529. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.h +415 -0
  530. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.cc +493 -0
  531. data/third_party/abseil-cpp/absl/strings/internal/str_format/float_conversion.h +23 -0
  532. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +72 -0
  533. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.h +104 -0
  534. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc +334 -0
  535. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +333 -0
  536. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +314 -0
  537. data/third_party/abseil-cpp/absl/strings/internal/str_split_internal.h +455 -0
  538. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +53 -0
  539. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +50 -0
  540. data/third_party/abseil-cpp/absl/strings/match.cc +40 -0
  541. data/third_party/abseil-cpp/absl/strings/match.h +90 -0
  542. data/third_party/abseil-cpp/absl/strings/numbers.cc +965 -0
  543. data/third_party/abseil-cpp/absl/strings/numbers.h +266 -0
  544. data/third_party/abseil-cpp/absl/strings/str_cat.cc +246 -0
  545. data/third_party/abseil-cpp/absl/strings/str_cat.h +408 -0
  546. data/third_party/abseil-cpp/absl/strings/str_format.h +537 -0
  547. data/third_party/abseil-cpp/absl/strings/str_join.h +293 -0
  548. data/third_party/abseil-cpp/absl/strings/str_replace.cc +82 -0
  549. data/third_party/abseil-cpp/absl/strings/str_replace.h +219 -0
  550. data/third_party/abseil-cpp/absl/strings/str_split.cc +139 -0
  551. data/third_party/abseil-cpp/absl/strings/str_split.h +513 -0
  552. data/third_party/abseil-cpp/absl/strings/string_view.cc +235 -0
  553. data/third_party/abseil-cpp/absl/strings/string_view.h +622 -0
  554. data/third_party/abseil-cpp/absl/strings/strip.h +91 -0
  555. data/third_party/abseil-cpp/absl/strings/substitute.cc +171 -0
  556. data/third_party/abseil-cpp/absl/strings/substitute.h +693 -0
  557. data/third_party/abseil-cpp/absl/time/civil_time.cc +175 -0
  558. data/third_party/abseil-cpp/absl/time/civil_time.h +538 -0
  559. data/third_party/abseil-cpp/absl/time/clock.cc +569 -0
  560. data/third_party/abseil-cpp/absl/time/clock.h +74 -0
  561. data/third_party/abseil-cpp/absl/time/duration.cc +922 -0
  562. data/third_party/abseil-cpp/absl/time/format.cc +153 -0
  563. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time.h +332 -0
  564. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h +622 -0
  565. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +384 -0
  566. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h +102 -0
  567. data/third_party/abseil-cpp/absl/time/internal/cctz/src/civil_time_detail.cc +94 -0
  568. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.cc +140 -0
  569. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_fixed.h +52 -0
  570. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_format.cc +922 -0
  571. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.cc +45 -0
  572. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_if.h +76 -0
  573. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.cc +121 -0
  574. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_impl.h +93 -0
  575. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.cc +958 -0
  576. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_info.h +138 -0
  577. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.cc +308 -0
  578. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_libc.h +55 -0
  579. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +187 -0
  580. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.cc +159 -0
  581. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_posix.h +132 -0
  582. data/third_party/abseil-cpp/absl/time/internal/cctz/src/tzfile.h +122 -0
  583. data/third_party/abseil-cpp/absl/time/internal/cctz/src/zone_info_source.cc +115 -0
  584. data/third_party/abseil-cpp/absl/time/internal/get_current_time_chrono.inc +31 -0
  585. data/third_party/abseil-cpp/absl/time/internal/get_current_time_posix.inc +24 -0
  586. data/third_party/abseil-cpp/absl/time/time.cc +499 -0
  587. data/third_party/abseil-cpp/absl/time/time.h +1584 -0
  588. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +48 -0
  589. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +78 -0
  590. data/third_party/abseil-cpp/absl/types/internal/optional.h +396 -0
  591. data/third_party/abseil-cpp/absl/types/internal/span.h +128 -0
  592. data/third_party/abseil-cpp/absl/types/optional.h +776 -0
  593. data/third_party/abseil-cpp/absl/types/span.h +713 -0
  594. data/third_party/abseil-cpp/absl/utility/utility.h +350 -0
  595. data/third_party/boringssl-with-bazel/err_data.c +1439 -0
  596. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_bitstr.c +0 -0
  597. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_bool.c +0 -0
  598. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_d2i_fp.c +0 -0
  599. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_dup.c +0 -0
  600. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_enum.c +0 -0
  601. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_gentm.c +0 -0
  602. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_i2d_fp.c +0 -0
  603. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_int.c +0 -0
  604. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_mbstr.c +0 -0
  605. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_object.c +0 -0
  606. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_octet.c +0 -0
  607. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_print.c +0 -0
  608. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_strnid.c +0 -0
  609. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_time.c +212 -0
  610. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_type.c +0 -0
  611. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_utctm.c +0 -0
  612. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/a_utf8.c +0 -0
  613. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_lib.c +0 -0
  614. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_locl.h +0 -0
  615. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn1_par.c +0 -0
  616. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/asn_pack.c +0 -0
  617. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_enum.c +0 -0
  618. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_int.c +0 -0
  619. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/f_string.c +0 -0
  620. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_dec.c +0 -0
  621. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_enc.c +0 -0
  622. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_fre.c +0 -0
  623. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_new.c +0 -0
  624. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_typ.c +0 -0
  625. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/tasn_utl.c +0 -0
  626. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/asn1/time_support.c +0 -0
  627. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/base64/base64.c +0 -0
  628. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/bio.c +0 -0
  629. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/bio_mem.c +0 -0
  630. data/third_party/boringssl-with-bazel/src/crypto/bio/connect.c +545 -0
  631. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +279 -0
  632. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +317 -0
  633. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/hexdump.c +0 -0
  634. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/internal.h +0 -0
  635. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +488 -0
  636. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/printf.c +0 -0
  637. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/socket.c +0 -0
  638. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bio/socket_helper.c +0 -0
  639. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bn_extra/bn_asn1.c +0 -0
  640. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bn_extra/convert.c +0 -0
  641. data/third_party/boringssl-with-bazel/src/crypto/buf/buf.c +172 -0
  642. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/asn1_compat.c +0 -0
  643. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/ber.c +0 -0
  644. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbb.c +719 -0
  645. data/third_party/boringssl-with-bazel/src/crypto/bytestring/cbs.c +688 -0
  646. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/internal.h +0 -0
  647. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/bytestring/unicode.c +0 -0
  648. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/chacha/chacha.c +0 -0
  649. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/chacha/internal.h +0 -0
  650. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/cipher_extra.c +0 -0
  651. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/derive_key.c +152 -0
  652. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_aesccm.c +0 -0
  653. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_aesctrhmac.c +0 -0
  654. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_aesgcmsiv.c +891 -0
  655. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_chacha20poly1305.c +0 -0
  656. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_null.c +0 -0
  657. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_rc2.c +0 -0
  658. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_rc4.c +0 -0
  659. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/e_tls.c +0 -0
  660. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/internal.h +0 -0
  661. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cipher_extra/tls_cbc.c +0 -0
  662. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cmac/cmac.c +0 -0
  663. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/conf.c +0 -0
  664. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/conf_def.h +0 -0
  665. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/conf/internal.h +0 -0
  666. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-aarch64-fuchsia.c +0 -0
  667. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-aarch64-linux.c +0 -0
  668. data/third_party/boringssl-with-bazel/src/crypto/cpu-arm-linux.c +220 -0
  669. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-arm-linux.h +0 -0
  670. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-arm.c +0 -0
  671. data/third_party/boringssl-with-bazel/src/crypto/cpu-intel.c +291 -0
  672. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/cpu-ppc64le.c +0 -0
  673. data/third_party/boringssl-with-bazel/src/crypto/crypto.c +226 -0
  674. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +2159 -0
  675. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +7872 -0
  676. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +146 -0
  677. data/third_party/boringssl-with-bazel/src/crypto/curve25519/spake25519.c +539 -0
  678. data/third_party/boringssl-with-bazel/src/crypto/dh/check.c +217 -0
  679. data/third_party/boringssl-with-bazel/src/crypto/dh/dh.c +533 -0
  680. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/dh_asn1.c +0 -0
  681. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dh/params.c +0 -0
  682. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/digest_extra/digest_extra.c +0 -0
  683. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +980 -0
  684. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/dsa/dsa_asn1.c +0 -0
  685. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ec_extra/ec_asn1.c +0 -0
  686. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/ec_derive.c +95 -0
  687. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +425 -0
  688. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +78 -0
  689. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +124 -0
  690. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ecdsa_extra/ecdsa_asn1.c +0 -0
  691. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/engine/engine.c +0 -0
  692. data/third_party/boringssl-with-bazel/src/crypto/err/err.c +850 -0
  693. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/err/internal.h +0 -0
  694. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/digestsign.c +0 -0
  695. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp.c +0 -0
  696. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp_asn1.c +0 -0
  697. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/evp_ctx.c +0 -0
  698. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/internal.h +0 -0
  699. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_dsa_asn1.c +0 -0
  700. data/third_party/boringssl-with-bazel/src/crypto/evp/p_ec.c +286 -0
  701. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ec_asn1.c +0 -0
  702. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ed25519.c +0 -0
  703. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_ed25519_asn1.c +0 -0
  704. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +648 -0
  705. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_rsa_asn1.c +0 -0
  706. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/p_x25519.c +0 -0
  707. data/third_party/boringssl-with-bazel/src/crypto/evp/p_x25519_asn1.c +248 -0
  708. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/pbkdf.c +0 -0
  709. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/print.c +0 -0
  710. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/scrypt.c +0 -0
  711. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/evp/sign.c +0 -0
  712. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/ex_data.c +0 -0
  713. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes.c +108 -0
  714. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/aes_nohw.c +1282 -0
  715. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/internal.h +238 -0
  716. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/aes/key_wrap.c +0 -0
  717. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/aes/mode_wrappers.c +106 -0
  718. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +263 -0
  719. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/add.c +0 -0
  720. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/asm/x86_64-gcc.c +0 -0
  721. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/bn.c +0 -0
  722. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/bytes.c +0 -0
  723. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/cmp.c +0 -0
  724. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/ctx.c +0 -0
  725. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/div.c +0 -0
  726. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/div_extra.c +0 -0
  727. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/exponentiation.c +1288 -0
  728. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/gcd.c +0 -0
  729. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/gcd_extra.c +0 -0
  730. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/generic.c +0 -0
  731. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/internal.h +694 -0
  732. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/jacobi.c +0 -0
  733. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/montgomery.c +502 -0
  734. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/montgomery_inv.c +0 -0
  735. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/mul.c +749 -0
  736. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bn/prime.c +1068 -0
  737. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/random.c +0 -0
  738. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/rsaz_exp.c +0 -0
  739. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/rsaz_exp.h +0 -0
  740. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/shift.c +0 -0
  741. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/bn/sqrt.c +0 -0
  742. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/aead.c +0 -0
  743. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/cipher.c +0 -0
  744. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/e_aes.c +1302 -0
  745. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/e_des.c +0 -0
  746. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/cipher/internal.h +0 -0
  747. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/delocate.h +0 -0
  748. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/des/des.c +0 -0
  749. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/des/internal.h +0 -0
  750. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/digest.c +0 -0
  751. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/digests.c +296 -0
  752. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/internal.h +0 -0
  753. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/digest/md32_common.h +0 -0
  754. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +1252 -0
  755. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +465 -0
  756. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +524 -0
  757. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/felem.c +100 -0
  758. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +775 -0
  759. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +328 -0
  760. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +1178 -0
  761. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64-table.h +9497 -0
  762. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-x86_64.c +632 -0
  763. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/p256-x86_64.h +0 -0
  764. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +736 -0
  765. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +297 -0
  766. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/scalar.c +175 -0
  767. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +357 -0
  768. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +270 -0
  769. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/ec/util.c +0 -0
  770. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +270 -0
  771. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +122 -0
  772. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +328 -0
  773. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/fips_shared_support.c +0 -0
  774. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/hmac/hmac.c +0 -0
  775. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/is_fips.c +0 -0
  776. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md4/md4.c +0 -0
  777. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md5/internal.h +0 -0
  778. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/md5/md5.c +0 -0
  779. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/cbc.c +0 -0
  780. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/cfb.c +0 -0
  781. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/ctr.c +0 -0
  782. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +729 -0
  783. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +304 -0
  784. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +441 -0
  785. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/ofb.c +0 -0
  786. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/modes/polyval.c +0 -0
  787. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rand/ctrdrbg.c +0 -0
  788. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.c +137 -0
  789. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/fork_detect.h +49 -0
  790. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/getrandom_fillin.h +64 -0
  791. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/internal.h +163 -0
  792. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/rand.c +378 -0
  793. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +391 -0
  794. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/blinding.c +243 -0
  795. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +127 -0
  796. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/rsa/padding.c +0 -0
  797. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +898 -0
  798. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +1358 -0
  799. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/self_check/self_check.c +0 -0
  800. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/internal.h +0 -0
  801. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha1-altivec.c +0 -0
  802. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha1.c +0 -0
  803. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/sha/sha256.c +0 -0
  804. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/sha/sha512.c +544 -0
  805. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/tls/internal.h +0 -0
  806. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/fipsmodule/tls/kdf.c +0 -0
  807. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/hkdf/hkdf.c +0 -0
  808. data/third_party/boringssl-with-bazel/src/crypto/hrss/hrss.c +2100 -0
  809. data/third_party/boringssl-with-bazel/src/crypto/hrss/internal.h +61 -0
  810. data/third_party/boringssl-with-bazel/src/crypto/internal.h +834 -0
  811. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/lhash/lhash.c +0 -0
  812. data/third_party/boringssl-with-bazel/src/crypto/mem.c +359 -0
  813. data/third_party/boringssl-with-bazel/src/crypto/obj/obj.c +549 -0
  814. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +11585 -0
  815. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/obj/obj_xref.c +0 -0
  816. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_all.c +0 -0
  817. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_info.c +360 -0
  818. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +777 -0
  819. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_oth.c +87 -0
  820. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pk8.c +257 -0
  821. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_pkey.c +218 -0
  822. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_x509.c +0 -0
  823. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pem/pem_xaux.c +0 -0
  824. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs7/internal.h +0 -0
  825. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs7/pkcs7.c +0 -0
  826. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7_x509.c +385 -0
  827. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/internal.h +0 -0
  828. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/p5_pbev2.c +0 -0
  829. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/pkcs8.c +0 -0
  830. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pkcs8/pkcs8_x509.c +0 -0
  831. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/poly1305/internal.h +0 -0
  832. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305.c +318 -0
  833. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_arm.c +305 -0
  834. data/third_party/boringssl-with-bazel/src/crypto/poly1305/poly1305_vec.c +856 -0
  835. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/pool/internal.h +0 -0
  836. data/third_party/boringssl-with-bazel/src/crypto/pool/pool.c +220 -0
  837. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/deterministic.c +52 -0
  838. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/forkunsafe.c +0 -0
  839. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/fuchsia.c +0 -0
  840. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rand_extra/rand_extra.c +0 -0
  841. data/third_party/boringssl-with-bazel/src/crypto/rand_extra/windows.c +69 -0
  842. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rc4/rc4.c +0 -0
  843. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/refcount_c11.c +0 -0
  844. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/refcount_lock.c +0 -0
  845. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rsa_extra/rsa_asn1.c +0 -0
  846. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/rsa_extra/rsa_print.c +0 -0
  847. data/third_party/boringssl-with-bazel/src/crypto/siphash/siphash.c +82 -0
  848. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/stack/stack.c +0 -0
  849. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread.c +0 -0
  850. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/thread_none.c +0 -0
  851. data/third_party/boringssl-with-bazel/src/crypto/thread_pthread.c +210 -0
  852. data/third_party/boringssl-with-bazel/src/crypto/thread_win.c +260 -0
  853. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +278 -0
  854. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +1474 -0
  855. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +720 -0
  856. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_digest.c +0 -0
  857. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_sign.c +0 -0
  858. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/a_strex.c +0 -0
  859. data/third_party/boringssl-with-bazel/src/crypto/x509/a_verify.c +114 -0
  860. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/algorithm.c +0 -0
  861. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/asn1_gen.c +0 -0
  862. data/third_party/boringssl-with-bazel/src/crypto/x509/by_dir.c +458 -0
  863. data/third_party/boringssl-with-bazel/src/crypto/x509/by_file.c +275 -0
  864. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/charmap.h +0 -0
  865. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/i2d_pr.c +0 -0
  866. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/internal.h +0 -0
  867. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/rsa_pss.c +0 -0
  868. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_crl.c +0 -0
  869. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_req.c +0 -0
  870. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_x509.c +0 -0
  871. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/t_x509a.c +0 -0
  872. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/vpm_int.h +0 -0
  873. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509.c +0 -0
  874. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_att.c +0 -0
  875. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_cmp.c +476 -0
  876. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_d2.c +0 -0
  877. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_def.c +0 -0
  878. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_ext.c +0 -0
  879. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_lu.c +0 -0
  880. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_obj.c +198 -0
  881. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_r2x.c +116 -0
  882. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +341 -0
  883. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_set.c +185 -0
  884. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_trs.c +326 -0
  885. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_txt.c +0 -0
  886. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509_v3.c +0 -0
  887. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vfy.c +2487 -0
  888. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_vpm.c +671 -0
  889. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509cset.c +0 -0
  890. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +389 -0
  891. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509rset.c +0 -0
  892. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x509spki.c +0 -0
  893. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_algor.c +0 -0
  894. data/third_party/boringssl-with-bazel/src/crypto/x509/x_all.c +399 -0
  895. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_attrib.c +0 -0
  896. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_crl.c +0 -0
  897. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_exten.c +0 -0
  898. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_info.c +0 -0
  899. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_name.c +0 -0
  900. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_pkey.c +0 -0
  901. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_pubkey.c +0 -0
  902. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_req.c +0 -0
  903. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_sig.c +0 -0
  904. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_spki.c +0 -0
  905. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_val.c +0 -0
  906. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_x509.c +0 -0
  907. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509/x_x509a.c +0 -0
  908. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/ext_dat.h +0 -0
  909. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/internal.h +0 -0
  910. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_cache.c +0 -0
  911. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_data.c +0 -0
  912. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_int.h +0 -0
  913. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_lib.c +0 -0
  914. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_map.c +0 -0
  915. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_node.c +0 -0
  916. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/pcy_tree.c +0 -0
  917. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_akey.c +0 -0
  918. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_akeya.c +0 -0
  919. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_alt.c +629 -0
  920. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_bcons.c +0 -0
  921. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_bitst.c +0 -0
  922. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_conf.c +0 -0
  923. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_cpols.c +0 -0
  924. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_crld.c +0 -0
  925. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_enum.c +100 -0
  926. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_extku.c +0 -0
  927. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_genn.c +0 -0
  928. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ia5.c +0 -0
  929. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +218 -0
  930. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_int.c +0 -0
  931. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_lib.c +0 -0
  932. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ncons.c +0 -0
  933. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_ocsp.c +0 -0
  934. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pci.c +0 -0
  935. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pcia.c +0 -0
  936. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pcons.c +0 -0
  937. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pku.c +0 -0
  938. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_pmaps.c +0 -0
  939. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_prn.c +0 -0
  940. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_purp.c +843 -0
  941. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_skey.c +0 -0
  942. data/third_party/{boringssl → boringssl-with-bazel/src}/crypto/x509v3/v3_sxnet.c +0 -0
  943. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1395 -0
  944. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/aead.h +0 -0
  945. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/aes.h +0 -0
  946. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/arm_arch.h +0 -0
  947. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1.h +0 -0
  948. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1_mac.h +0 -0
  949. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/asn1t.h +0 -0
  950. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +575 -0
  951. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/base64.h +0 -0
  952. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/bio.h +0 -0
  953. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/blowfish.h +0 -0
  954. data/third_party/boringssl-with-bazel/src/include/openssl/bn.h +1057 -0
  955. data/third_party/boringssl-with-bazel/src/include/openssl/buf.h +137 -0
  956. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/buffer.h +0 -0
  957. data/third_party/boringssl-with-bazel/src/include/openssl/bytestring.h +561 -0
  958. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cast.h +0 -0
  959. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/chacha.h +0 -0
  960. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cipher.h +0 -0
  961. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cmac.h +0 -0
  962. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/conf.h +0 -0
  963. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/cpu.h +0 -0
  964. data/third_party/boringssl-with-bazel/src/include/openssl/crypto.h +149 -0
  965. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/curve25519.h +0 -0
  966. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/des.h +0 -0
  967. data/third_party/boringssl-with-bazel/src/include/openssl/dh.h +319 -0
  968. data/third_party/boringssl-with-bazel/src/include/openssl/digest.h +331 -0
  969. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +457 -0
  970. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/dtls1.h +0 -0
  971. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/e_os2.h +0 -0
  972. data/third_party/boringssl-with-bazel/src/include/openssl/ec.h +424 -0
  973. data/third_party/boringssl-with-bazel/src/include/openssl/ec_key.h +372 -0
  974. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ecdh.h +0 -0
  975. data/third_party/boringssl-with-bazel/src/include/openssl/ecdsa.h +205 -0
  976. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/engine.h +0 -0
  977. data/third_party/boringssl-with-bazel/src/include/openssl/err.h +465 -0
  978. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +1050 -0
  979. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ex_data.h +0 -0
  980. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hkdf.h +0 -0
  981. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hmac.h +0 -0
  982. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/hrss.h +0 -0
  983. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/is_boringssl.h +0 -0
  984. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/lhash.h +0 -0
  985. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/md4.h +0 -0
  986. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/md5.h +0 -0
  987. data/third_party/boringssl-with-bazel/src/include/openssl/mem.h +175 -0
  988. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +4259 -0
  989. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/obj.h +0 -0
  990. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/obj_mac.h +0 -0
  991. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/objects.h +0 -0
  992. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/opensslconf.h +0 -0
  993. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/opensslv.h +0 -0
  994. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ossl_typ.h +0 -0
  995. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pem.h +0 -0
  996. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs12.h +0 -0
  997. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs7.h +0 -0
  998. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pkcs8.h +0 -0
  999. data/third_party/boringssl-with-bazel/src/include/openssl/poly1305.h +49 -0
  1000. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/pool.h +0 -0
  1001. data/third_party/boringssl-with-bazel/src/include/openssl/rand.h +111 -0
  1002. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/rc4.h +0 -0
  1003. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ripemd.h +0 -0
  1004. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +818 -0
  1005. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/safestack.h +0 -0
  1006. data/third_party/boringssl-with-bazel/src/include/openssl/sha.h +294 -0
  1007. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/siphash.h +0 -0
  1008. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/span.h +0 -0
  1009. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/srtp.h +0 -0
  1010. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +5198 -0
  1011. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/ssl3.h +0 -0
  1012. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/stack.h +0 -0
  1013. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/thread.h +0 -0
  1014. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +632 -0
  1015. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +291 -0
  1016. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/type_check.h +0 -0
  1017. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +1207 -0
  1018. data/third_party/boringssl-with-bazel/src/include/openssl/x509_vfy.h +681 -0
  1019. data/third_party/{boringssl → boringssl-with-bazel/src}/include/openssl/x509v3.h +0 -0
  1020. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/bio_ssl.cc +0 -0
  1021. data/third_party/boringssl-with-bazel/src/ssl/d1_both.cc +837 -0
  1022. data/third_party/boringssl-with-bazel/src/ssl/d1_lib.cc +268 -0
  1023. data/third_party/boringssl-with-bazel/src/ssl/d1_pkt.cc +273 -0
  1024. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/d1_srtp.cc +0 -0
  1025. data/third_party/boringssl-with-bazel/src/ssl/dtls_method.cc +200 -0
  1026. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/dtls_record.cc +0 -0
  1027. data/third_party/boringssl-with-bazel/src/ssl/handoff.cc +675 -0
  1028. data/third_party/boringssl-with-bazel/src/ssl/handshake.cc +703 -0
  1029. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +1890 -0
  1030. data/third_party/boringssl-with-bazel/src/ssl/handshake_server.cc +1805 -0
  1031. data/third_party/boringssl-with-bazel/src/ssl/internal.h +3572 -0
  1032. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +724 -0
  1033. data/third_party/boringssl-with-bazel/src/ssl/s3_lib.cc +221 -0
  1034. data/third_party/boringssl-with-bazel/src/ssl/s3_pkt.cc +458 -0
  1035. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_aead_ctx.cc +0 -0
  1036. data/third_party/boringssl-with-bazel/src/ssl/ssl_asn1.cc +856 -0
  1037. data/third_party/boringssl-with-bazel/src/ssl/ssl_buffer.cc +306 -0
  1038. data/third_party/boringssl-with-bazel/src/ssl/ssl_cert.cc +1019 -0
  1039. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +1718 -0
  1040. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_file.cc +0 -0
  1041. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_key_share.cc +0 -0
  1042. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +3015 -0
  1043. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +835 -0
  1044. data/third_party/boringssl-with-bazel/src/ssl/ssl_session.cc +1333 -0
  1045. data/third_party/boringssl-with-bazel/src/ssl/ssl_stat.cc +230 -0
  1046. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_transcript.cc +0 -0
  1047. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +394 -0
  1048. data/third_party/{boringssl → boringssl-with-bazel/src}/ssl/ssl_x509.cc +0 -0
  1049. data/third_party/boringssl-with-bazel/src/ssl/t1_enc.cc +365 -0
  1050. data/third_party/boringssl-with-bazel/src/ssl/t1_lib.cc +3870 -0
  1051. data/third_party/boringssl-with-bazel/src/ssl/tls13_both.cc +689 -0
  1052. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +1017 -0
  1053. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +513 -0
  1054. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +1096 -0
  1055. data/third_party/boringssl-with-bazel/src/ssl/tls_method.cc +317 -0
  1056. data/third_party/boringssl-with-bazel/src/ssl/tls_record.cc +703 -0
  1057. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_32.h +981 -0
  1058. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64.h +619 -0
  1059. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_32.h +3147 -0
  1060. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64.h +1226 -0
  1061. data/third_party/upb/upb/decode.c +4 -0
  1062. data/third_party/upb/upb/port.c +0 -1
  1063. data/third_party/upb/upb/port_def.inc +1 -3
  1064. data/third_party/upb/upb/table.c +2 -1
  1065. metadata +758 -509
  1066. data/src/boringssl/err_data.c +0 -1407
  1067. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +0 -1898
  1068. data/src/core/lib/gprpp/inlined_vector.h +0 -246
  1069. data/src/core/lib/gprpp/optional.h +0 -48
  1070. data/src/core/lib/gprpp/string_view.h +0 -165
  1071. data/src/core/lib/iomgr/logical_thread.cc +0 -103
  1072. data/src/core/lib/iomgr/logical_thread.h +0 -52
  1073. data/src/core/lib/json/json.cc +0 -94
  1074. data/src/core/lib/json/json_common.h +0 -34
  1075. data/src/core/lib/json/json_reader.h +0 -146
  1076. data/src/core/lib/json/json_string.cc +0 -367
  1077. data/src/core/lib/json/json_writer.h +0 -84
  1078. data/src/core/lib/security/credentials/tls/spiffe_credentials.cc +0 -129
  1079. data/src/core/lib/security/credentials/tls/spiffe_credentials.h +0 -62
  1080. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +0 -541
  1081. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +0 -158
  1082. data/src/core/tsi/grpc_shadow_boringssl.h +0 -3297
  1083. data/third_party/boringssl/crypto/asn1/a_time.c +0 -213
  1084. data/third_party/boringssl/crypto/bio/connect.c +0 -546
  1085. data/third_party/boringssl/crypto/bio/fd.c +0 -280
  1086. data/third_party/boringssl/crypto/bio/file.c +0 -318
  1087. data/third_party/boringssl/crypto/bio/pair.c +0 -489
  1088. data/third_party/boringssl/crypto/buf/buf.c +0 -231
  1089. data/third_party/boringssl/crypto/bytestring/cbb.c +0 -680
  1090. data/third_party/boringssl/crypto/bytestring/cbs.c +0 -631
  1091. data/third_party/boringssl/crypto/cipher_extra/derive_key.c +0 -152
  1092. data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +0 -883
  1093. data/third_party/boringssl/crypto/cpu-arm-linux.c +0 -219
  1094. data/third_party/boringssl/crypto/cpu-intel.c +0 -282
  1095. data/third_party/boringssl/crypto/crypto.c +0 -215
  1096. data/third_party/boringssl/crypto/curve25519/spake25519.c +0 -539
  1097. data/third_party/boringssl/crypto/dh/check.c +0 -217
  1098. data/third_party/boringssl/crypto/dh/dh.c +0 -519
  1099. data/third_party/boringssl/crypto/dsa/dsa.c +0 -970
  1100. data/third_party/boringssl/crypto/ec_extra/ec_derive.c +0 -96
  1101. data/third_party/boringssl/crypto/ecdh_extra/ecdh_extra.c +0 -124
  1102. data/third_party/boringssl/crypto/err/err.c +0 -849
  1103. data/third_party/boringssl/crypto/evp/p_ec.c +0 -287
  1104. data/third_party/boringssl/crypto/evp/p_rsa.c +0 -636
  1105. data/third_party/boringssl/crypto/evp/p_x25519_asn1.c +0 -249
  1106. data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +0 -860
  1107. data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +0 -240
  1108. data/third_party/boringssl/crypto/fipsmodule/aes/mode_wrappers.c +0 -108
  1109. data/third_party/boringssl/crypto/fipsmodule/bcm.c +0 -260
  1110. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +0 -1288
  1111. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +0 -691
  1112. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +0 -502
  1113. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +0 -873
  1114. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +0 -1069
  1115. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +0 -1304
  1116. data/third_party/boringssl/crypto/fipsmodule/digest/digests.c +0 -280
  1117. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +0 -1080
  1118. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +0 -479
  1119. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +0 -483
  1120. data/third_party/boringssl/crypto/fipsmodule/ec/felem.c +0 -82
  1121. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +0 -503
  1122. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +0 -336
  1123. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +0 -1187
  1124. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +0 -9501
  1125. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +0 -651
  1126. data/third_party/boringssl/crypto/fipsmodule/ec/scalar.c +0 -96
  1127. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +0 -380
  1128. data/third_party/boringssl/crypto/fipsmodule/ec/simple_mul.c +0 -84
  1129. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +0 -227
  1130. data/third_party/boringssl/crypto/fipsmodule/ecdh/ecdh.c +0 -122
  1131. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +0 -313
  1132. data/third_party/boringssl/crypto/fipsmodule/modes/gcm.c +0 -877
  1133. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +0 -451
  1134. data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +0 -127
  1135. data/third_party/boringssl/crypto/fipsmodule/rand/rand.c +0 -363
  1136. data/third_party/boringssl/crypto/fipsmodule/rand/urandom.c +0 -481
  1137. data/third_party/boringssl/crypto/fipsmodule/rsa/blinding.c +0 -239
  1138. data/third_party/boringssl/crypto/fipsmodule/rsa/internal.h +0 -126
  1139. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +0 -879
  1140. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +0 -1335
  1141. data/third_party/boringssl/crypto/fipsmodule/sha/sha512.c +0 -535
  1142. data/third_party/boringssl/crypto/hrss/hrss.c +0 -2201
  1143. data/third_party/boringssl/crypto/hrss/internal.h +0 -62
  1144. data/third_party/boringssl/crypto/internal.h +0 -814
  1145. data/third_party/boringssl/crypto/mem.c +0 -272
  1146. data/third_party/boringssl/crypto/obj/obj.c +0 -554
  1147. data/third_party/boringssl/crypto/obj/obj_dat.h +0 -11550
  1148. data/third_party/boringssl/crypto/pem/pem_info.c +0 -361
  1149. data/third_party/boringssl/crypto/pem/pem_lib.c +0 -777
  1150. data/third_party/boringssl/crypto/pem/pem_oth.c +0 -88
  1151. data/third_party/boringssl/crypto/pem/pem_pk8.c +0 -258
  1152. data/third_party/boringssl/crypto/pem/pem_pkey.c +0 -219
  1153. data/third_party/boringssl/crypto/pkcs7/pkcs7_x509.c +0 -385
  1154. data/third_party/boringssl/crypto/poly1305/poly1305.c +0 -318
  1155. data/third_party/boringssl/crypto/poly1305/poly1305_arm.c +0 -304
  1156. data/third_party/boringssl/crypto/poly1305/poly1305_vec.c +0 -839
  1157. data/third_party/boringssl/crypto/pool/pool.c +0 -221
  1158. data/third_party/boringssl/crypto/rand_extra/deterministic.c +0 -56
  1159. data/third_party/boringssl/crypto/rand_extra/windows.c +0 -53
  1160. data/third_party/boringssl/crypto/siphash/siphash.c +0 -80
  1161. data/third_party/boringssl/crypto/thread_pthread.c +0 -206
  1162. data/third_party/boringssl/crypto/thread_win.c +0 -256
  1163. data/third_party/boringssl/crypto/x509/a_verify.c +0 -115
  1164. data/third_party/boringssl/crypto/x509/by_dir.c +0 -458
  1165. data/third_party/boringssl/crypto/x509/by_file.c +0 -276
  1166. data/third_party/boringssl/crypto/x509/x509_cmp.c +0 -477
  1167. data/third_party/boringssl/crypto/x509/x509_obj.c +0 -198
  1168. data/third_party/boringssl/crypto/x509/x509_r2x.c +0 -117
  1169. data/third_party/boringssl/crypto/x509/x509_req.c +0 -342
  1170. data/third_party/boringssl/crypto/x509/x509_set.c +0 -169
  1171. data/third_party/boringssl/crypto/x509/x509_trs.c +0 -327
  1172. data/third_party/boringssl/crypto/x509/x509_vfy.c +0 -2483
  1173. data/third_party/boringssl/crypto/x509/x509_vpm.c +0 -672
  1174. data/third_party/boringssl/crypto/x509/x509name.c +0 -388
  1175. data/third_party/boringssl/crypto/x509/x_all.c +0 -400
  1176. data/third_party/boringssl/crypto/x509v3/v3_alt.c +0 -629
  1177. data/third_party/boringssl/crypto/x509v3/v3_enum.c +0 -100
  1178. data/third_party/boringssl/crypto/x509v3/v3_info.c +0 -219
  1179. data/third_party/boringssl/crypto/x509v3/v3_purp.c +0 -844
  1180. data/third_party/boringssl/crypto/x509v3/v3_utl.c +0 -1396
  1181. data/third_party/boringssl/include/openssl/base.h +0 -571
  1182. data/third_party/boringssl/include/openssl/bn.h +0 -1045
  1183. data/third_party/boringssl/include/openssl/buf.h +0 -137
  1184. data/third_party/boringssl/include/openssl/bytestring.h +0 -527
  1185. data/third_party/boringssl/include/openssl/crypto.h +0 -144
  1186. data/third_party/boringssl/include/openssl/dh.h +0 -299
  1187. data/third_party/boringssl/include/openssl/digest.h +0 -330
  1188. data/third_party/boringssl/include/openssl/dsa.h +0 -441
  1189. data/third_party/boringssl/include/openssl/ec.h +0 -417
  1190. data/third_party/boringssl/include/openssl/ec_key.h +0 -370
  1191. data/third_party/boringssl/include/openssl/ecdsa.h +0 -199
  1192. data/third_party/boringssl/include/openssl/err.h +0 -461
  1193. data/third_party/boringssl/include/openssl/evp.h +0 -1030
  1194. data/third_party/boringssl/include/openssl/mem.h +0 -160
  1195. data/third_party/boringssl/include/openssl/nid.h +0 -4245
  1196. data/third_party/boringssl/include/openssl/poly1305.h +0 -51
  1197. data/third_party/boringssl/include/openssl/rand.h +0 -125
  1198. data/third_party/boringssl/include/openssl/rsa.h +0 -787
  1199. data/third_party/boringssl/include/openssl/sha.h +0 -268
  1200. data/third_party/boringssl/include/openssl/ssl.h +0 -5113
  1201. data/third_party/boringssl/include/openssl/tls1.h +0 -634
  1202. data/third_party/boringssl/include/openssl/x509.h +0 -1205
  1203. data/third_party/boringssl/include/openssl/x509_vfy.h +0 -680
  1204. data/third_party/boringssl/ssl/d1_both.cc +0 -842
  1205. data/third_party/boringssl/ssl/d1_lib.cc +0 -268
  1206. data/third_party/boringssl/ssl/d1_pkt.cc +0 -274
  1207. data/third_party/boringssl/ssl/dtls_method.cc +0 -192
  1208. data/third_party/boringssl/ssl/handoff.cc +0 -489
  1209. data/third_party/boringssl/ssl/handshake.cc +0 -691
  1210. data/third_party/boringssl/ssl/handshake_client.cc +0 -1871
  1211. data/third_party/boringssl/ssl/handshake_server.cc +0 -1801
  1212. data/third_party/boringssl/ssl/internal.h +0 -3549
  1213. data/third_party/boringssl/ssl/s3_both.cc +0 -724
  1214. data/third_party/boringssl/ssl/s3_lib.cc +0 -222
  1215. data/third_party/boringssl/ssl/s3_pkt.cc +0 -459
  1216. data/third_party/boringssl/ssl/ssl_asn1.cc +0 -828
  1217. data/third_party/boringssl/ssl/ssl_buffer.cc +0 -287
  1218. data/third_party/boringssl/ssl/ssl_cert.cc +0 -1016
  1219. data/third_party/boringssl/ssl/ssl_cipher.cc +0 -1719
  1220. data/third_party/boringssl/ssl/ssl_lib.cc +0 -3011
  1221. data/third_party/boringssl/ssl/ssl_privkey.cc +0 -824
  1222. data/third_party/boringssl/ssl/ssl_session.cc +0 -1273
  1223. data/third_party/boringssl/ssl/ssl_stat.cc +0 -224
  1224. data/third_party/boringssl/ssl/ssl_versions.cc +0 -394
  1225. data/third_party/boringssl/ssl/t1_enc.cc +0 -361
  1226. data/third_party/boringssl/ssl/t1_lib.cc +0 -4036
  1227. data/third_party/boringssl/ssl/tls13_both.cc +0 -689
  1228. data/third_party/boringssl/ssl/tls13_client.cc +0 -947
  1229. data/third_party/boringssl/ssl/tls13_enc.cc +0 -561
  1230. data/third_party/boringssl/ssl/tls13_server.cc +0 -1089
  1231. data/third_party/boringssl/ssl/tls_method.cc +0 -279
  1232. data/third_party/boringssl/ssl/tls_record.cc +0 -698
  1233. data/third_party/boringssl/third_party/fiat/curve25519.c +0 -2167
  1234. data/third_party/boringssl/third_party/fiat/curve25519_32.h +0 -911
  1235. data/third_party/boringssl/third_party/fiat/curve25519_64.h +0 -559
  1236. data/third_party/boringssl/third_party/fiat/curve25519_tables.h +0 -7880
  1237. data/third_party/boringssl/third_party/fiat/internal.h +0 -154
  1238. data/third_party/boringssl/third_party/fiat/p256.c +0 -1063
  1239. data/third_party/boringssl/third_party/fiat/p256_32.h +0 -3226
  1240. data/third_party/boringssl/third_party/fiat/p256_64.h +0 -1217
@@ -21,6 +21,8 @@
21
21
 
22
22
  #include <grpc/support/port_platform.h>
23
23
 
24
+ #include <deque>
25
+
24
26
  #include "src/core/ext/filters/client_channel/client_channel_channelz.h"
25
27
  #include "src/core/ext/filters/client_channel/connector.h"
26
28
  #include "src/core/ext/filters/client_channel/subchannel_pool_interface.h"
@@ -176,24 +178,44 @@ class SubchannelCall {
176
178
  class Subchannel {
177
179
  public:
178
180
  class ConnectivityStateWatcherInterface
179
- : public InternallyRefCounted<ConnectivityStateWatcherInterface> {
181
+ : public RefCounted<ConnectivityStateWatcherInterface> {
180
182
  public:
183
+ struct ConnectivityStateChange {
184
+ grpc_connectivity_state state;
185
+ RefCountedPtr<ConnectedSubchannel> connected_subchannel;
186
+ };
187
+
181
188
  virtual ~ConnectivityStateWatcherInterface() = default;
182
189
 
183
190
  // Will be invoked whenever the subchannel's connectivity state
184
191
  // changes. There will be only one invocation of this method on a
185
192
  // given watcher instance at any given time.
186
- //
193
+ // Implementations should call PopConnectivityStateChange to get the next
194
+ // connectivity state change.
195
+ virtual void OnConnectivityStateChange() = 0;
196
+
197
+ virtual grpc_pollset_set* interested_parties() = 0;
198
+
199
+ // Enqueues connectivity state change notifications.
187
200
  // When the state changes to READY, connected_subchannel will
188
201
  // contain a ref to the connected subchannel. When it changes from
189
202
  // READY to some other state, the implementation must release its
190
203
  // ref to the connected subchannel.
191
- virtual void OnConnectivityStateChange(
192
- grpc_connectivity_state new_state,
193
- RefCountedPtr<ConnectedSubchannel> connected_subchannel) // NOLINT
194
- = 0;
204
+ // TODO(yashkt): This is currently needed to send the state updates in the
205
+ // right order when asynchronously notifying. This will no longer be
206
+ // necessary when we have access to EventManager.
207
+ void PushConnectivityStateChange(ConnectivityStateChange state_change);
195
208
 
196
- virtual grpc_pollset_set* interested_parties() = 0;
209
+ // Dequeues connectivity state change notifications.
210
+ ConnectivityStateChange PopConnectivityStateChange();
211
+
212
+ private:
213
+ // Keeps track of the updates that the watcher instance must be notified of.
214
+ // TODO(yashkt): This is currently needed to send the state updates in the
215
+ // right order when asynchronously notifying. This will no longer be
216
+ // necessary when we have access to EventManager.
217
+ std::deque<ConnectivityStateChange> connectivity_state_queue_;
218
+ Mutex mu_; // protects the queue
197
219
  };
198
220
 
199
221
  // The ctor and dtor are not intended to use directly.
@@ -243,7 +265,7 @@ class Subchannel {
243
265
  void WatchConnectivityState(
244
266
  grpc_connectivity_state initial_state,
245
267
  grpc_core::UniquePtr<char> health_check_service_name,
246
- OrphanablePtr<ConnectivityStateWatcherInterface> watcher);
268
+ RefCountedPtr<ConnectivityStateWatcherInterface> watcher);
247
269
 
248
270
  // Cancels a connectivity state watch.
249
271
  // If the watcher has already been destroyed, this is a no-op.
@@ -280,7 +302,7 @@ class Subchannel {
280
302
  ~ConnectivityStateWatcherList() { Clear(); }
281
303
 
282
304
  void AddWatcherLocked(
283
- OrphanablePtr<ConnectivityStateWatcherInterface> watcher);
305
+ RefCountedPtr<ConnectivityStateWatcherInterface> watcher);
284
306
  void RemoveWatcherLocked(ConnectivityStateWatcherInterface* watcher);
285
307
 
286
308
  // Notifies all watchers in the list about a change to state.
@@ -294,7 +316,7 @@ class Subchannel {
294
316
  // TODO(roth): Once we can use C++-14 heterogeneous lookups, this can
295
317
  // be a set instead of a map.
296
318
  std::map<ConnectivityStateWatcherInterface*,
297
- OrphanablePtr<ConnectivityStateWatcherInterface>>
319
+ RefCountedPtr<ConnectivityStateWatcherInterface>>
298
320
  watchers_;
299
321
  };
300
322
 
@@ -312,7 +334,7 @@ class Subchannel {
312
334
  void AddWatcherLocked(
313
335
  Subchannel* subchannel, grpc_connectivity_state initial_state,
314
336
  grpc_core::UniquePtr<char> health_check_service_name,
315
- OrphanablePtr<ConnectivityStateWatcherInterface> watcher);
337
+ RefCountedPtr<ConnectivityStateWatcherInterface> watcher);
316
338
  void RemoveWatcherLocked(const char* health_check_service_name,
317
339
  ConnectivityStateWatcherInterface* watcher);
318
340
 
@@ -332,6 +354,8 @@ class Subchannel {
332
354
 
333
355
  class ConnectedSubchannelStateWatcher;
334
356
 
357
+ class AsyncWatcherNotifierLocked;
358
+
335
359
  // Sets the subchannel's connectivity state to \a state.
336
360
  void SetConnectivityStateLocked(grpc_connectivity_state state);
337
361
 
@@ -19,42 +19,55 @@
19
19
  #include <grpc/support/port_platform.h>
20
20
 
21
21
  #include <algorithm>
22
+ #include <cctype>
23
+ #include <cstdlib>
24
+
25
+ #include "absl/strings/str_cat.h"
26
+ #include "absl/strings/str_join.h"
27
+ #include "absl/strings/str_split.h"
22
28
 
23
29
  #include <grpc/impl/codegen/log.h>
24
30
  #include <grpc/support/alloc.h>
25
31
  #include <grpc/support/string_util.h>
26
32
 
27
33
  #include "src/core/ext/filters/client_channel/xds/xds_api.h"
34
+ #include "src/core/lib/gpr/env.h"
35
+ #include "src/core/lib/gpr/string.h"
36
+ #include "src/core/lib/gpr/useful.h"
28
37
  #include "src/core/lib/iomgr/error.h"
29
38
  #include "src/core/lib/iomgr/sockaddr_utils.h"
30
39
 
40
+ #include "envoy/api/v2/cds.upb.h"
31
41
  #include "envoy/api/v2/core/address.upb.h"
32
42
  #include "envoy/api/v2/core/base.upb.h"
43
+ #include "envoy/api/v2/core/config_source.upb.h"
33
44
  #include "envoy/api/v2/core/health_check.upb.h"
34
45
  #include "envoy/api/v2/discovery.upb.h"
35
46
  #include "envoy/api/v2/eds.upb.h"
36
47
  #include "envoy/api/v2/endpoint/endpoint.upb.h"
37
48
  #include "envoy/api/v2/endpoint/load_report.upb.h"
49
+ #include "envoy/api/v2/lds.upb.h"
50
+ #include "envoy/api/v2/rds.upb.h"
51
+ #include "envoy/api/v2/route/route.upb.h"
52
+ #include "envoy/config/filter/network/http_connection_manager/v2/http_connection_manager.upb.h"
53
+ #include "envoy/config/listener/v2/api_listener.upb.h"
38
54
  #include "envoy/service/load_stats/v2/lrs.upb.h"
39
55
  #include "envoy/type/percent.upb.h"
40
56
  #include "google/protobuf/any.upb.h"
41
57
  #include "google/protobuf/duration.upb.h"
42
58
  #include "google/protobuf/struct.upb.h"
43
- #include "google/protobuf/timestamp.upb.h"
44
59
  #include "google/protobuf/wrappers.upb.h"
60
+ #include "google/rpc/status.upb.h"
45
61
  #include "upb/upb.h"
46
62
 
47
63
  namespace grpc_core {
48
64
 
49
- namespace {
50
-
51
- constexpr char kEdsTypeUrl[] =
52
- "type.googleapis.com/envoy.api.v2.ClusterLoadAssignment";
53
-
54
- } // namespace
65
+ //
66
+ // XdsApi::PriorityListUpdate
67
+ //
55
68
 
56
- bool XdsPriorityListUpdate::operator==(
57
- const XdsPriorityListUpdate& other) const {
69
+ bool XdsApi::PriorityListUpdate::operator==(
70
+ const XdsApi::PriorityListUpdate& other) const {
58
71
  if (priorities_.size() != other.priorities_.size()) return false;
59
72
  for (size_t i = 0; i < priorities_.size(); ++i) {
60
73
  if (priorities_[i].localities != other.priorities_[i].localities) {
@@ -64,8 +77,8 @@ bool XdsPriorityListUpdate::operator==(
64
77
  return true;
65
78
  }
66
79
 
67
- void XdsPriorityListUpdate::Add(
68
- XdsPriorityListUpdate::LocalityMap::Locality locality) {
80
+ void XdsApi::PriorityListUpdate::Add(
81
+ XdsApi::PriorityListUpdate::LocalityMap::Locality locality) {
69
82
  // Pad the missing priorities in case the localities are not ordered by
70
83
  // priority.
71
84
  if (!Contains(locality.priority)) priorities_.resize(locality.priority + 1);
@@ -73,13 +86,13 @@ void XdsPriorityListUpdate::Add(
73
86
  locality_map.localities.emplace(locality.name, std::move(locality));
74
87
  }
75
88
 
76
- const XdsPriorityListUpdate::LocalityMap* XdsPriorityListUpdate::Find(
89
+ const XdsApi::PriorityListUpdate::LocalityMap* XdsApi::PriorityListUpdate::Find(
77
90
  uint32_t priority) const {
78
91
  if (!Contains(priority)) return nullptr;
79
92
  return &priorities_[priority];
80
93
  }
81
94
 
82
- bool XdsPriorityListUpdate::Contains(
95
+ bool XdsApi::PriorityListUpdate::Contains(
83
96
  const RefCountedPtr<XdsLocalityName>& name) {
84
97
  for (size_t i = 0; i < priorities_.size(); ++i) {
85
98
  const LocalityMap& locality_map = priorities_[i];
@@ -88,8 +101,11 @@ bool XdsPriorityListUpdate::Contains(
88
101
  return false;
89
102
  }
90
103
 
91
- bool XdsDropConfig::ShouldDrop(
92
- const grpc_core::UniquePtr<char>** category_name) const {
104
+ //
105
+ // XdsApi::DropConfig
106
+ //
107
+
108
+ bool XdsApi::DropConfig::ShouldDrop(const std::string** category_name) const {
93
109
  for (size_t i = 0; i < drop_category_list_.size(); ++i) {
94
110
  const auto& drop_category = drop_category_list_[i];
95
111
  // Generate a random number in [0, 1000000).
@@ -102,13 +118,46 @@ bool XdsDropConfig::ShouldDrop(
102
118
  return false;
103
119
  }
104
120
 
121
+ //
122
+ // XdsApi
123
+ //
124
+
125
+ const char* XdsApi::kLdsTypeUrl = "type.googleapis.com/envoy.api.v2.Listener";
126
+ const char* XdsApi::kRdsTypeUrl =
127
+ "type.googleapis.com/envoy.api.v2.RouteConfiguration";
128
+ const char* XdsApi::kCdsTypeUrl = "type.googleapis.com/envoy.api.v2.Cluster";
129
+ const char* XdsApi::kEdsTypeUrl =
130
+ "type.googleapis.com/envoy.api.v2.ClusterLoadAssignment";
131
+
132
+ namespace {
133
+
134
+ bool XdsRoutingEnabled() {
135
+ char* value = gpr_getenv("GRPC_XDS_EXPERIMENTAL_ROUTING");
136
+ bool parsed_value;
137
+ bool parse_succeeded = gpr_parse_bool_value(value, &parsed_value);
138
+ gpr_free(value);
139
+ return parse_succeeded && parsed_value;
140
+ }
141
+
142
+ } // namespace
143
+
144
+ XdsApi::XdsApi(XdsClient* client, TraceFlag* tracer,
145
+ const XdsBootstrap::Node* node)
146
+ : client_(client),
147
+ tracer_(tracer),
148
+ xds_routing_enabled_(XdsRoutingEnabled()),
149
+ node_(node),
150
+ build_version_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING, " ",
151
+ grpc_version_string())),
152
+ user_agent_name_(absl::StrCat("gRPC C-core ", GPR_PLATFORM_STRING)) {}
153
+
105
154
  namespace {
106
155
 
107
156
  void PopulateMetadataValue(upb_arena* arena, google_protobuf_Value* value_pb,
108
- const XdsBootstrap::MetadataValue& value);
157
+ const Json& value);
109
158
 
110
159
  void PopulateListValue(upb_arena* arena, google_protobuf_ListValue* list_value,
111
- const std::vector<XdsBootstrap::MetadataValue>& values) {
160
+ const Json::Array& values) {
112
161
  for (const auto& value : values) {
113
162
  auto* value_pb = google_protobuf_ListValue_add_values(list_value, arena);
114
163
  PopulateMetadataValue(arena, value_pb, value);
@@ -116,13 +165,12 @@ void PopulateListValue(upb_arena* arena, google_protobuf_ListValue* list_value,
116
165
  }
117
166
 
118
167
  void PopulateMetadata(upb_arena* arena, google_protobuf_Struct* metadata_pb,
119
- const std::map<const char*, XdsBootstrap::MetadataValue,
120
- StringLess>& metadata) {
168
+ const Json::Object& metadata) {
121
169
  for (const auto& p : metadata) {
122
170
  google_protobuf_Struct_FieldsEntry* field =
123
171
  google_protobuf_Struct_add_fields(metadata_pb, arena);
124
- google_protobuf_Struct_FieldsEntry_set_key(field,
125
- upb_strview_makez(p.first));
172
+ google_protobuf_Struct_FieldsEntry_set_key(
173
+ field, upb_strview_makez(p.first.c_str()));
126
174
  google_protobuf_Value* value =
127
175
  google_protobuf_Struct_FieldsEntry_mutable_value(field, arena);
128
176
  PopulateMetadataValue(arena, value, p.second);
@@ -130,98 +178,1187 @@ void PopulateMetadata(upb_arena* arena, google_protobuf_Struct* metadata_pb,
130
178
  }
131
179
 
132
180
  void PopulateMetadataValue(upb_arena* arena, google_protobuf_Value* value_pb,
133
- const XdsBootstrap::MetadataValue& value) {
134
- switch (value.type) {
135
- case XdsBootstrap::MetadataValue::Type::MD_NULL:
181
+ const Json& value) {
182
+ switch (value.type()) {
183
+ case Json::Type::JSON_NULL:
136
184
  google_protobuf_Value_set_null_value(value_pb, 0);
137
185
  break;
138
- case XdsBootstrap::MetadataValue::Type::DOUBLE:
139
- google_protobuf_Value_set_number_value(value_pb, value.double_value);
186
+ case Json::Type::NUMBER:
187
+ google_protobuf_Value_set_number_value(
188
+ value_pb, strtod(value.string_value().c_str(), nullptr));
140
189
  break;
141
- case XdsBootstrap::MetadataValue::Type::STRING:
190
+ case Json::Type::STRING:
142
191
  google_protobuf_Value_set_string_value(
143
- value_pb, upb_strview_makez(value.string_value));
192
+ value_pb, upb_strview_makez(value.string_value().c_str()));
193
+ break;
194
+ case Json::Type::JSON_TRUE:
195
+ google_protobuf_Value_set_bool_value(value_pb, true);
144
196
  break;
145
- case XdsBootstrap::MetadataValue::Type::BOOL:
146
- google_protobuf_Value_set_bool_value(value_pb, value.bool_value);
197
+ case Json::Type::JSON_FALSE:
198
+ google_protobuf_Value_set_bool_value(value_pb, false);
147
199
  break;
148
- case XdsBootstrap::MetadataValue::Type::STRUCT: {
200
+ case Json::Type::OBJECT: {
149
201
  google_protobuf_Struct* struct_value =
150
202
  google_protobuf_Value_mutable_struct_value(value_pb, arena);
151
- PopulateMetadata(arena, struct_value, value.struct_value);
203
+ PopulateMetadata(arena, struct_value, value.object_value());
152
204
  break;
153
205
  }
154
- case XdsBootstrap::MetadataValue::Type::LIST: {
206
+ case Json::Type::ARRAY: {
155
207
  google_protobuf_ListValue* list_value =
156
208
  google_protobuf_Value_mutable_list_value(value_pb, arena);
157
- PopulateListValue(arena, list_value, value.list_value);
209
+ PopulateListValue(arena, list_value, value.array_value());
158
210
  break;
159
211
  }
160
212
  }
161
213
  }
162
214
 
163
215
  void PopulateNode(upb_arena* arena, const XdsBootstrap::Node* node,
164
- const char* build_version, envoy_api_v2_core_Node* node_msg) {
216
+ const std::string& build_version,
217
+ const std::string& user_agent_name,
218
+ const std::string& server_name,
219
+ envoy_api_v2_core_Node* node_msg) {
165
220
  if (node != nullptr) {
166
- if (node->id != nullptr) {
167
- envoy_api_v2_core_Node_set_id(node_msg, upb_strview_makez(node->id));
221
+ if (!node->id.empty()) {
222
+ envoy_api_v2_core_Node_set_id(node_msg,
223
+ upb_strview_makez(node->id.c_str()));
168
224
  }
169
- if (node->cluster != nullptr) {
170
- envoy_api_v2_core_Node_set_cluster(node_msg,
171
- upb_strview_makez(node->cluster));
225
+ if (!node->cluster.empty()) {
226
+ envoy_api_v2_core_Node_set_cluster(
227
+ node_msg, upb_strview_makez(node->cluster.c_str()));
228
+ }
229
+ if (!node->metadata.object_value().empty()) {
230
+ google_protobuf_Struct* metadata =
231
+ envoy_api_v2_core_Node_mutable_metadata(node_msg, arena);
232
+ PopulateMetadata(arena, metadata, node->metadata.object_value());
172
233
  }
173
- if (!node->metadata.empty()) {
234
+ if (!server_name.empty()) {
174
235
  google_protobuf_Struct* metadata =
175
236
  envoy_api_v2_core_Node_mutable_metadata(node_msg, arena);
176
- PopulateMetadata(arena, metadata, node->metadata);
237
+ google_protobuf_Struct_FieldsEntry* field =
238
+ google_protobuf_Struct_add_fields(metadata, arena);
239
+ google_protobuf_Struct_FieldsEntry_set_key(
240
+ field, upb_strview_makez("PROXYLESS_CLIENT_HOSTNAME"));
241
+ google_protobuf_Value* value =
242
+ google_protobuf_Struct_FieldsEntry_mutable_value(field, arena);
243
+ google_protobuf_Value_set_string_value(
244
+ value, upb_strview_make(server_name.data(), server_name.size()));
177
245
  }
178
- if (node->locality_region != nullptr || node->locality_zone != nullptr ||
179
- node->locality_subzone != nullptr) {
246
+ if (!node->locality_region.empty() || !node->locality_zone.empty() ||
247
+ !node->locality_subzone.empty()) {
180
248
  envoy_api_v2_core_Locality* locality =
181
249
  envoy_api_v2_core_Node_mutable_locality(node_msg, arena);
182
- if (node->locality_region != nullptr) {
250
+ if (!node->locality_region.empty()) {
183
251
  envoy_api_v2_core_Locality_set_region(
184
- locality, upb_strview_makez(node->locality_region));
252
+ locality, upb_strview_makez(node->locality_region.c_str()));
185
253
  }
186
- if (node->locality_zone != nullptr) {
254
+ if (!node->locality_zone.empty()) {
187
255
  envoy_api_v2_core_Locality_set_zone(
188
- locality, upb_strview_makez(node->locality_zone));
256
+ locality, upb_strview_makez(node->locality_zone.c_str()));
189
257
  }
190
- if (node->locality_subzone != nullptr) {
258
+ if (!node->locality_subzone.empty()) {
191
259
  envoy_api_v2_core_Locality_set_sub_zone(
192
- locality, upb_strview_makez(node->locality_subzone));
260
+ locality, upb_strview_makez(node->locality_subzone.c_str()));
261
+ }
262
+ }
263
+ }
264
+ envoy_api_v2_core_Node_set_build_version(
265
+ node_msg, upb_strview_make(build_version.data(), build_version.size()));
266
+ envoy_api_v2_core_Node_set_user_agent_name(
267
+ node_msg,
268
+ upb_strview_make(user_agent_name.data(), user_agent_name.size()));
269
+ envoy_api_v2_core_Node_set_user_agent_version(
270
+ node_msg, upb_strview_makez(grpc_version_string()));
271
+ envoy_api_v2_core_Node_add_client_features(
272
+ node_msg, upb_strview_makez("envoy.lb.does_not_support_overprovisioning"),
273
+ arena);
274
+ }
275
+
276
+ inline absl::string_view UpbStringToAbsl(const upb_strview& str) {
277
+ return absl::string_view(str.data, str.size);
278
+ }
279
+
280
+ inline std::string UpbStringToStdString(const upb_strview& str) {
281
+ return std::string(str.data, str.size);
282
+ }
283
+
284
+ inline void AddStringField(const char* name, const upb_strview& value,
285
+ std::vector<std::string>* fields,
286
+ bool add_if_empty = false) {
287
+ if (value.size > 0 || add_if_empty) {
288
+ fields->emplace_back(
289
+ absl::StrCat(name, ": \"", UpbStringToAbsl(value), "\""));
290
+ }
291
+ }
292
+
293
+ inline void AddUInt32ValueField(const char* name,
294
+ const google_protobuf_UInt32Value* value,
295
+ std::vector<std::string>* fields) {
296
+ if (value != nullptr) {
297
+ fields->emplace_back(absl::StrCat(
298
+ name, " { value: ", google_protobuf_UInt32Value_value(value), " }"));
299
+ }
300
+ }
301
+
302
+ inline void AddLocalityField(int indent_level,
303
+ const envoy_api_v2_core_Locality* locality,
304
+ std::vector<std::string>* fields) {
305
+ std::string indent =
306
+ absl::StrJoin(std::vector<std::string>(indent_level, " "), "");
307
+ // region
308
+ std::string field = absl::StrCat(indent, "region");
309
+ AddStringField(field.c_str(), envoy_api_v2_core_Locality_region(locality),
310
+ fields);
311
+ // zone
312
+ field = absl::StrCat(indent, "zone");
313
+ AddStringField(field.c_str(), envoy_api_v2_core_Locality_zone(locality),
314
+ fields);
315
+ // sub_zone
316
+ field = absl::StrCat(indent, "sub_zone");
317
+ AddStringField(field.c_str(), envoy_api_v2_core_Locality_sub_zone(locality),
318
+ fields);
319
+ }
320
+
321
+ void AddNodeLogFields(const envoy_api_v2_core_Node* node,
322
+ std::vector<std::string>* fields) {
323
+ fields->emplace_back("node {");
324
+ // id
325
+ AddStringField(" id", envoy_api_v2_core_Node_id(node), fields);
326
+ // metadata
327
+ const google_protobuf_Struct* metadata =
328
+ envoy_api_v2_core_Node_metadata(node);
329
+ if (metadata != nullptr) {
330
+ fields->emplace_back(" metadata {");
331
+ size_t num_entries;
332
+ const google_protobuf_Struct_FieldsEntry* const* entries =
333
+ google_protobuf_Struct_fields(metadata, &num_entries);
334
+ for (size_t i = 0; i < num_entries; ++i) {
335
+ fields->emplace_back(" field {");
336
+ // key
337
+ AddStringField(" key",
338
+ google_protobuf_Struct_FieldsEntry_key(entries[i]),
339
+ fields);
340
+ // value
341
+ const google_protobuf_Value* value =
342
+ google_protobuf_Struct_FieldsEntry_value(entries[i]);
343
+ if (value != nullptr) {
344
+ std::string value_str;
345
+ if (google_protobuf_Value_has_string_value(value)) {
346
+ value_str = absl::StrCat(
347
+ "string_value: \"",
348
+ UpbStringToAbsl(google_protobuf_Value_string_value(value)), "\"");
349
+ } else if (google_protobuf_Value_has_null_value(value)) {
350
+ value_str = "null_value: NULL_VALUE";
351
+ } else if (google_protobuf_Value_has_number_value(value)) {
352
+ value_str = absl::StrCat("double_value: ",
353
+ google_protobuf_Value_number_value(value));
354
+ } else if (google_protobuf_Value_has_bool_value(value)) {
355
+ value_str = absl::StrCat("bool_value: ",
356
+ google_protobuf_Value_bool_value(value));
357
+ } else if (google_protobuf_Value_has_struct_value(value)) {
358
+ value_str = "struct_value: <not printed>";
359
+ } else if (google_protobuf_Value_has_list_value(value)) {
360
+ value_str = "list_value: <not printed>";
361
+ } else {
362
+ value_str = "<unknown>";
363
+ }
364
+ fields->emplace_back(absl::StrCat(" value { ", value_str, " }"));
193
365
  }
366
+ fields->emplace_back(" }");
367
+ }
368
+ fields->emplace_back(" }");
369
+ }
370
+ // locality
371
+ const envoy_api_v2_core_Locality* locality =
372
+ envoy_api_v2_core_Node_locality(node);
373
+ if (locality != nullptr) {
374
+ fields->emplace_back(" locality {");
375
+ AddLocalityField(2, locality, fields);
376
+ fields->emplace_back(" }");
377
+ }
378
+ // build_version
379
+ AddStringField(" build_version", envoy_api_v2_core_Node_build_version(node),
380
+ fields);
381
+ // user_agent_name
382
+ AddStringField(" user_agent_name",
383
+ envoy_api_v2_core_Node_user_agent_name(node), fields);
384
+ // user_agent_version
385
+ AddStringField(" user_agent_version",
386
+ envoy_api_v2_core_Node_user_agent_version(node), fields);
387
+ // client_features
388
+ size_t num_client_features;
389
+ const upb_strview* client_features =
390
+ envoy_api_v2_core_Node_client_features(node, &num_client_features);
391
+ for (size_t i = 0; i < num_client_features; ++i) {
392
+ AddStringField(" client_features", client_features[i], fields);
393
+ }
394
+ fields->emplace_back("}");
395
+ }
396
+
397
+ void MaybeLogDiscoveryRequest(XdsClient* client, TraceFlag* tracer,
398
+ const envoy_api_v2_DiscoveryRequest* request) {
399
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
400
+ gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
401
+ // TODO(roth): When we can upgrade upb, use upb textformat code to dump
402
+ // the raw proto instead of doing this manually.
403
+ std::vector<std::string> fields;
404
+ // version_info
405
+ AddStringField("version_info",
406
+ envoy_api_v2_DiscoveryRequest_version_info(request),
407
+ &fields);
408
+ // node
409
+ const envoy_api_v2_core_Node* node =
410
+ envoy_api_v2_DiscoveryRequest_node(request);
411
+ if (node != nullptr) AddNodeLogFields(node, &fields);
412
+ // resource_names
413
+ size_t num_resource_names;
414
+ const upb_strview* resource_names =
415
+ envoy_api_v2_DiscoveryRequest_resource_names(request,
416
+ &num_resource_names);
417
+ for (size_t i = 0; i < num_resource_names; ++i) {
418
+ AddStringField("resource_names", resource_names[i], &fields);
419
+ }
420
+ // type_url
421
+ AddStringField("type_url", envoy_api_v2_DiscoveryRequest_type_url(request),
422
+ &fields);
423
+ // response_nonce
424
+ AddStringField("response_nonce",
425
+ envoy_api_v2_DiscoveryRequest_response_nonce(request),
426
+ &fields);
427
+ // error_detail
428
+ const struct google_rpc_Status* error_detail =
429
+ envoy_api_v2_DiscoveryRequest_error_detail(request);
430
+ if (error_detail != nullptr) {
431
+ fields.emplace_back("error_detail {");
432
+ // code
433
+ int32_t code = google_rpc_Status_code(error_detail);
434
+ if (code != 0) fields.emplace_back(absl::StrCat(" code: ", code));
435
+ // message
436
+ AddStringField(" message", google_rpc_Status_message(error_detail),
437
+ &fields);
438
+ fields.emplace_back("}");
194
439
  }
440
+ gpr_log(GPR_DEBUG, "[xds_client %p] constructed ADS request: %s", client,
441
+ absl::StrJoin(fields, "\n").c_str());
195
442
  }
196
- envoy_api_v2_core_Node_set_build_version(node_msg,
197
- upb_strview_makez(build_version));
443
+ }
444
+
445
+ grpc_slice SerializeDiscoveryRequest(upb_arena* arena,
446
+ envoy_api_v2_DiscoveryRequest* request) {
447
+ size_t output_length;
448
+ char* output =
449
+ envoy_api_v2_DiscoveryRequest_serialize(request, arena, &output_length);
450
+ return grpc_slice_from_copied_buffer(output, output_length);
198
451
  }
199
452
 
200
453
  } // namespace
201
454
 
202
- grpc_slice XdsEdsRequestCreateAndEncode(const char* server_name,
203
- const XdsBootstrap::Node* node,
204
- const char* build_version) {
455
+ grpc_slice XdsApi::CreateAdsRequest(
456
+ const std::string& type_url,
457
+ const std::set<absl::string_view>& resource_names,
458
+ const std::string& version, const std::string& nonce, grpc_error* error,
459
+ bool populate_node) {
205
460
  upb::Arena arena;
206
461
  // Create a request.
207
462
  envoy_api_v2_DiscoveryRequest* request =
208
463
  envoy_api_v2_DiscoveryRequest_new(arena.ptr());
209
- envoy_api_v2_core_Node* node_msg =
210
- envoy_api_v2_DiscoveryRequest_mutable_node(request, arena.ptr());
211
- PopulateNode(arena.ptr(), node, build_version, node_msg);
212
- envoy_api_v2_DiscoveryRequest_add_resource_names(
213
- request, upb_strview_makez(server_name), arena.ptr());
214
- envoy_api_v2_DiscoveryRequest_set_type_url(request,
215
- upb_strview_makez(kEdsTypeUrl));
216
- // Encode the request.
217
- size_t output_length;
218
- char* output = envoy_api_v2_DiscoveryRequest_serialize(request, arena.ptr(),
219
- &output_length);
220
- return grpc_slice_from_copied_buffer(output, output_length);
464
+ // Set type_url.
465
+ envoy_api_v2_DiscoveryRequest_set_type_url(
466
+ request, upb_strview_make(type_url.data(), type_url.size()));
467
+ // Set version_info.
468
+ if (!version.empty()) {
469
+ envoy_api_v2_DiscoveryRequest_set_version_info(
470
+ request, upb_strview_make(version.data(), version.size()));
471
+ }
472
+ // Set nonce.
473
+ if (!nonce.empty()) {
474
+ envoy_api_v2_DiscoveryRequest_set_response_nonce(
475
+ request, upb_strview_make(nonce.data(), nonce.size()));
476
+ }
477
+ // Set error_detail if it's a NACK.
478
+ if (error != GRPC_ERROR_NONE) {
479
+ grpc_slice error_description_slice;
480
+ GPR_ASSERT(grpc_error_get_str(error, GRPC_ERROR_STR_DESCRIPTION,
481
+ &error_description_slice));
482
+ upb_strview error_description_strview =
483
+ upb_strview_make(reinterpret_cast<const char*>(
484
+ GPR_SLICE_START_PTR(error_description_slice)),
485
+ GPR_SLICE_LENGTH(error_description_slice));
486
+ google_rpc_Status* error_detail =
487
+ envoy_api_v2_DiscoveryRequest_mutable_error_detail(request,
488
+ arena.ptr());
489
+ google_rpc_Status_set_message(error_detail, error_description_strview);
490
+ GRPC_ERROR_UNREF(error);
491
+ }
492
+ // Populate node.
493
+ if (populate_node) {
494
+ envoy_api_v2_core_Node* node_msg =
495
+ envoy_api_v2_DiscoveryRequest_mutable_node(request, arena.ptr());
496
+ PopulateNode(arena.ptr(), node_, build_version_, user_agent_name_, "",
497
+ node_msg);
498
+ }
499
+ // Add resource_names.
500
+ for (const auto& resource_name : resource_names) {
501
+ envoy_api_v2_DiscoveryRequest_add_resource_names(
502
+ request, upb_strview_make(resource_name.data(), resource_name.size()),
503
+ arena.ptr());
504
+ }
505
+ MaybeLogDiscoveryRequest(client_, tracer_, request);
506
+ return SerializeDiscoveryRequest(arena.ptr(), request);
221
507
  }
222
508
 
223
509
  namespace {
224
510
 
511
+ void MaybeLogDiscoveryResponse(XdsClient* client, TraceFlag* tracer,
512
+ const envoy_api_v2_DiscoveryResponse* response) {
513
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
514
+ gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
515
+ // TODO(roth): When we can upgrade upb, use upb textformat code to dump
516
+ // the raw proto instead of doing this manually.
517
+ std::vector<std::string> fields;
518
+ // version_info
519
+ AddStringField("version_info",
520
+ envoy_api_v2_DiscoveryResponse_version_info(response),
521
+ &fields);
522
+ // resources
523
+ size_t num_resources;
524
+ envoy_api_v2_DiscoveryResponse_resources(response, &num_resources);
525
+ fields.emplace_back(
526
+ absl::StrCat("resources: <", num_resources, " element(s)>"));
527
+ // type_url
528
+ AddStringField("type_url",
529
+ envoy_api_v2_DiscoveryResponse_type_url(response), &fields);
530
+ // nonce
531
+ AddStringField("nonce", envoy_api_v2_DiscoveryResponse_nonce(response),
532
+ &fields);
533
+ gpr_log(GPR_DEBUG, "[xds_client %p] received response: %s", client,
534
+ absl::StrJoin(fields, "\n").c_str());
535
+ }
536
+ }
537
+
538
+ void MaybeLogRouteConfiguration(
539
+ XdsClient* client, TraceFlag* tracer,
540
+ const envoy_api_v2_RouteConfiguration* route_config) {
541
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
542
+ gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
543
+ // TODO(roth): When we can upgrade upb, use upb textformat code to dump
544
+ // the raw proto instead of doing this manually.
545
+ std::vector<std::string> fields;
546
+ // name
547
+ AddStringField("name", envoy_api_v2_RouteConfiguration_name(route_config),
548
+ &fields);
549
+ // virtual_hosts
550
+ size_t num_virtual_hosts;
551
+ const envoy_api_v2_route_VirtualHost* const* virtual_hosts =
552
+ envoy_api_v2_RouteConfiguration_virtual_hosts(route_config,
553
+ &num_virtual_hosts);
554
+ for (size_t i = 0; i < num_virtual_hosts; ++i) {
555
+ const auto* virtual_host = virtual_hosts[i];
556
+ fields.push_back("virtual_hosts {");
557
+ // name
558
+ AddStringField(
559
+ " name", envoy_api_v2_route_VirtualHost_name(virtual_host), &fields);
560
+ // domains
561
+ size_t num_domains;
562
+ const upb_strview* const domains =
563
+ envoy_api_v2_route_VirtualHost_domains(virtual_host, &num_domains);
564
+ for (size_t j = 0; j < num_domains; ++j) {
565
+ AddStringField(" domains", domains[j], &fields);
566
+ }
567
+ // routes
568
+ size_t num_routes;
569
+ const envoy_api_v2_route_Route* const* routes =
570
+ envoy_api_v2_route_VirtualHost_routes(virtual_host, &num_routes);
571
+ for (size_t j = 0; j < num_routes; ++j) {
572
+ const auto* route = routes[j];
573
+ fields.push_back(" route {");
574
+ // name
575
+ AddStringField(" name", envoy_api_v2_route_Route_name(route),
576
+ &fields);
577
+ // match
578
+ const envoy_api_v2_route_RouteMatch* match =
579
+ envoy_api_v2_route_Route_match(route);
580
+ if (match != nullptr) {
581
+ fields.emplace_back(" match {");
582
+ // path matching
583
+ if (envoy_api_v2_route_RouteMatch_has_prefix(match)) {
584
+ AddStringField(" prefix",
585
+ envoy_api_v2_route_RouteMatch_prefix(match), &fields,
586
+ /*add_if_empty=*/true);
587
+ } else if (envoy_api_v2_route_RouteMatch_has_path(match)) {
588
+ AddStringField(" path",
589
+ envoy_api_v2_route_RouteMatch_path(match), &fields,
590
+ /*add_if_empty=*/true);
591
+ } else if (envoy_api_v2_route_RouteMatch_has_regex(match)) {
592
+ AddStringField(" regex",
593
+ envoy_api_v2_route_RouteMatch_regex(match), &fields,
594
+ /*add_if_empty=*/true);
595
+ } else if (envoy_api_v2_route_RouteMatch_has_safe_regex(match)) {
596
+ fields.emplace_back(" safe_regex: <not printed>");
597
+ } else {
598
+ fields.emplace_back(" <unknown path matching type>");
599
+ }
600
+ // header matching
601
+ size_t num_headers;
602
+ envoy_api_v2_route_RouteMatch_headers(match, &num_headers);
603
+ if (num_headers > 0) {
604
+ fields.emplace_back(
605
+ absl::StrCat(" headers: <", num_headers, " element(s)>"));
606
+ }
607
+ fields.emplace_back(" }");
608
+ }
609
+ // action
610
+ if (envoy_api_v2_route_Route_has_route(route)) {
611
+ const envoy_api_v2_route_RouteAction* action =
612
+ envoy_api_v2_route_Route_route(route);
613
+ fields.emplace_back(" route {");
614
+ if (envoy_api_v2_route_RouteAction_has_cluster(action)) {
615
+ AddStringField(" cluster",
616
+ envoy_api_v2_route_RouteAction_cluster(action),
617
+ &fields);
618
+ } else if (envoy_api_v2_route_RouteAction_has_cluster_header(
619
+ action)) {
620
+ AddStringField(
621
+ " cluster_header",
622
+ envoy_api_v2_route_RouteAction_cluster_header(action), &fields);
623
+ } else if (envoy_api_v2_route_RouteAction_has_weighted_clusters(
624
+ action)) {
625
+ const envoy_api_v2_route_WeightedCluster* weighted_clusters =
626
+ envoy_api_v2_route_RouteAction_weighted_clusters(action);
627
+ fields.emplace_back(" weighted_clusters {");
628
+ size_t num_cluster_weights;
629
+ const envoy_api_v2_route_WeightedCluster_ClusterWeight* const*
630
+ cluster_weights = envoy_api_v2_route_WeightedCluster_clusters(
631
+ weighted_clusters, &num_cluster_weights);
632
+ for (size_t i = 0; i < num_cluster_weights; ++i) {
633
+ const envoy_api_v2_route_WeightedCluster_ClusterWeight*
634
+ cluster_weight = cluster_weights[i];
635
+ fields.emplace_back(" clusters {");
636
+ AddStringField(
637
+ " name",
638
+ envoy_api_v2_route_WeightedCluster_ClusterWeight_name(
639
+ cluster_weight),
640
+ &fields);
641
+ AddUInt32ValueField(
642
+ " weight",
643
+ envoy_api_v2_route_WeightedCluster_ClusterWeight_weight(
644
+ cluster_weight),
645
+ &fields);
646
+ fields.emplace_back(" }");
647
+ }
648
+ AddUInt32ValueField(" total_weight",
649
+ envoy_api_v2_route_WeightedCluster_total_weight(
650
+ weighted_clusters),
651
+ &fields);
652
+ fields.emplace_back(" }");
653
+ }
654
+ fields.emplace_back(" }");
655
+ } else if (envoy_api_v2_route_Route_has_redirect(route)) {
656
+ fields.emplace_back(" redirect: <not printed>");
657
+ } else if (envoy_api_v2_route_Route_has_direct_response(route)) {
658
+ fields.emplace_back(" direct_response: <not printed>");
659
+ } else if (envoy_api_v2_route_Route_has_filter_action(route)) {
660
+ fields.emplace_back(" filter_action: <not printed>");
661
+ }
662
+ fields.push_back(" }");
663
+ }
664
+ fields.push_back("}");
665
+ }
666
+ gpr_log(GPR_DEBUG, "[xds_client %p] RouteConfiguration: %s", client,
667
+ absl::StrJoin(fields, "\n").c_str());
668
+ }
669
+ }
670
+
671
+ void MaybeLogCluster(XdsClient* client, TraceFlag* tracer,
672
+ const envoy_api_v2_Cluster* cluster) {
673
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
674
+ gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
675
+ // TODO(roth): When we can upgrade upb, use upb textformat code to dump
676
+ // the raw proto instead of doing this manually.
677
+ std::vector<std::string> fields;
678
+ // name
679
+ AddStringField("name", envoy_api_v2_Cluster_name(cluster), &fields);
680
+ // type
681
+ if (envoy_api_v2_Cluster_has_type(cluster)) {
682
+ fields.emplace_back(
683
+ absl::StrCat("type: ", envoy_api_v2_Cluster_type(cluster)));
684
+ } else if (envoy_api_v2_Cluster_has_cluster_type(cluster)) {
685
+ fields.emplace_back("cluster_type: <not printed>");
686
+ } else {
687
+ fields.emplace_back("<unknown type>");
688
+ }
689
+ // eds_cluster_config
690
+ const envoy_api_v2_Cluster_EdsClusterConfig* eds_cluster_config =
691
+ envoy_api_v2_Cluster_eds_cluster_config(cluster);
692
+ if (eds_cluster_config != nullptr) {
693
+ fields.emplace_back("eds_cluster_config {");
694
+ // eds_config
695
+ const struct envoy_api_v2_core_ConfigSource* eds_config =
696
+ envoy_api_v2_Cluster_EdsClusterConfig_eds_config(eds_cluster_config);
697
+ if (eds_config != nullptr) {
698
+ if (envoy_api_v2_core_ConfigSource_has_ads(eds_config)) {
699
+ fields.emplace_back(" eds_config { ads {} }");
700
+ } else {
701
+ fields.emplace_back(" eds_config: <non-ADS type>");
702
+ }
703
+ }
704
+ // service_name
705
+ AddStringField(" service_name",
706
+ envoy_api_v2_Cluster_EdsClusterConfig_service_name(
707
+ eds_cluster_config),
708
+ &fields);
709
+ fields.emplace_back("}");
710
+ }
711
+ // lb_policy
712
+ fields.emplace_back(
713
+ absl::StrCat("lb_policy: ", envoy_api_v2_Cluster_lb_policy(cluster)));
714
+ // lrs_server
715
+ const envoy_api_v2_core_ConfigSource* lrs_server =
716
+ envoy_api_v2_Cluster_lrs_server(cluster);
717
+ if (lrs_server != nullptr) {
718
+ if (envoy_api_v2_core_ConfigSource_has_self(lrs_server)) {
719
+ fields.emplace_back("lrs_server { self {} }");
720
+ } else {
721
+ fields.emplace_back("lrs_server: <non-self type>");
722
+ }
723
+ }
724
+ gpr_log(GPR_DEBUG, "[xds_client %p] Cluster: %s", client,
725
+ absl::StrJoin(fields, "\n").c_str());
726
+ }
727
+ }
728
+
729
+ void MaybeLogClusterLoadAssignment(
730
+ XdsClient* client, TraceFlag* tracer,
731
+ const envoy_api_v2_ClusterLoadAssignment* cla) {
732
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
733
+ gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
734
+ // TODO(roth): When we can upgrade upb, use upb textformat code to dump
735
+ // the raw proto instead of doing this manually.
736
+ std::vector<std::string> fields;
737
+ // cluster_name
738
+ AddStringField("cluster_name",
739
+ envoy_api_v2_ClusterLoadAssignment_cluster_name(cla),
740
+ &fields);
741
+ // endpoints
742
+ size_t num_localities;
743
+ const struct envoy_api_v2_endpoint_LocalityLbEndpoints* const*
744
+ locality_endpoints =
745
+ envoy_api_v2_ClusterLoadAssignment_endpoints(cla, &num_localities);
746
+ for (size_t i = 0; i < num_localities; ++i) {
747
+ const auto* locality_endpoint = locality_endpoints[i];
748
+ fields.emplace_back("endpoints {");
749
+ // locality
750
+ const auto* locality =
751
+ envoy_api_v2_endpoint_LocalityLbEndpoints_locality(locality_endpoint);
752
+ if (locality != nullptr) {
753
+ fields.emplace_back(" locality {");
754
+ AddLocalityField(2, locality, &fields);
755
+ fields.emplace_back(" }");
756
+ }
757
+ // lb_endpoints
758
+ size_t num_lb_endpoints;
759
+ const envoy_api_v2_endpoint_LbEndpoint* const* lb_endpoints =
760
+ envoy_api_v2_endpoint_LocalityLbEndpoints_lb_endpoints(
761
+ locality_endpoint, &num_lb_endpoints);
762
+ for (size_t j = 0; j < num_lb_endpoints; ++j) {
763
+ const auto* lb_endpoint = lb_endpoints[j];
764
+ fields.emplace_back(" lb_endpoints {");
765
+ // health_status
766
+ uint32_t health_status =
767
+ envoy_api_v2_endpoint_LbEndpoint_health_status(lb_endpoint);
768
+ if (health_status > 0) {
769
+ fields.emplace_back(
770
+ absl::StrCat(" health_status: ", health_status));
771
+ }
772
+ // endpoint
773
+ const envoy_api_v2_endpoint_Endpoint* endpoint =
774
+ envoy_api_v2_endpoint_LbEndpoint_endpoint(lb_endpoint);
775
+ if (endpoint != nullptr) {
776
+ fields.emplace_back(" endpoint {");
777
+ // address
778
+ const auto* address =
779
+ envoy_api_v2_endpoint_Endpoint_address(endpoint);
780
+ if (address != nullptr) {
781
+ fields.emplace_back(" address {");
782
+ // socket_address
783
+ const auto* socket_address =
784
+ envoy_api_v2_core_Address_socket_address(address);
785
+ if (socket_address != nullptr) {
786
+ fields.emplace_back(" socket_address {");
787
+ // address
788
+ AddStringField(
789
+ " address",
790
+ envoy_api_v2_core_SocketAddress_address(socket_address),
791
+ &fields);
792
+ // port_value
793
+ if (envoy_api_v2_core_SocketAddress_has_port_value(
794
+ socket_address)) {
795
+ fields.emplace_back(
796
+ absl::StrCat(" port_value: ",
797
+ envoy_api_v2_core_SocketAddress_port_value(
798
+ socket_address)));
799
+ } else {
800
+ fields.emplace_back(" <non-numeric port>");
801
+ }
802
+ fields.emplace_back(" }");
803
+ } else {
804
+ fields.emplace_back(" <non-socket address>");
805
+ }
806
+ fields.emplace_back(" }");
807
+ }
808
+ fields.emplace_back(" }");
809
+ }
810
+ fields.emplace_back(" }");
811
+ }
812
+ // load_balancing_weight
813
+ AddUInt32ValueField(
814
+ " load_balancing_weight",
815
+ envoy_api_v2_endpoint_LocalityLbEndpoints_load_balancing_weight(
816
+ locality_endpoint),
817
+ &fields);
818
+ // priority
819
+ uint32_t priority =
820
+ envoy_api_v2_endpoint_LocalityLbEndpoints_priority(locality_endpoint);
821
+ if (priority > 0) {
822
+ fields.emplace_back(absl::StrCat(" priority: ", priority));
823
+ }
824
+ fields.emplace_back("}");
825
+ }
826
+ // policy
827
+ const envoy_api_v2_ClusterLoadAssignment_Policy* policy =
828
+ envoy_api_v2_ClusterLoadAssignment_policy(cla);
829
+ if (policy != nullptr) {
830
+ fields.emplace_back("policy {");
831
+ // drop_overloads
832
+ size_t num_drop_overloads;
833
+ const envoy_api_v2_ClusterLoadAssignment_Policy_DropOverload* const*
834
+ drop_overloads =
835
+ envoy_api_v2_ClusterLoadAssignment_Policy_drop_overloads(
836
+ policy, &num_drop_overloads);
837
+ for (size_t i = 0; i < num_drop_overloads; ++i) {
838
+ auto* drop_overload = drop_overloads[i];
839
+ fields.emplace_back(" drop_overloads {");
840
+ // category
841
+ AddStringField(
842
+ " category",
843
+ envoy_api_v2_ClusterLoadAssignment_Policy_DropOverload_category(
844
+ drop_overload),
845
+ &fields);
846
+ // drop_percentage
847
+ const auto* drop_percentage =
848
+ envoy_api_v2_ClusterLoadAssignment_Policy_DropOverload_drop_percentage(
849
+ drop_overload);
850
+ if (drop_percentage != nullptr) {
851
+ fields.emplace_back(" drop_percentage {");
852
+ fields.emplace_back(absl::StrCat(
853
+ " numerator: ",
854
+ envoy_type_FractionalPercent_numerator(drop_percentage)));
855
+ fields.emplace_back(absl::StrCat(
856
+ " denominator: ",
857
+ envoy_type_FractionalPercent_denominator(drop_percentage)));
858
+ fields.emplace_back(" }");
859
+ }
860
+ fields.emplace_back(" }");
861
+ }
862
+ // overprovisioning_factor
863
+ fields.emplace_back("}");
864
+ }
865
+ gpr_log(GPR_DEBUG, "[xds_client %p] ClusterLoadAssignment: %s", client,
866
+ absl::StrJoin(fields, "\n").c_str());
867
+ }
868
+ }
869
+
870
+ // Better match type has smaller value.
871
+ enum MatchType {
872
+ EXACT_MATCH,
873
+ SUFFIX_MATCH,
874
+ PREFIX_MATCH,
875
+ UNIVERSE_MATCH,
876
+ INVALID_MATCH,
877
+ };
878
+
879
+ // Returns true if match succeeds.
880
+ bool DomainMatch(MatchType match_type, std::string domain_pattern,
881
+ std::string expected_host_name) {
882
+ // Normalize the args to lower-case. Domain matching is case-insensitive.
883
+ std::transform(domain_pattern.begin(), domain_pattern.end(),
884
+ domain_pattern.begin(),
885
+ [](unsigned char c) { return std::tolower(c); });
886
+ std::transform(expected_host_name.begin(), expected_host_name.end(),
887
+ expected_host_name.begin(),
888
+ [](unsigned char c) { return std::tolower(c); });
889
+ if (match_type == EXACT_MATCH) {
890
+ return domain_pattern == expected_host_name;
891
+ } else if (match_type == SUFFIX_MATCH) {
892
+ // Asterisk must match at least one char.
893
+ if (expected_host_name.size() < domain_pattern.size()) return false;
894
+ absl::string_view pattern_suffix(domain_pattern.c_str() + 1);
895
+ absl::string_view host_suffix(expected_host_name.c_str() +
896
+ expected_host_name.size() -
897
+ pattern_suffix.size());
898
+ return pattern_suffix == host_suffix;
899
+ } else if (match_type == PREFIX_MATCH) {
900
+ // Asterisk must match at least one char.
901
+ if (expected_host_name.size() < domain_pattern.size()) return false;
902
+ absl::string_view pattern_prefix(domain_pattern.c_str(),
903
+ domain_pattern.size() - 1);
904
+ absl::string_view host_prefix(expected_host_name.c_str(),
905
+ pattern_prefix.size());
906
+ return pattern_prefix == host_prefix;
907
+ } else {
908
+ return match_type == UNIVERSE_MATCH;
909
+ }
910
+ }
911
+
912
+ MatchType DomainPatternMatchType(const std::string& domain_pattern) {
913
+ if (domain_pattern.empty()) return INVALID_MATCH;
914
+ if (domain_pattern.find('*') == std::string::npos) return EXACT_MATCH;
915
+ if (domain_pattern == "*") return UNIVERSE_MATCH;
916
+ if (domain_pattern[0] == '*') return SUFFIX_MATCH;
917
+ if (domain_pattern[domain_pattern.size() - 1] == '*') return PREFIX_MATCH;
918
+ return INVALID_MATCH;
919
+ }
920
+
921
+ grpc_error* RouteActionParse(const envoy_api_v2_route_Route* route,
922
+ XdsApi::RdsUpdate::RdsRoute* rds_route) {
923
+ if (!envoy_api_v2_route_Route_has_route(route)) {
924
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
925
+ "No RouteAction found in route.");
926
+ }
927
+ const envoy_api_v2_route_RouteAction* route_action =
928
+ envoy_api_v2_route_Route_route(route);
929
+ // Get the cluster or weighted_clusters in the RouteAction.
930
+ if (envoy_api_v2_route_RouteAction_has_cluster(route_action)) {
931
+ const upb_strview cluster_name =
932
+ envoy_api_v2_route_RouteAction_cluster(route_action);
933
+ if (cluster_name.size == 0) {
934
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
935
+ "RouteAction cluster contains empty cluster name.");
936
+ }
937
+ rds_route->cluster_name = UpbStringToStdString(cluster_name);
938
+ } else if (envoy_api_v2_route_RouteAction_has_weighted_clusters(
939
+ route_action)) {
940
+ const envoy_api_v2_route_WeightedCluster* weighted_cluster =
941
+ envoy_api_v2_route_RouteAction_weighted_clusters(route_action);
942
+ uint32_t total_weight = 100;
943
+ const google_protobuf_UInt32Value* weight =
944
+ envoy_api_v2_route_WeightedCluster_total_weight(weighted_cluster);
945
+ if (weight != nullptr) {
946
+ total_weight = google_protobuf_UInt32Value_value(weight);
947
+ }
948
+ size_t clusters_size;
949
+ const envoy_api_v2_route_WeightedCluster_ClusterWeight* const* clusters =
950
+ envoy_api_v2_route_WeightedCluster_clusters(weighted_cluster,
951
+ &clusters_size);
952
+ uint32_t sum_of_weights = 0;
953
+ for (size_t j = 0; j < clusters_size; ++j) {
954
+ const envoy_api_v2_route_WeightedCluster_ClusterWeight* cluster_weight =
955
+ clusters[j];
956
+ XdsApi::RdsUpdate::RdsRoute::ClusterWeight cluster;
957
+ cluster.name = UpbStringToStdString(
958
+ envoy_api_v2_route_WeightedCluster_ClusterWeight_name(
959
+ cluster_weight));
960
+ if (cluster.name.empty()) {
961
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
962
+ "RouteAction weighted_cluster cluster contains empty cluster "
963
+ "name.");
964
+ }
965
+ const google_protobuf_UInt32Value* weight =
966
+ envoy_api_v2_route_WeightedCluster_ClusterWeight_weight(
967
+ cluster_weight);
968
+ if (weight == nullptr) {
969
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
970
+ "RouteAction weighted_cluster cluster missing weight");
971
+ }
972
+ cluster.weight = google_protobuf_UInt32Value_value(weight);
973
+ sum_of_weights += cluster.weight;
974
+ rds_route->weighted_clusters.emplace_back(std::move(cluster));
975
+ }
976
+ if (total_weight != sum_of_weights) {
977
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
978
+ "RouteAction weighted_cluster has incorrect total weight");
979
+ }
980
+ if (rds_route->weighted_clusters.empty()) {
981
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
982
+ "RouteAction weighted_cluster has no valid clusters specified.");
983
+ }
984
+ } else {
985
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
986
+ "No cluster or weighted_clusters found in RouteAction.");
987
+ }
988
+ return GRPC_ERROR_NONE;
989
+ }
990
+
991
+ grpc_error* RouteConfigParse(
992
+ XdsClient* client, TraceFlag* tracer,
993
+ const envoy_api_v2_RouteConfiguration* route_config,
994
+ const std::string& expected_server_name, const bool xds_routing_enabled,
995
+ XdsApi::RdsUpdate* rds_update) {
996
+ MaybeLogRouteConfiguration(client, tracer, route_config);
997
+ // Get the virtual hosts.
998
+ size_t size;
999
+ const envoy_api_v2_route_VirtualHost* const* virtual_hosts =
1000
+ envoy_api_v2_RouteConfiguration_virtual_hosts(route_config, &size);
1001
+ // Find the best matched virtual host.
1002
+ // The search order for 4 groups of domain patterns:
1003
+ // 1. Exact match.
1004
+ // 2. Suffix match (e.g., "*ABC").
1005
+ // 3. Prefix match (e.g., "ABC*").
1006
+ // 4. Universe match (i.e., "*").
1007
+ // Within each group, longest match wins.
1008
+ // If the same best matched domain pattern appears in multiple virtual hosts,
1009
+ // the first matched virtual host wins.
1010
+ const envoy_api_v2_route_VirtualHost* target_virtual_host = nullptr;
1011
+ MatchType best_match_type = INVALID_MATCH;
1012
+ size_t longest_match = 0;
1013
+ // Check each domain pattern in each virtual host to determine the best
1014
+ // matched virtual host.
1015
+ for (size_t i = 0; i < size; ++i) {
1016
+ size_t domain_size;
1017
+ upb_strview const* domains =
1018
+ envoy_api_v2_route_VirtualHost_domains(virtual_hosts[i], &domain_size);
1019
+ for (size_t j = 0; j < domain_size; ++j) {
1020
+ const std::string domain_pattern(domains[j].data, domains[j].size);
1021
+ // Check the match type first. Skip the pattern if it's not better than
1022
+ // current match.
1023
+ const MatchType match_type = DomainPatternMatchType(domain_pattern);
1024
+ if (match_type == INVALID_MATCH) {
1025
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Invalid domain pattern.");
1026
+ }
1027
+ if (match_type > best_match_type) continue;
1028
+ if (match_type == best_match_type &&
1029
+ domain_pattern.size() <= longest_match) {
1030
+ continue;
1031
+ }
1032
+ // Skip if match fails.
1033
+ if (!DomainMatch(match_type, domain_pattern, expected_server_name)) {
1034
+ continue;
1035
+ }
1036
+ // Choose this match.
1037
+ target_virtual_host = virtual_hosts[i];
1038
+ best_match_type = match_type;
1039
+ longest_match = domain_pattern.size();
1040
+ if (best_match_type == EXACT_MATCH) break;
1041
+ }
1042
+ if (best_match_type == EXACT_MATCH) break;
1043
+ }
1044
+ if (target_virtual_host == nullptr) {
1045
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1046
+ "No matched virtual host found in the route config.");
1047
+ }
1048
+ // Get the route list from the matched virtual host.
1049
+ const envoy_api_v2_route_Route* const* routes =
1050
+ envoy_api_v2_route_VirtualHost_routes(target_virtual_host, &size);
1051
+ if (size < 1) {
1052
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1053
+ "No route found in the virtual host.");
1054
+ }
1055
+ // If xds_routing is not configured, only look at the last one in the route
1056
+ // list (the default route)
1057
+ if (!xds_routing_enabled) {
1058
+ const envoy_api_v2_route_Route* route = routes[size - 1];
1059
+ const envoy_api_v2_route_RouteMatch* match =
1060
+ envoy_api_v2_route_Route_match(route);
1061
+ XdsApi::RdsUpdate::RdsRoute rds_route;
1062
+ // if xds routing is not enabled, we must be working on the default route;
1063
+ // in this case, we must have an empty or single slash prefix.
1064
+ if (!envoy_api_v2_route_RouteMatch_has_prefix(match)) {
1065
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1066
+ "No prefix field found in Default RouteMatch.");
1067
+ }
1068
+ const upb_strview prefix = envoy_api_v2_route_RouteMatch_prefix(match);
1069
+ if (!upb_strview_eql(prefix, upb_strview_makez("")) &&
1070
+ !upb_strview_eql(prefix, upb_strview_makez("/"))) {
1071
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1072
+ "Default route must have empty prefix.");
1073
+ }
1074
+ grpc_error* error = RouteActionParse(route, &rds_route);
1075
+ if (error != GRPC_ERROR_NONE) return error;
1076
+ rds_update->routes.emplace_back(std::move(rds_route));
1077
+ return GRPC_ERROR_NONE;
1078
+ }
1079
+ // Loop over the whole list of routes
1080
+ for (size_t i = 0; i < size; ++i) {
1081
+ const envoy_api_v2_route_Route* route = routes[i];
1082
+ const envoy_api_v2_route_RouteMatch* match =
1083
+ envoy_api_v2_route_Route_match(route);
1084
+ XdsApi::RdsUpdate::RdsRoute rds_route;
1085
+ if (envoy_api_v2_route_RouteMatch_has_prefix(match)) {
1086
+ upb_strview prefix = envoy_api_v2_route_RouteMatch_prefix(match);
1087
+ // Empty prefix "" is accepted.
1088
+ if (prefix.size > 0) {
1089
+ // Prefix "/" is accepted.
1090
+ if (prefix.data[0] != '/') {
1091
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1092
+ "Prefix does not start with a /");
1093
+ }
1094
+ if (prefix.size > 1) {
1095
+ std::vector<absl::string_view> prefix_elements = absl::StrSplit(
1096
+ absl::string_view(prefix.data, prefix.size).substr(1),
1097
+ absl::MaxSplits('/', 1));
1098
+ if (prefix_elements.size() != 2) {
1099
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1100
+ "Prefix not in the required format of /service/");
1101
+ } else if (!prefix_elements[1].empty()) {
1102
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1103
+ "Prefix does not end with a /");
1104
+ } else if (prefix_elements[0].empty()) {
1105
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1106
+ "Prefix contains empty service name");
1107
+ }
1108
+ rds_route.service = std::string(prefix_elements[0]);
1109
+ }
1110
+ }
1111
+ } else if (envoy_api_v2_route_RouteMatch_has_path(match)) {
1112
+ upb_strview path = envoy_api_v2_route_RouteMatch_path(match);
1113
+ if (path.size == 0) {
1114
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1115
+ "Path if set cannot be empty");
1116
+ }
1117
+ if (path.data[0] != '/') {
1118
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1119
+ "Path does not start with a /");
1120
+ }
1121
+ std::vector<absl::string_view> path_elements = absl::StrSplit(
1122
+ absl::string_view(path.data, path.size).substr(1), '/');
1123
+ if (path_elements.size() != 2) {
1124
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1125
+ "Path not in the required format of /service/method");
1126
+ } else if (path_elements[0].empty()) {
1127
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1128
+ "Path contains empty service name");
1129
+ } else if (path_elements[1].empty()) {
1130
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1131
+ "Path contains empty method name");
1132
+ }
1133
+ rds_route.service = std::string(path_elements[0]);
1134
+ rds_route.method = std::string(path_elements[1]);
1135
+ } else {
1136
+ // Path specifier types will be supported, ignore but not reject until
1137
+ // they are implemented.
1138
+ continue;
1139
+ }
1140
+ grpc_error* error = RouteActionParse(route, &rds_route);
1141
+ if (error != GRPC_ERROR_NONE) return error;
1142
+ rds_update->routes.emplace_back(std::move(rds_route));
1143
+ }
1144
+ if (rds_update->routes.empty()) {
1145
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("No valid routes specified.");
1146
+ }
1147
+ return GRPC_ERROR_NONE;
1148
+ }
1149
+
1150
+ grpc_error* LdsResponseParse(XdsClient* client, TraceFlag* tracer,
1151
+ const envoy_api_v2_DiscoveryResponse* response,
1152
+ const std::string& expected_server_name,
1153
+ const bool xds_routing_enabled,
1154
+ absl::optional<XdsApi::LdsUpdate>* lds_update,
1155
+ upb_arena* arena) {
1156
+ // Get the resources from the response.
1157
+ size_t size;
1158
+ const google_protobuf_Any* const* resources =
1159
+ envoy_api_v2_DiscoveryResponse_resources(response, &size);
1160
+ for (size_t i = 0; i < size; ++i) {
1161
+ // Check the type_url of the resource.
1162
+ const upb_strview type_url = google_protobuf_Any_type_url(resources[i]);
1163
+ if (!upb_strview_eql(type_url, upb_strview_makez(XdsApi::kLdsTypeUrl))) {
1164
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not LDS.");
1165
+ }
1166
+ // Decode the listener.
1167
+ const upb_strview encoded_listener =
1168
+ google_protobuf_Any_value(resources[i]);
1169
+ const envoy_api_v2_Listener* listener = envoy_api_v2_Listener_parse(
1170
+ encoded_listener.data, encoded_listener.size, arena);
1171
+ if (listener == nullptr) {
1172
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode listener.");
1173
+ }
1174
+ // Check listener name. Ignore unexpected listeners.
1175
+ const upb_strview name = envoy_api_v2_Listener_name(listener);
1176
+ const upb_strview expected_name =
1177
+ upb_strview_makez(expected_server_name.c_str());
1178
+ if (!upb_strview_eql(name, expected_name)) continue;
1179
+ // Get api_listener and decode it to http_connection_manager.
1180
+ const envoy_config_listener_v2_ApiListener* api_listener =
1181
+ envoy_api_v2_Listener_api_listener(listener);
1182
+ if (api_listener == nullptr) {
1183
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1184
+ "Listener has no ApiListener.");
1185
+ }
1186
+ const upb_strview encoded_api_listener = google_protobuf_Any_value(
1187
+ envoy_config_listener_v2_ApiListener_api_listener(api_listener));
1188
+ const envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager*
1189
+ http_connection_manager =
1190
+ envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_parse(
1191
+ encoded_api_listener.data, encoded_api_listener.size, arena);
1192
+ // Found inlined route_config. Parse it to find the cluster_name.
1193
+ if (envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_has_route_config(
1194
+ http_connection_manager)) {
1195
+ const envoy_api_v2_RouteConfiguration* route_config =
1196
+ envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_route_config(
1197
+ http_connection_manager);
1198
+ XdsApi::RdsUpdate rds_update;
1199
+ grpc_error* error =
1200
+ RouteConfigParse(client, tracer, route_config, expected_server_name,
1201
+ xds_routing_enabled, &rds_update);
1202
+ if (error != GRPC_ERROR_NONE) return error;
1203
+ lds_update->emplace();
1204
+ (*lds_update)->rds_update.emplace(std::move(rds_update));
1205
+ return GRPC_ERROR_NONE;
1206
+ }
1207
+ // Validate that RDS must be used to get the route_config dynamically.
1208
+ if (!envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_has_rds(
1209
+ http_connection_manager)) {
1210
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1211
+ "HttpConnectionManager neither has inlined route_config nor RDS.");
1212
+ }
1213
+ const envoy_config_filter_network_http_connection_manager_v2_Rds* rds =
1214
+ envoy_config_filter_network_http_connection_manager_v2_HttpConnectionManager_rds(
1215
+ http_connection_manager);
1216
+ // Check that the ConfigSource specifies ADS.
1217
+ const envoy_api_v2_core_ConfigSource* config_source =
1218
+ envoy_config_filter_network_http_connection_manager_v2_Rds_config_source(
1219
+ rds);
1220
+ if (config_source == nullptr) {
1221
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1222
+ "HttpConnectionManager missing config_source for RDS.");
1223
+ }
1224
+ if (!envoy_api_v2_core_ConfigSource_has_ads(config_source)) {
1225
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1226
+ "HttpConnectionManager ConfigSource for RDS does not specify ADS.");
1227
+ }
1228
+ // Get the route_config_name.
1229
+ lds_update->emplace();
1230
+ (*lds_update)->route_config_name = UpbStringToStdString(
1231
+ envoy_config_filter_network_http_connection_manager_v2_Rds_route_config_name(
1232
+ rds));
1233
+ return GRPC_ERROR_NONE;
1234
+ }
1235
+ return GRPC_ERROR_NONE;
1236
+ }
1237
+
1238
+ grpc_error* RdsResponseParse(
1239
+ XdsClient* client, TraceFlag* tracer,
1240
+ const envoy_api_v2_DiscoveryResponse* response,
1241
+ const std::string& expected_server_name,
1242
+ const std::set<absl::string_view>& expected_route_configuration_names,
1243
+ const bool xds_routing_enabled,
1244
+ absl::optional<XdsApi::RdsUpdate>* rds_update, upb_arena* arena) {
1245
+ // Get the resources from the response.
1246
+ size_t size;
1247
+ const google_protobuf_Any* const* resources =
1248
+ envoy_api_v2_DiscoveryResponse_resources(response, &size);
1249
+ for (size_t i = 0; i < size; ++i) {
1250
+ // Check the type_url of the resource.
1251
+ const upb_strview type_url = google_protobuf_Any_type_url(resources[i]);
1252
+ if (!upb_strview_eql(type_url, upb_strview_makez(XdsApi::kRdsTypeUrl))) {
1253
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not RDS.");
1254
+ }
1255
+ // Decode the route_config.
1256
+ const upb_strview encoded_route_config =
1257
+ google_protobuf_Any_value(resources[i]);
1258
+ const envoy_api_v2_RouteConfiguration* route_config =
1259
+ envoy_api_v2_RouteConfiguration_parse(encoded_route_config.data,
1260
+ encoded_route_config.size, arena);
1261
+ if (route_config == nullptr) {
1262
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode route_config.");
1263
+ }
1264
+ // Check route_config_name. Ignore unexpected route_config.
1265
+ const upb_strview route_config_name =
1266
+ envoy_api_v2_RouteConfiguration_name(route_config);
1267
+ absl::string_view route_config_name_strview(route_config_name.data,
1268
+ route_config_name.size);
1269
+ if (expected_route_configuration_names.find(route_config_name_strview) ==
1270
+ expected_route_configuration_names.end()) {
1271
+ continue;
1272
+ }
1273
+ // Parse the route_config.
1274
+ XdsApi::RdsUpdate local_rds_update;
1275
+ grpc_error* error =
1276
+ RouteConfigParse(client, tracer, route_config, expected_server_name,
1277
+ xds_routing_enabled, &local_rds_update);
1278
+ if (error != GRPC_ERROR_NONE) return error;
1279
+ rds_update->emplace(std::move(local_rds_update));
1280
+ return GRPC_ERROR_NONE;
1281
+ }
1282
+ return GRPC_ERROR_NONE;
1283
+ }
1284
+
1285
+ grpc_error* CdsResponseParse(
1286
+ XdsClient* client, TraceFlag* tracer,
1287
+ const envoy_api_v2_DiscoveryResponse* response,
1288
+ const std::set<absl::string_view>& expected_cluster_names,
1289
+ XdsApi::CdsUpdateMap* cds_update_map, upb_arena* arena) {
1290
+ // Get the resources from the response.
1291
+ size_t size;
1292
+ const google_protobuf_Any* const* resources =
1293
+ envoy_api_v2_DiscoveryResponse_resources(response, &size);
1294
+ // Parse all the resources in the CDS response.
1295
+ for (size_t i = 0; i < size; ++i) {
1296
+ XdsApi::CdsUpdate cds_update;
1297
+ // Check the type_url of the resource.
1298
+ const upb_strview type_url = google_protobuf_Any_type_url(resources[i]);
1299
+ if (!upb_strview_eql(type_url, upb_strview_makez(XdsApi::kCdsTypeUrl))) {
1300
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not CDS.");
1301
+ }
1302
+ // Decode the cluster.
1303
+ const upb_strview encoded_cluster = google_protobuf_Any_value(resources[i]);
1304
+ const envoy_api_v2_Cluster* cluster = envoy_api_v2_Cluster_parse(
1305
+ encoded_cluster.data, encoded_cluster.size, arena);
1306
+ if (cluster == nullptr) {
1307
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode cluster.");
1308
+ }
1309
+ MaybeLogCluster(client, tracer, cluster);
1310
+ // Ignore unexpected cluster names.
1311
+ upb_strview cluster_name = envoy_api_v2_Cluster_name(cluster);
1312
+ absl::string_view cluster_name_strview(cluster_name.data,
1313
+ cluster_name.size);
1314
+ if (expected_cluster_names.find(cluster_name_strview) ==
1315
+ expected_cluster_names.end()) {
1316
+ continue;
1317
+ }
1318
+ // Check the cluster_discovery_type.
1319
+ if (!envoy_api_v2_Cluster_has_type(cluster)) {
1320
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("DiscoveryType not found.");
1321
+ }
1322
+ if (envoy_api_v2_Cluster_type(cluster) != envoy_api_v2_Cluster_EDS) {
1323
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("DiscoveryType is not EDS.");
1324
+ }
1325
+ // Check the EDS config source.
1326
+ const envoy_api_v2_Cluster_EdsClusterConfig* eds_cluster_config =
1327
+ envoy_api_v2_Cluster_eds_cluster_config(cluster);
1328
+ const envoy_api_v2_core_ConfigSource* eds_config =
1329
+ envoy_api_v2_Cluster_EdsClusterConfig_eds_config(eds_cluster_config);
1330
+ if (!envoy_api_v2_core_ConfigSource_has_ads(eds_config)) {
1331
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1332
+ "EDS ConfigSource is not ADS.");
1333
+ }
1334
+ // Record EDS service_name (if any).
1335
+ upb_strview service_name =
1336
+ envoy_api_v2_Cluster_EdsClusterConfig_service_name(eds_cluster_config);
1337
+ if (service_name.size != 0) {
1338
+ cds_update.eds_service_name = UpbStringToStdString(service_name);
1339
+ }
1340
+ // Check the LB policy.
1341
+ if (envoy_api_v2_Cluster_lb_policy(cluster) !=
1342
+ envoy_api_v2_Cluster_ROUND_ROBIN) {
1343
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1344
+ "LB policy is not ROUND_ROBIN.");
1345
+ }
1346
+ // Record LRS server name (if any).
1347
+ const envoy_api_v2_core_ConfigSource* lrs_server =
1348
+ envoy_api_v2_Cluster_lrs_server(cluster);
1349
+ if (lrs_server != nullptr) {
1350
+ if (!envoy_api_v2_core_ConfigSource_has_self(lrs_server)) {
1351
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1352
+ "LRS ConfigSource is not self.");
1353
+ }
1354
+ cds_update.lrs_load_reporting_server_name.emplace("");
1355
+ }
1356
+ cds_update_map->emplace(UpbStringToStdString(cluster_name),
1357
+ std::move(cds_update));
1358
+ }
1359
+ return GRPC_ERROR_NONE;
1360
+ }
1361
+
225
1362
  grpc_error* ServerAddressParseAndAppend(
226
1363
  const envoy_api_v2_endpoint_LbEndpoint* lb_endpoint,
227
1364
  ServerAddressList* list) {
@@ -257,20 +1394,9 @@ grpc_error* ServerAddressParseAndAppend(
257
1394
  return GRPC_ERROR_NONE;
258
1395
  }
259
1396
 
260
- namespace {
261
-
262
- grpc_core::UniquePtr<char> StringCopy(const upb_strview& strview) {
263
- char* str = static_cast<char*>(gpr_malloc(strview.size + 1));
264
- memcpy(str, strview.data, strview.size);
265
- str[strview.size] = '\0';
266
- return grpc_core::UniquePtr<char>(str);
267
- }
268
-
269
- } // namespace
270
-
271
1397
  grpc_error* LocalityParse(
272
1398
  const envoy_api_v2_endpoint_LocalityLbEndpoints* locality_lb_endpoints,
273
- XdsPriorityListUpdate::LocalityMap::Locality* output_locality) {
1399
+ XdsApi::PriorityListUpdate::LocalityMap::Locality* output_locality) {
274
1400
  // Parse LB weight.
275
1401
  const google_protobuf_UInt32Value* lb_weight =
276
1402
  envoy_api_v2_endpoint_LocalityLbEndpoints_load_balancing_weight(
@@ -284,10 +1410,12 @@ grpc_error* LocalityParse(
284
1410
  // Parse locality name.
285
1411
  const envoy_api_v2_core_Locality* locality =
286
1412
  envoy_api_v2_endpoint_LocalityLbEndpoints_locality(locality_lb_endpoints);
1413
+ upb_strview region = envoy_api_v2_core_Locality_region(locality);
1414
+ upb_strview zone = envoy_api_v2_core_Locality_region(locality);
1415
+ upb_strview sub_zone = envoy_api_v2_core_Locality_sub_zone(locality);
287
1416
  output_locality->name = MakeRefCounted<XdsLocalityName>(
288
- StringCopy(envoy_api_v2_core_Locality_region(locality)),
289
- StringCopy(envoy_api_v2_core_Locality_zone(locality)),
290
- StringCopy(envoy_api_v2_core_Locality_sub_zone(locality)));
1417
+ UpbStringToStdString(region), UpbStringToStdString(zone),
1418
+ UpbStringToStdString(sub_zone));
291
1419
  // Parse the addresses.
292
1420
  size_t size;
293
1421
  const envoy_api_v2_endpoint_LbEndpoint* const* lb_endpoints =
@@ -306,7 +1434,7 @@ grpc_error* LocalityParse(
306
1434
 
307
1435
  grpc_error* DropParseAndAppend(
308
1436
  const envoy_api_v2_ClusterLoadAssignment_Policy_DropOverload* drop_overload,
309
- XdsDropConfig* drop_config, bool* drop_all) {
1437
+ XdsApi::DropConfig* drop_config) {
310
1438
  // Get the category.
311
1439
  upb_strview category =
312
1440
  envoy_api_v2_ClusterLoadAssignment_Policy_DropOverload_category(
@@ -337,84 +1465,263 @@ grpc_error* DropParseAndAppend(
337
1465
  }
338
1466
  // Cap numerator to 1000000.
339
1467
  numerator = GPR_MIN(numerator, 1000000);
340
- if (numerator == 1000000) *drop_all = true;
341
- drop_config->AddCategory(StringCopy(category), numerator);
1468
+ drop_config->AddCategory(UpbStringToStdString(category), numerator);
1469
+ return GRPC_ERROR_NONE;
1470
+ }
1471
+
1472
+ grpc_error* EdsResponseParse(
1473
+ XdsClient* client, TraceFlag* tracer,
1474
+ const envoy_api_v2_DiscoveryResponse* response,
1475
+ const std::set<absl::string_view>& expected_eds_service_names,
1476
+ XdsApi::EdsUpdateMap* eds_update_map, upb_arena* arena) {
1477
+ // Get the resources from the response.
1478
+ size_t size;
1479
+ const google_protobuf_Any* const* resources =
1480
+ envoy_api_v2_DiscoveryResponse_resources(response, &size);
1481
+ for (size_t i = 0; i < size; ++i) {
1482
+ XdsApi::EdsUpdate eds_update;
1483
+ // Check the type_url of the resource.
1484
+ upb_strview type_url = google_protobuf_Any_type_url(resources[i]);
1485
+ if (!upb_strview_eql(type_url, upb_strview_makez(XdsApi::kEdsTypeUrl))) {
1486
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not EDS.");
1487
+ }
1488
+ // Get the cluster_load_assignment.
1489
+ upb_strview encoded_cluster_load_assignment =
1490
+ google_protobuf_Any_value(resources[i]);
1491
+ envoy_api_v2_ClusterLoadAssignment* cluster_load_assignment =
1492
+ envoy_api_v2_ClusterLoadAssignment_parse(
1493
+ encoded_cluster_load_assignment.data,
1494
+ encoded_cluster_load_assignment.size, arena);
1495
+ if (cluster_load_assignment == nullptr) {
1496
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1497
+ "Can't parse cluster_load_assignment.");
1498
+ }
1499
+ MaybeLogClusterLoadAssignment(client, tracer, cluster_load_assignment);
1500
+ // Check the cluster name (which actually means eds_service_name). Ignore
1501
+ // unexpected names.
1502
+ upb_strview cluster_name = envoy_api_v2_ClusterLoadAssignment_cluster_name(
1503
+ cluster_load_assignment);
1504
+ absl::string_view cluster_name_strview(cluster_name.data,
1505
+ cluster_name.size);
1506
+ if (expected_eds_service_names.find(cluster_name_strview) ==
1507
+ expected_eds_service_names.end()) {
1508
+ continue;
1509
+ }
1510
+ // Get the endpoints.
1511
+ size_t locality_size;
1512
+ const envoy_api_v2_endpoint_LocalityLbEndpoints* const* endpoints =
1513
+ envoy_api_v2_ClusterLoadAssignment_endpoints(cluster_load_assignment,
1514
+ &locality_size);
1515
+ for (size_t j = 0; j < locality_size; ++j) {
1516
+ XdsApi::PriorityListUpdate::LocalityMap::Locality locality;
1517
+ grpc_error* error = LocalityParse(endpoints[j], &locality);
1518
+ if (error != GRPC_ERROR_NONE) return error;
1519
+ // Filter out locality with weight 0.
1520
+ if (locality.lb_weight == 0) continue;
1521
+ eds_update.priority_list_update.Add(locality);
1522
+ }
1523
+ for (uint32_t priority = 0;
1524
+ priority < eds_update.priority_list_update.size(); ++priority) {
1525
+ auto* locality_map = eds_update.priority_list_update.Find(priority);
1526
+ if (locality_map == nullptr || locality_map->size() == 0) {
1527
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1528
+ "EDS update includes sparse priority list");
1529
+ }
1530
+ }
1531
+ // Get the drop config.
1532
+ eds_update.drop_config = MakeRefCounted<XdsApi::DropConfig>();
1533
+ const envoy_api_v2_ClusterLoadAssignment_Policy* policy =
1534
+ envoy_api_v2_ClusterLoadAssignment_policy(cluster_load_assignment);
1535
+ if (policy != nullptr) {
1536
+ size_t drop_size;
1537
+ const envoy_api_v2_ClusterLoadAssignment_Policy_DropOverload* const*
1538
+ drop_overload =
1539
+ envoy_api_v2_ClusterLoadAssignment_Policy_drop_overloads(
1540
+ policy, &drop_size);
1541
+ for (size_t j = 0; j < drop_size; ++j) {
1542
+ grpc_error* error =
1543
+ DropParseAndAppend(drop_overload[j], eds_update.drop_config.get());
1544
+ if (error != GRPC_ERROR_NONE) return error;
1545
+ }
1546
+ }
1547
+ eds_update_map->emplace(UpbStringToStdString(cluster_name),
1548
+ std::move(eds_update));
1549
+ }
342
1550
  return GRPC_ERROR_NONE;
343
1551
  }
344
1552
 
345
1553
  } // namespace
346
1554
 
347
- grpc_error* XdsEdsResponseDecodeAndParse(const grpc_slice& encoded_response,
348
- EdsUpdate* update) {
1555
+ grpc_error* XdsApi::ParseAdsResponse(
1556
+ const grpc_slice& encoded_response, const std::string& expected_server_name,
1557
+ const std::set<absl::string_view>& expected_route_configuration_names,
1558
+ const std::set<absl::string_view>& expected_cluster_names,
1559
+ const std::set<absl::string_view>& expected_eds_service_names,
1560
+ absl::optional<LdsUpdate>* lds_update,
1561
+ absl::optional<RdsUpdate>* rds_update, CdsUpdateMap* cds_update_map,
1562
+ EdsUpdateMap* eds_update_map, std::string* version, std::string* nonce,
1563
+ std::string* type_url) {
349
1564
  upb::Arena arena;
350
1565
  // Decode the response.
351
1566
  const envoy_api_v2_DiscoveryResponse* response =
352
1567
  envoy_api_v2_DiscoveryResponse_parse(
353
1568
  reinterpret_cast<const char*>(GRPC_SLICE_START_PTR(encoded_response)),
354
1569
  GRPC_SLICE_LENGTH(encoded_response), arena.ptr());
355
- // Parse the response.
1570
+ // If decoding fails, output an empty type_url and return.
356
1571
  if (response == nullptr) {
357
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("No response found.");
358
- }
359
- // Check the type_url of the response.
360
- upb_strview type_url = envoy_api_v2_DiscoveryResponse_type_url(response);
361
- upb_strview expected_type_url = upb_strview_makez(kEdsTypeUrl);
362
- if (!upb_strview_eql(type_url, expected_type_url)) {
363
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not EDS.");
1572
+ *type_url = "";
1573
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
1574
+ "Can't decode the whole response.");
364
1575
  }
365
- // Get the resources from the response.
366
- size_t size;
367
- const google_protobuf_Any* const* resources =
368
- envoy_api_v2_DiscoveryResponse_resources(response, &size);
369
- if (size < 1) {
1576
+ MaybeLogDiscoveryResponse(client_, tracer_, response);
1577
+ // Record the type_url, the version_info, and the nonce of the response.
1578
+ upb_strview type_url_strview =
1579
+ envoy_api_v2_DiscoveryResponse_type_url(response);
1580
+ *type_url = UpbStringToStdString(type_url_strview);
1581
+ upb_strview version_info =
1582
+ envoy_api_v2_DiscoveryResponse_version_info(response);
1583
+ *version = UpbStringToStdString(version_info);
1584
+ upb_strview nonce_strview = envoy_api_v2_DiscoveryResponse_nonce(response);
1585
+ *nonce = UpbStringToStdString(nonce_strview);
1586
+ // Parse the response according to the resource type.
1587
+ if (*type_url == kLdsTypeUrl) {
1588
+ return LdsResponseParse(client_, tracer_, response, expected_server_name,
1589
+ xds_routing_enabled_, lds_update, arena.ptr());
1590
+ } else if (*type_url == kRdsTypeUrl) {
1591
+ return RdsResponseParse(client_, tracer_, response, expected_server_name,
1592
+ expected_route_configuration_names,
1593
+ xds_routing_enabled_, rds_update, arena.ptr());
1594
+ } else if (*type_url == kCdsTypeUrl) {
1595
+ return CdsResponseParse(client_, tracer_, response, expected_cluster_names,
1596
+ cds_update_map, arena.ptr());
1597
+ } else if (*type_url == kEdsTypeUrl) {
1598
+ return EdsResponseParse(client_, tracer_, response,
1599
+ expected_eds_service_names, eds_update_map,
1600
+ arena.ptr());
1601
+ } else {
370
1602
  return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
371
- "EDS response contains 0 resource.");
372
- }
373
- // Check the type_url of the resource.
374
- type_url = google_protobuf_Any_type_url(resources[0]);
375
- if (!upb_strview_eql(type_url, expected_type_url)) {
376
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Resource is not EDS.");
377
- }
378
- // Get the cluster_load_assignment.
379
- upb_strview encoded_cluster_load_assignment =
380
- google_protobuf_Any_value(resources[0]);
381
- envoy_api_v2_ClusterLoadAssignment* cluster_load_assignment =
382
- envoy_api_v2_ClusterLoadAssignment_parse(
383
- encoded_cluster_load_assignment.data,
384
- encoded_cluster_load_assignment.size, arena.ptr());
385
- // Get the endpoints.
386
- const envoy_api_v2_endpoint_LocalityLbEndpoints* const* endpoints =
387
- envoy_api_v2_ClusterLoadAssignment_endpoints(cluster_load_assignment,
388
- &size);
389
- for (size_t i = 0; i < size; ++i) {
390
- XdsPriorityListUpdate::LocalityMap::Locality locality;
391
- grpc_error* error = LocalityParse(endpoints[i], &locality);
392
- if (error != GRPC_ERROR_NONE) return error;
393
- // Filter out locality with weight 0.
394
- if (locality.lb_weight == 0) continue;
395
- update->priority_list_update.Add(locality);
396
- }
397
- // Get the drop config.
398
- update->drop_config = MakeRefCounted<XdsDropConfig>();
399
- const envoy_api_v2_ClusterLoadAssignment_Policy* policy =
400
- envoy_api_v2_ClusterLoadAssignment_policy(cluster_load_assignment);
401
- if (policy != nullptr) {
402
- const envoy_api_v2_ClusterLoadAssignment_Policy_DropOverload* const*
403
- drop_overload =
404
- envoy_api_v2_ClusterLoadAssignment_Policy_drop_overloads(policy,
405
- &size);
406
- for (size_t i = 0; i < size; ++i) {
407
- grpc_error* error = DropParseAndAppend(
408
- drop_overload[i], update->drop_config.get(), &update->drop_all);
409
- if (error != GRPC_ERROR_NONE) return error;
410
- }
1603
+ "Unsupported ADS resource type.");
411
1604
  }
412
- return GRPC_ERROR_NONE;
413
1605
  }
414
1606
 
415
1607
  namespace {
416
1608
 
417
- grpc_slice LrsRequestEncode(
1609
+ void MaybeLogLrsRequest(
1610
+ XdsClient* client, TraceFlag* tracer,
1611
+ const envoy_service_load_stats_v2_LoadStatsRequest* request) {
1612
+ if (GRPC_TRACE_FLAG_ENABLED(*tracer) &&
1613
+ gpr_should_log(GPR_LOG_SEVERITY_DEBUG)) {
1614
+ // TODO(roth): When we can upgrade upb, use upb textformat code to dump
1615
+ // the raw proto instead of doing this manually.
1616
+ std::vector<std::string> fields;
1617
+ // node
1618
+ const auto* node =
1619
+ envoy_service_load_stats_v2_LoadStatsRequest_node(request);
1620
+ if (node != nullptr) {
1621
+ AddNodeLogFields(node, &fields);
1622
+ }
1623
+ // cluster_stats
1624
+ size_t num_cluster_stats;
1625
+ const struct envoy_api_v2_endpoint_ClusterStats* const* cluster_stats =
1626
+ envoy_service_load_stats_v2_LoadStatsRequest_cluster_stats(
1627
+ request, &num_cluster_stats);
1628
+ for (size_t i = 0; i < num_cluster_stats; ++i) {
1629
+ const auto* cluster_stat = cluster_stats[i];
1630
+ fields.emplace_back("cluster_stats {");
1631
+ // cluster_name
1632
+ AddStringField(
1633
+ " cluster_name",
1634
+ envoy_api_v2_endpoint_ClusterStats_cluster_name(cluster_stat),
1635
+ &fields);
1636
+ // cluster_service_name
1637
+ AddStringField(
1638
+ " cluster_service_name",
1639
+ envoy_api_v2_endpoint_ClusterStats_cluster_service_name(cluster_stat),
1640
+ &fields);
1641
+ // upstream_locality_stats
1642
+ size_t num_stats;
1643
+ const envoy_api_v2_endpoint_UpstreamLocalityStats* const* stats =
1644
+ envoy_api_v2_endpoint_ClusterStats_upstream_locality_stats(
1645
+ cluster_stat, &num_stats);
1646
+ for (size_t j = 0; j < num_stats; ++j) {
1647
+ const auto* stat = stats[j];
1648
+ fields.emplace_back(" upstream_locality_stats {");
1649
+ // locality
1650
+ const auto* locality =
1651
+ envoy_api_v2_endpoint_UpstreamLocalityStats_locality(stat);
1652
+ if (locality != nullptr) {
1653
+ fields.emplace_back(" locality {");
1654
+ AddLocalityField(3, locality, &fields);
1655
+ fields.emplace_back(" }");
1656
+ }
1657
+ // total_successful_requests
1658
+ fields.emplace_back(absl::StrCat(
1659
+ " total_successful_requests: ",
1660
+ envoy_api_v2_endpoint_UpstreamLocalityStats_total_successful_requests(
1661
+ stat)));
1662
+ // total_requests_in_progress
1663
+ fields.emplace_back(absl::StrCat(
1664
+ " total_requests_in_progress: ",
1665
+ envoy_api_v2_endpoint_UpstreamLocalityStats_total_requests_in_progress(
1666
+ stat)));
1667
+ // total_error_requests
1668
+ fields.emplace_back(absl::StrCat(
1669
+ " total_error_requests: ",
1670
+ envoy_api_v2_endpoint_UpstreamLocalityStats_total_error_requests(
1671
+ stat)));
1672
+ // total_issued_requests
1673
+ fields.emplace_back(absl::StrCat(
1674
+ " total_issued_requests: ",
1675
+ envoy_api_v2_endpoint_UpstreamLocalityStats_total_issued_requests(
1676
+ stat)));
1677
+ fields.emplace_back(" }");
1678
+ }
1679
+ // total_dropped_requests
1680
+ fields.emplace_back(absl::StrCat(
1681
+ " total_dropped_requests: ",
1682
+ envoy_api_v2_endpoint_ClusterStats_total_dropped_requests(
1683
+ cluster_stat)));
1684
+ // dropped_requests
1685
+ size_t num_drops;
1686
+ const envoy_api_v2_endpoint_ClusterStats_DroppedRequests* const* drops =
1687
+ envoy_api_v2_endpoint_ClusterStats_dropped_requests(cluster_stat,
1688
+ &num_drops);
1689
+ for (size_t j = 0; j < num_drops; ++j) {
1690
+ const auto* drop = drops[j];
1691
+ fields.emplace_back(" dropped_requests {");
1692
+ // category
1693
+ AddStringField(
1694
+ " category",
1695
+ envoy_api_v2_endpoint_ClusterStats_DroppedRequests_category(drop),
1696
+ &fields);
1697
+ // dropped_count
1698
+ fields.emplace_back(absl::StrCat(
1699
+ " dropped_count: ",
1700
+ envoy_api_v2_endpoint_ClusterStats_DroppedRequests_dropped_count(
1701
+ drop)));
1702
+ fields.emplace_back(" }");
1703
+ }
1704
+ // load_report_interval
1705
+ const auto* load_report_interval =
1706
+ envoy_api_v2_endpoint_ClusterStats_load_report_interval(cluster_stat);
1707
+ if (load_report_interval != nullptr) {
1708
+ fields.emplace_back(" load_report_interval {");
1709
+ fields.emplace_back(absl::StrCat(
1710
+ " seconds: ",
1711
+ google_protobuf_Duration_seconds(load_report_interval)));
1712
+ fields.emplace_back(
1713
+ absl::StrCat(" nanos: ",
1714
+ google_protobuf_Duration_nanos(load_report_interval)));
1715
+ fields.emplace_back(" }");
1716
+ }
1717
+ fields.emplace_back("}");
1718
+ }
1719
+ gpr_log(GPR_DEBUG, "[xds_client %p] constructed LRS request: %s", client,
1720
+ absl::StrJoin(fields, "\n").c_str());
1721
+ }
1722
+ }
1723
+
1724
+ grpc_slice SerializeLrsRequest(
418
1725
  const envoy_service_load_stats_v2_LoadStatsRequest* request,
419
1726
  upb_arena* arena) {
420
1727
  size_t output_length;
@@ -425,9 +1732,7 @@ grpc_slice LrsRequestEncode(
425
1732
 
426
1733
  } // namespace
427
1734
 
428
- grpc_slice XdsLrsRequestCreateAndEncode(const char* server_name,
429
- const XdsBootstrap::Node* node,
430
- const char* build_version) {
1735
+ grpc_slice XdsApi::CreateLrsInitialRequest(const std::string& server_name) {
431
1736
  upb::Arena arena;
432
1737
  // Create a request.
433
1738
  envoy_service_load_stats_v2_LoadStatsRequest* request =
@@ -436,33 +1741,38 @@ grpc_slice XdsLrsRequestCreateAndEncode(const char* server_name,
436
1741
  envoy_api_v2_core_Node* node_msg =
437
1742
  envoy_service_load_stats_v2_LoadStatsRequest_mutable_node(request,
438
1743
  arena.ptr());
439
- PopulateNode(arena.ptr(), node, build_version, node_msg);
440
- // Add cluster stats. There is only one because we only use one server name in
441
- // one channel.
442
- envoy_api_v2_endpoint_ClusterStats* cluster_stats =
443
- envoy_service_load_stats_v2_LoadStatsRequest_add_cluster_stats(
444
- request, arena.ptr());
445
- // Set the cluster name.
446
- envoy_api_v2_endpoint_ClusterStats_set_cluster_name(
447
- cluster_stats, upb_strview_makez(server_name));
448
- return LrsRequestEncode(request, arena.ptr());
1744
+ PopulateNode(arena.ptr(), node_, build_version_, user_agent_name_,
1745
+ server_name, node_msg);
1746
+ envoy_api_v2_core_Node_add_client_features(
1747
+ node_msg, upb_strview_makez("envoy.lrs.supports_send_all_clusters"),
1748
+ arena.ptr());
1749
+ MaybeLogLrsRequest(client_, tracer_, request);
1750
+ return SerializeLrsRequest(request, arena.ptr());
449
1751
  }
450
1752
 
451
1753
  namespace {
452
1754
 
453
- void LocalityStatsPopulate(
454
- envoy_api_v2_endpoint_UpstreamLocalityStats* output,
455
- std::pair<const RefCountedPtr<XdsLocalityName>,
456
- XdsClientStats::LocalityStats::Snapshot>& input,
457
- upb_arena* arena) {
458
- // Set sub_zone.
1755
+ void LocalityStatsPopulate(envoy_api_v2_endpoint_UpstreamLocalityStats* output,
1756
+ const XdsLocalityName& locality_name,
1757
+ const XdsClusterLocalityStats::Snapshot& snapshot,
1758
+ upb_arena* arena) {
1759
+ // Set locality.
459
1760
  envoy_api_v2_core_Locality* locality =
460
1761
  envoy_api_v2_endpoint_UpstreamLocalityStats_mutable_locality(output,
461
1762
  arena);
462
- envoy_api_v2_core_Locality_set_sub_zone(
463
- locality, upb_strview_makez(input.first->sub_zone()));
1763
+ if (!locality_name.region().empty()) {
1764
+ envoy_api_v2_core_Locality_set_region(
1765
+ locality, upb_strview_makez(locality_name.region().c_str()));
1766
+ }
1767
+ if (!locality_name.zone().empty()) {
1768
+ envoy_api_v2_core_Locality_set_zone(
1769
+ locality, upb_strview_makez(locality_name.zone().c_str()));
1770
+ }
1771
+ if (!locality_name.sub_zone().empty()) {
1772
+ envoy_api_v2_core_Locality_set_sub_zone(
1773
+ locality, upb_strview_makez(locality_name.sub_zone().c_str()));
1774
+ }
464
1775
  // Set total counts.
465
- XdsClientStats::LocalityStats::Snapshot& snapshot = input.second;
466
1776
  envoy_api_v2_endpoint_UpstreamLocalityStats_set_total_successful_requests(
467
1777
  output, snapshot.total_successful_requests);
468
1778
  envoy_api_v2_endpoint_UpstreamLocalityStats_set_total_requests_in_progress(
@@ -471,16 +1781,15 @@ void LocalityStatsPopulate(
471
1781
  output, snapshot.total_error_requests);
472
1782
  envoy_api_v2_endpoint_UpstreamLocalityStats_set_total_issued_requests(
473
1783
  output, snapshot.total_issued_requests);
474
- // Add load metric stats.
475
- for (auto& p : snapshot.load_metric_stats) {
476
- const char* metric_name = p.first.get();
477
- const XdsClientStats::LocalityStats::LoadMetric::Snapshot& metric_value =
478
- p.second;
1784
+ // Add backend metrics.
1785
+ for (const auto& p : snapshot.backend_metrics) {
1786
+ const std::string& metric_name = p.first;
1787
+ const XdsClusterLocalityStats::BackendMetric& metric_value = p.second;
479
1788
  envoy_api_v2_endpoint_EndpointLoadMetricStats* load_metric =
480
1789
  envoy_api_v2_endpoint_UpstreamLocalityStats_add_load_metric_stats(
481
1790
  output, arena);
482
1791
  envoy_api_v2_endpoint_EndpointLoadMetricStats_set_metric_name(
483
- load_metric, upb_strview_makez(metric_name));
1792
+ load_metric, upb_strview_make(metric_name.data(), metric_name.size()));
484
1793
  envoy_api_v2_endpoint_EndpointLoadMetricStats_set_num_requests_finished_with_metric(
485
1794
  load_metric, metric_value.num_requests_finished_with_metric);
486
1795
  envoy_api_v2_endpoint_EndpointLoadMetricStats_set_total_metric_value(
@@ -490,62 +1799,74 @@ void LocalityStatsPopulate(
490
1799
 
491
1800
  } // namespace
492
1801
 
493
- grpc_slice XdsLrsRequestCreateAndEncode(const char* server_name,
494
- XdsClientStats* client_stats) {
1802
+ grpc_slice XdsApi::CreateLrsRequest(
1803
+ ClusterLoadReportMap cluster_load_report_map) {
495
1804
  upb::Arena arena;
496
- XdsClientStats::Snapshot snapshot = client_stats->GetSnapshotAndReset();
497
- // Prune unused locality stats.
498
- client_stats->PruneLocalityStats();
499
- // When all the counts are zero, return empty slice.
500
- if (snapshot.IsAllZero()) return grpc_empty_slice();
501
1805
  // Create a request.
502
1806
  envoy_service_load_stats_v2_LoadStatsRequest* request =
503
1807
  envoy_service_load_stats_v2_LoadStatsRequest_new(arena.ptr());
504
- // Add cluster stats. There is only one because we only use one server name in
505
- // one channel.
506
- envoy_api_v2_endpoint_ClusterStats* cluster_stats =
507
- envoy_service_load_stats_v2_LoadStatsRequest_add_cluster_stats(
508
- request, arena.ptr());
509
- // Set the cluster name.
510
- envoy_api_v2_endpoint_ClusterStats_set_cluster_name(
511
- cluster_stats, upb_strview_makez(server_name));
512
- // Add locality stats.
513
- for (auto& p : snapshot.upstream_locality_stats) {
514
- envoy_api_v2_endpoint_UpstreamLocalityStats* locality_stats =
515
- envoy_api_v2_endpoint_ClusterStats_add_upstream_locality_stats(
1808
+ for (auto& p : cluster_load_report_map) {
1809
+ const std::string& cluster_name = p.first.first;
1810
+ const std::string& eds_service_name = p.first.second;
1811
+ const ClusterLoadReport& load_report = p.second;
1812
+ // Add cluster stats.
1813
+ envoy_api_v2_endpoint_ClusterStats* cluster_stats =
1814
+ envoy_service_load_stats_v2_LoadStatsRequest_add_cluster_stats(
1815
+ request, arena.ptr());
1816
+ // Set the cluster name.
1817
+ envoy_api_v2_endpoint_ClusterStats_set_cluster_name(
1818
+ cluster_stats,
1819
+ upb_strview_make(cluster_name.data(), cluster_name.size()));
1820
+ // Set EDS service name, if non-empty.
1821
+ if (!eds_service_name.empty()) {
1822
+ envoy_api_v2_endpoint_ClusterStats_set_cluster_service_name(
1823
+ cluster_stats,
1824
+ upb_strview_make(eds_service_name.data(), eds_service_name.size()));
1825
+ }
1826
+ // Add locality stats.
1827
+ for (const auto& p : load_report.locality_stats) {
1828
+ const XdsLocalityName& locality_name = *p.first;
1829
+ const auto& snapshot = p.second;
1830
+ envoy_api_v2_endpoint_UpstreamLocalityStats* locality_stats =
1831
+ envoy_api_v2_endpoint_ClusterStats_add_upstream_locality_stats(
1832
+ cluster_stats, arena.ptr());
1833
+ LocalityStatsPopulate(locality_stats, locality_name, snapshot,
1834
+ arena.ptr());
1835
+ }
1836
+ // Add dropped requests.
1837
+ uint64_t total_dropped_requests = 0;
1838
+ for (const auto& p : load_report.dropped_requests) {
1839
+ const char* category = p.first.c_str();
1840
+ const uint64_t count = p.second;
1841
+ envoy_api_v2_endpoint_ClusterStats_DroppedRequests* dropped_requests =
1842
+ envoy_api_v2_endpoint_ClusterStats_add_dropped_requests(cluster_stats,
1843
+ arena.ptr());
1844
+ envoy_api_v2_endpoint_ClusterStats_DroppedRequests_set_category(
1845
+ dropped_requests, upb_strview_makez(category));
1846
+ envoy_api_v2_endpoint_ClusterStats_DroppedRequests_set_dropped_count(
1847
+ dropped_requests, count);
1848
+ total_dropped_requests += count;
1849
+ }
1850
+ // Set total dropped requests.
1851
+ envoy_api_v2_endpoint_ClusterStats_set_total_dropped_requests(
1852
+ cluster_stats, total_dropped_requests);
1853
+ // Set real load report interval.
1854
+ gpr_timespec timespec =
1855
+ grpc_millis_to_timespec(load_report.load_report_interval, GPR_TIMESPAN);
1856
+ google_protobuf_Duration* load_report_interval =
1857
+ envoy_api_v2_endpoint_ClusterStats_mutable_load_report_interval(
516
1858
  cluster_stats, arena.ptr());
517
- LocalityStatsPopulate(locality_stats, p, arena.ptr());
518
- }
519
- // Add dropped requests.
520
- for (auto& p : snapshot.dropped_requests) {
521
- const char* category = p.first.get();
522
- const uint64_t count = p.second;
523
- envoy_api_v2_endpoint_ClusterStats_DroppedRequests* dropped_requests =
524
- envoy_api_v2_endpoint_ClusterStats_add_dropped_requests(cluster_stats,
525
- arena.ptr());
526
- envoy_api_v2_endpoint_ClusterStats_DroppedRequests_set_category(
527
- dropped_requests, upb_strview_makez(category));
528
- envoy_api_v2_endpoint_ClusterStats_DroppedRequests_set_dropped_count(
529
- dropped_requests, count);
530
- }
531
- // Set total dropped requests.
532
- envoy_api_v2_endpoint_ClusterStats_set_total_dropped_requests(
533
- cluster_stats, snapshot.total_dropped_requests);
534
- // Set real load report interval.
535
- gpr_timespec timespec =
536
- grpc_millis_to_timespec(snapshot.load_report_interval, GPR_TIMESPAN);
537
- google_protobuf_Duration* load_report_interval =
538
- envoy_api_v2_endpoint_ClusterStats_mutable_load_report_interval(
539
- cluster_stats, arena.ptr());
540
- google_protobuf_Duration_set_seconds(load_report_interval, timespec.tv_sec);
541
- google_protobuf_Duration_set_nanos(load_report_interval, timespec.tv_nsec);
542
- return LrsRequestEncode(request, arena.ptr());
543
- }
544
-
545
- grpc_error* XdsLrsResponseDecodeAndParse(
546
- const grpc_slice& encoded_response,
547
- grpc_core::UniquePtr<char>* cluster_name,
548
- grpc_millis* load_reporting_interval) {
1859
+ google_protobuf_Duration_set_seconds(load_report_interval, timespec.tv_sec);
1860
+ google_protobuf_Duration_set_nanos(load_report_interval, timespec.tv_nsec);
1861
+ }
1862
+ MaybeLogLrsRequest(client_, tracer_, request);
1863
+ return SerializeLrsRequest(request, arena.ptr());
1864
+ }
1865
+
1866
+ grpc_error* XdsApi::ParseLrsResponse(const grpc_slice& encoded_response,
1867
+ bool* send_all_clusters,
1868
+ std::set<std::string>* cluster_names,
1869
+ grpc_millis* load_reporting_interval) {
549
1870
  upb::Arena arena;
550
1871
  // Decode the response.
551
1872
  const envoy_service_load_stats_v2_LoadStatsResponse* decoded_response =
@@ -554,19 +1875,22 @@ grpc_error* XdsLrsResponseDecodeAndParse(
554
1875
  GRPC_SLICE_LENGTH(encoded_response), arena.ptr());
555
1876
  // Parse the response.
556
1877
  if (decoded_response == nullptr) {
557
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING("No response found.");
1878
+ return GRPC_ERROR_CREATE_FROM_STATIC_STRING("Can't decode response.");
558
1879
  }
559
- // Check the cluster size in the response.
560
- size_t size;
561
- const upb_strview* clusters =
562
- envoy_service_load_stats_v2_LoadStatsResponse_clusters(decoded_response,
563
- &size);
564
- if (size != 1) {
565
- return GRPC_ERROR_CREATE_FROM_STATIC_STRING(
566
- "The number of clusters (server names) is not 1.");
1880
+ // Check send_all_clusters.
1881
+ if (envoy_service_load_stats_v2_LoadStatsResponse_send_all_clusters(
1882
+ decoded_response)) {
1883
+ *send_all_clusters = true;
1884
+ } else {
1885
+ // Store the cluster names.
1886
+ size_t size;
1887
+ const upb_strview* clusters =
1888
+ envoy_service_load_stats_v2_LoadStatsResponse_clusters(decoded_response,
1889
+ &size);
1890
+ for (size_t i = 0; i < size; ++i) {
1891
+ cluster_names->emplace(clusters[i].data, clusters[i].size);
1892
+ }
567
1893
  }
568
- // Get the cluster name for reporting loads.
569
- *cluster_name = StringCopy(clusters[0]);
570
1894
  // Get the load report interval.
571
1895
  const google_protobuf_Duration* load_reporting_interval_duration =
572
1896
  envoy_service_load_stats_v2_LoadStatsResponse_load_reporting_interval(