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