grpc 1.24.0 → 1.25.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 (505) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +306 -243
  3. data/etc/roots.pem +0 -100
  4. data/include/grpc/grpc_security.h +44 -18
  5. data/include/grpc/impl/codegen/grpc_types.h +15 -0
  6. data/include/grpc/impl/codegen/port_platform.h +27 -11
  7. data/include/grpc/impl/codegen/sync_generic.h +1 -1
  8. data/src/boringssl/err_data.c +695 -650
  9. data/src/core/ext/filters/client_channel/client_channel.cc +257 -179
  10. data/src/core/ext/filters/client_channel/client_channel.h +24 -0
  11. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +2 -3
  12. data/src/core/ext/filters/client_channel/client_channel_factory.h +1 -5
  13. data/src/core/ext/filters/client_channel/health/health_check_client.cc +18 -45
  14. data/src/core/ext/filters/client_channel/health/health_check_client.h +5 -13
  15. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  16. data/src/core/ext/filters/client_channel/lb_policy.cc +2 -3
  17. data/src/core/ext/filters/client_channel/lb_policy.h +65 -55
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +14 -14
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +113 -36
  20. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +14 -19
  21. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +36 -13
  22. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +3 -10
  23. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.cc +814 -1589
  24. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +2 -5
  25. data/src/core/ext/filters/client_channel/lb_policy_factory.h +3 -6
  26. data/src/core/ext/filters/client_channel/resolver.cc +1 -2
  27. data/src/core/ext/filters/client_channel/resolver.h +8 -16
  28. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +25 -8
  29. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.cc +46 -12
  30. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +10 -17
  31. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_libuv.cc +7 -8
  32. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +4 -4
  33. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +111 -44
  34. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +22 -14
  35. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
  36. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_fallback.cc +2 -2
  37. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +29 -10
  38. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +27 -36
  39. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +7 -10
  40. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +60 -16
  41. data/src/core/ext/filters/client_channel/resolver_factory.h +4 -8
  42. data/src/core/ext/filters/client_channel/resolver_registry.cc +1 -1
  43. data/src/core/ext/filters/client_channel/resolver_registry.h +1 -1
  44. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +7 -10
  45. data/src/core/ext/filters/client_channel/resolving_lb_policy.cc +7 -8
  46. data/src/core/ext/filters/client_channel/resolving_lb_policy.h +1 -1
  47. data/src/core/ext/filters/client_channel/retry_throttle.cc +5 -5
  48. data/src/core/ext/filters/client_channel/retry_throttle.h +1 -4
  49. data/src/core/ext/filters/client_channel/service_config.h +8 -8
  50. data/src/core/ext/filters/client_channel/subchannel.cc +53 -86
  51. data/src/core/ext/filters/client_channel/subchannel.h +7 -9
  52. data/src/core/ext/filters/client_channel/subchannel_interface.h +9 -13
  53. data/src/core/ext/filters/client_channel/subchannel_pool_interface.h +3 -6
  54. data/src/core/ext/filters/client_channel/{lb_policy/xds/xds_load_balancer_api.cc → xds/xds_api.cc} +169 -52
  55. data/src/core/ext/filters/client_channel/xds/xds_api.h +171 -0
  56. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.cc +450 -0
  57. data/src/core/ext/filters/client_channel/xds/xds_bootstrap.h +99 -0
  58. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_channel.h +8 -6
  59. data/src/core/ext/filters/client_channel/xds/xds_channel_args.h +26 -0
  60. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_channel_secure.cc +28 -11
  61. data/src/core/ext/filters/client_channel/xds/xds_client.cc +1413 -0
  62. data/src/core/ext/filters/client_channel/xds/xds_client.h +221 -0
  63. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_client_stats.cc +1 -5
  64. data/src/core/ext/filters/client_channel/{lb_policy/xds → xds}/xds_client_stats.h +3 -4
  65. data/src/core/ext/filters/deadline/deadline_filter.cc +20 -20
  66. data/src/core/ext/filters/http/client/http_client_filter.cc +15 -15
  67. data/src/core/ext/filters/http/client_authority_filter.cc +14 -14
  68. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +12 -12
  69. data/src/core/ext/filters/max_age/max_age_filter.cc +59 -50
  70. data/src/core/ext/filters/message_size/message_size_filter.cc +18 -18
  71. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.cc +15 -14
  72. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +233 -175
  73. data/src/core/ext/transport/chttp2/transport/flow_control.h +21 -24
  74. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +253 -163
  75. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +24 -12
  76. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +2 -3
  77. data/src/core/ext/transport/chttp2/transport/internal.h +13 -15
  78. data/src/core/ext/transport/chttp2/transport/writing.cc +3 -0
  79. data/src/core/ext/transport/inproc/inproc_transport.cc +20 -13
  80. data/src/core/lib/channel/channel_args.cc +16 -0
  81. data/src/core/lib/channel/channel_args.h +22 -0
  82. data/src/core/lib/channel/channelz.cc +5 -6
  83. data/src/core/lib/channel/channelz.h +1 -1
  84. data/src/core/lib/channel/connected_channel.cc +20 -20
  85. data/src/core/lib/channel/handshaker.h +3 -4
  86. data/src/core/lib/channel/handshaker_factory.h +1 -3
  87. data/src/core/lib/debug/trace.h +3 -2
  88. data/src/core/lib/gprpp/arena.cc +3 -3
  89. data/src/core/lib/gprpp/arena.h +2 -3
  90. data/src/core/lib/gprpp/inlined_vector.h +9 -0
  91. data/src/core/lib/gprpp/map.h +3 -501
  92. data/src/core/lib/gprpp/memory.h +45 -41
  93. data/src/core/lib/gprpp/mpscq.cc +108 -0
  94. data/src/core/lib/gprpp/mpscq.h +98 -0
  95. data/src/core/lib/gprpp/orphanable.h +6 -11
  96. data/src/core/lib/gprpp/ref_counted.h +25 -19
  97. data/src/core/lib/gprpp/set.h +33 -0
  98. data/src/core/lib/gprpp/thd.h +2 -4
  99. data/src/core/lib/http/httpcli.cc +1 -1
  100. data/src/core/lib/http/httpcli_security_connector.cc +15 -11
  101. data/src/core/lib/http/parser.cc +1 -1
  102. data/src/core/lib/iomgr/buffer_list.cc +4 -5
  103. data/src/core/lib/iomgr/buffer_list.h +5 -6
  104. data/src/core/lib/iomgr/call_combiner.cc +4 -5
  105. data/src/core/lib/iomgr/call_combiner.h +2 -2
  106. data/src/core/lib/iomgr/cfstream_handle.h +3 -5
  107. data/src/core/lib/iomgr/closure.h +8 -3
  108. data/src/core/lib/iomgr/combiner.cc +45 -82
  109. data/src/core/lib/iomgr/combiner.h +32 -8
  110. data/src/core/lib/iomgr/endpoint_cfstream.cc +5 -3
  111. data/src/core/lib/iomgr/ev_epoll1_linux.cc +19 -15
  112. data/src/core/lib/iomgr/ev_poll_posix.cc +3 -1
  113. data/src/core/lib/iomgr/exec_ctx.h +4 -3
  114. data/src/core/lib/iomgr/executor.cc +4 -2
  115. data/src/core/lib/iomgr/executor.h +3 -0
  116. data/src/core/lib/iomgr/executor/mpmcqueue.h +3 -6
  117. data/src/core/lib/iomgr/executor/threadpool.cc +1 -2
  118. data/src/core/lib/iomgr/executor/threadpool.h +7 -11
  119. data/src/core/lib/iomgr/resource_quota.cc +55 -51
  120. data/src/core/lib/iomgr/resource_quota.h +13 -9
  121. data/src/core/lib/iomgr/socket_utils_common_posix.cc +13 -0
  122. data/src/core/lib/iomgr/socket_utils_posix.h +4 -0
  123. data/src/core/lib/iomgr/tcp_client_posix.cc +4 -11
  124. data/src/core/lib/iomgr/tcp_custom.cc +9 -7
  125. data/src/core/lib/iomgr/tcp_posix.cc +20 -16
  126. data/src/core/lib/iomgr/tcp_server.h +1 -4
  127. data/src/core/lib/iomgr/tcp_server_custom.cc +5 -5
  128. data/src/core/lib/iomgr/tcp_server_posix.cc +1 -1
  129. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +2 -11
  130. data/src/core/lib/iomgr/timer_custom.cc +2 -2
  131. data/src/core/lib/iomgr/udp_server.cc +3 -2
  132. data/src/core/lib/iomgr/udp_server.h +6 -12
  133. data/src/core/lib/json/json.h +1 -1
  134. data/src/core/lib/json/json_string.cc +2 -2
  135. data/src/core/lib/profiling/basic_timers.cc +2 -2
  136. data/src/core/lib/security/credentials/alts/alts_credentials.cc +2 -2
  137. data/src/core/lib/security/credentials/alts/grpc_alts_credentials_server_options.cc +1 -1
  138. data/src/core/lib/security/credentials/credentials.h +4 -20
  139. data/src/core/lib/security/credentials/fake/fake_credentials.cc +4 -4
  140. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -3
  141. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +64 -0
  142. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +4 -4
  143. data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +9 -7
  144. data/src/core/lib/security/security_connector/load_system_roots_linux.cc +2 -0
  145. data/src/core/lib/security/security_connector/local/local_security_connector.cc +4 -4
  146. data/src/core/lib/security/security_connector/security_connector.cc +1 -0
  147. data/src/core/lib/security/security_connector/security_connector.h +19 -17
  148. data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +8 -5
  149. data/src/core/lib/security/security_connector/ssl_utils.cc +2 -2
  150. data/src/core/lib/security/security_connector/ssl_utils.h +1 -1
  151. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.cc +14 -6
  152. data/src/core/lib/security/security_connector/tls/spiffe_security_connector.h +4 -2
  153. data/src/core/lib/security/transport/client_auth_filter.cc +17 -17
  154. data/src/core/lib/security/transport/security_handshaker.cc +29 -13
  155. data/src/core/lib/security/transport/security_handshaker.h +4 -2
  156. data/src/core/lib/security/transport/server_auth_filter.cc +14 -14
  157. data/src/core/lib/slice/slice.cc +2 -10
  158. data/src/core/lib/slice/slice_hash_table.h +4 -6
  159. data/src/core/lib/slice/slice_intern.cc +42 -39
  160. data/src/core/lib/slice/slice_internal.h +3 -3
  161. data/src/core/lib/slice/slice_utils.h +21 -4
  162. data/src/core/lib/slice/slice_weak_hash_table.h +4 -6
  163. data/src/core/lib/surface/call.cc +3 -3
  164. data/src/core/lib/surface/channel.cc +7 -0
  165. data/src/core/lib/surface/completion_queue.cc +12 -11
  166. data/src/core/lib/surface/completion_queue.h +4 -2
  167. data/src/core/lib/surface/init.cc +1 -0
  168. data/src/core/lib/surface/lame_client.cc +33 -18
  169. data/src/core/lib/surface/server.cc +77 -76
  170. data/src/core/lib/surface/version.cc +1 -1
  171. data/src/core/lib/transport/byte_stream.h +3 -7
  172. data/src/core/lib/transport/connectivity_state.cc +112 -98
  173. data/src/core/lib/transport/connectivity_state.h +100 -50
  174. data/src/core/lib/transport/static_metadata.cc +276 -288
  175. data/src/core/lib/transport/static_metadata.h +73 -76
  176. data/src/core/lib/transport/status_conversion.cc +1 -1
  177. data/src/core/lib/transport/status_metadata.cc +1 -1
  178. data/src/core/lib/transport/transport.cc +2 -2
  179. data/src/core/lib/transport/transport.h +12 -4
  180. data/src/core/lib/transport/transport_op_string.cc +14 -11
  181. data/src/core/tsi/alts/frame_protector/alts_unseal_privacy_integrity_crypter.cc +1 -1
  182. data/src/core/tsi/alts/handshaker/alts_shared_resource.cc +1 -1
  183. data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +5 -5
  184. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +12 -2
  185. data/src/core/tsi/fake_transport_security.cc +7 -5
  186. data/src/core/tsi/grpc_shadow_boringssl.h +2918 -2627
  187. data/src/core/tsi/local_transport_security.cc +8 -6
  188. data/src/core/tsi/ssl/session_cache/ssl_session.h +1 -3
  189. data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -2
  190. data/src/core/tsi/ssl/session_cache/ssl_session_cache.cc +7 -5
  191. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +4 -6
  192. data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +1 -2
  193. data/src/core/tsi/ssl_transport_security.cc +12 -12
  194. data/src/core/tsi/ssl_transport_security.h +2 -2
  195. data/src/core/tsi/transport_security_grpc.cc +7 -0
  196. data/src/core/tsi/transport_security_grpc.h +6 -0
  197. data/src/ruby/ext/grpc/extconf.rb +1 -0
  198. data/src/ruby/ext/grpc/rb_call.c +1 -1
  199. data/src/ruby/ext/grpc/rb_channel.c +1 -1
  200. data/src/ruby/lib/grpc/generic/bidi_call.rb +1 -1
  201. data/src/ruby/lib/grpc/generic/rpc_server.rb +1 -1
  202. data/src/ruby/lib/grpc/version.rb +1 -1
  203. data/src/ruby/spec/google_rpc_status_utils_spec.rb +2 -2
  204. data/third_party/boringssl/crypto/asn1/a_bool.c +18 -5
  205. data/third_party/boringssl/crypto/asn1/a_d2i_fp.c +17 -221
  206. data/third_party/boringssl/crypto/asn1/a_dup.c +0 -24
  207. data/third_party/boringssl/crypto/asn1/a_enum.c +2 -2
  208. data/third_party/boringssl/crypto/asn1/a_i2d_fp.c +10 -72
  209. data/third_party/boringssl/crypto/asn1/a_int.c +12 -71
  210. data/third_party/boringssl/crypto/asn1/a_mbstr.c +110 -216
  211. data/third_party/boringssl/crypto/asn1/a_object.c +16 -5
  212. data/third_party/boringssl/crypto/asn1/a_strnid.c +1 -0
  213. data/third_party/boringssl/crypto/asn1/asn1_lib.c +5 -1
  214. data/third_party/boringssl/crypto/asn1/tasn_enc.c +3 -1
  215. data/third_party/boringssl/crypto/base64/base64.c +2 -2
  216. data/third_party/boringssl/crypto/bio/bio.c +73 -9
  217. data/third_party/boringssl/crypto/bio/connect.c +4 -0
  218. data/third_party/boringssl/crypto/bio/fd.c +4 -0
  219. data/third_party/boringssl/crypto/bio/file.c +5 -2
  220. data/third_party/boringssl/crypto/bio/socket.c +4 -0
  221. data/third_party/boringssl/crypto/bio/socket_helper.c +4 -0
  222. data/third_party/boringssl/crypto/bn_extra/convert.c +11 -7
  223. data/third_party/boringssl/crypto/bytestring/ber.c +8 -4
  224. data/third_party/boringssl/crypto/bytestring/cbb.c +19 -7
  225. data/third_party/boringssl/crypto/bytestring/cbs.c +28 -15
  226. data/third_party/boringssl/crypto/bytestring/internal.h +28 -7
  227. data/third_party/boringssl/crypto/bytestring/unicode.c +155 -0
  228. data/third_party/boringssl/crypto/chacha/chacha.c +36 -19
  229. data/third_party/boringssl/crypto/chacha/internal.h +45 -0
  230. data/third_party/boringssl/crypto/cipher_extra/cipher_extra.c +29 -0
  231. data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +269 -25
  232. data/third_party/boringssl/crypto/cipher_extra/e_aesctrhmac.c +16 -14
  233. data/third_party/boringssl/crypto/cipher_extra/e_aesgcmsiv.c +54 -38
  234. data/third_party/boringssl/crypto/cipher_extra/e_chacha20poly1305.c +133 -41
  235. data/third_party/boringssl/crypto/cipher_extra/e_tls.c +23 -15
  236. data/third_party/boringssl/crypto/cipher_extra/tls_cbc.c +24 -15
  237. data/third_party/boringssl/crypto/cmac/cmac.c +62 -25
  238. data/third_party/boringssl/crypto/conf/conf.c +7 -0
  239. data/third_party/boringssl/crypto/cpu-arm-linux.c +4 -148
  240. data/third_party/boringssl/crypto/cpu-arm-linux.h +201 -0
  241. data/third_party/boringssl/crypto/cpu-intel.c +45 -51
  242. data/third_party/boringssl/crypto/crypto.c +39 -22
  243. data/third_party/boringssl/crypto/curve25519/spake25519.c +1 -1
  244. data/third_party/boringssl/crypto/dsa/dsa.c +77 -53
  245. data/third_party/boringssl/crypto/ec_extra/ec_asn1.c +20 -8
  246. data/third_party/boringssl/crypto/ec_extra/ec_derive.c +96 -0
  247. data/third_party/boringssl/crypto/{ecdh/ecdh.c → ecdh_extra/ecdh_extra.c} +20 -58
  248. data/third_party/boringssl/crypto/ecdsa_extra/ecdsa_asn1.c +1 -9
  249. data/third_party/boringssl/crypto/engine/engine.c +2 -1
  250. data/third_party/boringssl/crypto/err/err.c +2 -0
  251. data/third_party/boringssl/crypto/err/internal.h +2 -2
  252. data/third_party/boringssl/crypto/evp/evp.c +89 -8
  253. data/third_party/boringssl/crypto/evp/evp_asn1.c +56 -5
  254. data/third_party/boringssl/crypto/evp/evp_ctx.c +52 -14
  255. data/third_party/boringssl/crypto/evp/internal.h +18 -1
  256. data/third_party/boringssl/crypto/evp/p_dsa_asn1.c +5 -0
  257. data/third_party/boringssl/crypto/evp/p_ec.c +51 -3
  258. data/third_party/boringssl/crypto/evp/p_ec_asn1.c +6 -7
  259. data/third_party/boringssl/crypto/evp/p_ed25519.c +36 -3
  260. data/third_party/boringssl/crypto/evp/p_ed25519_asn1.c +76 -45
  261. data/third_party/boringssl/crypto/evp/p_rsa.c +3 -1
  262. data/third_party/boringssl/crypto/evp/p_rsa_asn1.c +5 -0
  263. data/third_party/boringssl/crypto/evp/p_x25519.c +110 -0
  264. data/third_party/boringssl/crypto/evp/p_x25519_asn1.c +249 -0
  265. data/third_party/boringssl/crypto/evp/scrypt.c +6 -2
  266. data/third_party/boringssl/crypto/fipsmodule/aes/aes.c +34 -274
  267. data/third_party/boringssl/crypto/fipsmodule/aes/internal.h +161 -21
  268. data/third_party/boringssl/crypto/fipsmodule/aes/key_wrap.c +111 -13
  269. data/third_party/boringssl/crypto/fipsmodule/aes/mode_wrappers.c +17 -21
  270. data/third_party/boringssl/crypto/fipsmodule/bcm.c +119 -7
  271. data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +19 -2
  272. data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +2 -2
  273. data/third_party/boringssl/crypto/fipsmodule/bn/ctx.c +93 -160
  274. data/third_party/boringssl/crypto/fipsmodule/bn/div.c +48 -57
  275. data/third_party/boringssl/crypto/fipsmodule/bn/div_extra.c +87 -0
  276. data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +143 -211
  277. data/third_party/boringssl/crypto/fipsmodule/bn/gcd.c +0 -305
  278. data/third_party/boringssl/crypto/fipsmodule/bn/gcd_extra.c +325 -0
  279. data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +168 -50
  280. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +68 -92
  281. data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +7 -6
  282. data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +11 -14
  283. data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +358 -443
  284. data/third_party/boringssl/crypto/fipsmodule/bn/random.c +25 -35
  285. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +20 -25
  286. data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +76 -5
  287. data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +14 -14
  288. data/third_party/boringssl/crypto/fipsmodule/cipher/cipher.c +7 -2
  289. data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +383 -516
  290. data/third_party/boringssl/crypto/fipsmodule/cipher/e_des.c +4 -0
  291. data/third_party/boringssl/crypto/fipsmodule/cipher/internal.h +3 -4
  292. data/third_party/boringssl/crypto/fipsmodule/delocate.h +3 -2
  293. data/third_party/boringssl/crypto/fipsmodule/digest/digest.c +32 -17
  294. data/third_party/boringssl/crypto/fipsmodule/digest/md32_common.h +3 -3
  295. data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +228 -122
  296. data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +34 -8
  297. data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +311 -98
  298. data/third_party/boringssl/crypto/fipsmodule/ec/felem.c +82 -0
  299. data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +263 -97
  300. data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +22 -59
  301. data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +317 -234
  302. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64-table.h +9473 -9475
  303. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +313 -109
  304. data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +36 -0
  305. data/third_party/boringssl/crypto/fipsmodule/ec/scalar.c +96 -0
  306. data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +126 -792
  307. data/third_party/boringssl/crypto/fipsmodule/ec/simple_mul.c +84 -0
  308. data/third_party/boringssl/crypto/fipsmodule/ec/util.c +163 -12
  309. data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +84 -211
  310. data/third_party/boringssl/crypto/fipsmodule/ecdh/ecdh.c +122 -0
  311. data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +60 -205
  312. data/third_party/boringssl/crypto/fipsmodule/fips_shared_support.c +32 -0
  313. data/third_party/boringssl/crypto/fipsmodule/is_fips.c +2 -0
  314. data/third_party/boringssl/crypto/fipsmodule/md4/md4.c +3 -1
  315. data/third_party/boringssl/crypto/fipsmodule/md5/internal.h +37 -0
  316. data/third_party/boringssl/crypto/fipsmodule/md5/md5.c +11 -8
  317. data/third_party/boringssl/crypto/fipsmodule/modes/cbc.c +35 -79
  318. data/third_party/boringssl/crypto/fipsmodule/modes/cfb.c +7 -39
  319. data/third_party/boringssl/crypto/fipsmodule/modes/ctr.c +7 -27
  320. data/third_party/boringssl/crypto/fipsmodule/modes/gcm.c +123 -309
  321. data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +189 -126
  322. data/third_party/boringssl/crypto/fipsmodule/modes/ofb.c +3 -2
  323. data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +2 -2
  324. data/third_party/boringssl/crypto/fipsmodule/rand/internal.h +35 -0
  325. data/third_party/boringssl/crypto/fipsmodule/rand/rand.c +24 -19
  326. data/third_party/boringssl/crypto/fipsmodule/rand/urandom.c +256 -77
  327. data/third_party/boringssl/crypto/fipsmodule/rsa/padding.c +10 -7
  328. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +5 -1
  329. data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +131 -14
  330. data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +83 -10
  331. data/third_party/boringssl/crypto/fipsmodule/sha/internal.h +53 -0
  332. data/third_party/boringssl/crypto/fipsmodule/sha/sha1.c +9 -13
  333. data/third_party/boringssl/crypto/fipsmodule/sha/sha256.c +18 -12
  334. data/third_party/boringssl/crypto/fipsmodule/sha/sha512.c +95 -168
  335. data/third_party/boringssl/crypto/hrss/hrss.c +2201 -0
  336. data/third_party/boringssl/crypto/hrss/internal.h +62 -0
  337. data/third_party/boringssl/crypto/internal.h +95 -20
  338. data/third_party/boringssl/crypto/lhash/lhash.c +45 -33
  339. data/third_party/boringssl/crypto/mem.c +39 -2
  340. data/third_party/boringssl/crypto/obj/obj.c +4 -4
  341. data/third_party/boringssl/crypto/obj/obj_dat.h +6181 -875
  342. data/third_party/boringssl/crypto/pem/pem_all.c +2 -3
  343. data/third_party/boringssl/crypto/pem/pem_info.c +144 -162
  344. data/third_party/boringssl/crypto/pem/pem_lib.c +53 -52
  345. data/third_party/boringssl/crypto/pem/pem_pkey.c +13 -21
  346. data/third_party/boringssl/crypto/pkcs7/pkcs7.c +15 -22
  347. data/third_party/boringssl/crypto/pkcs7/pkcs7_x509.c +168 -16
  348. data/third_party/boringssl/crypto/pkcs8/internal.h +11 -0
  349. data/third_party/boringssl/crypto/pkcs8/p5_pbev2.c +24 -15
  350. data/third_party/boringssl/crypto/pkcs8/pkcs8.c +42 -25
  351. data/third_party/boringssl/crypto/pkcs8/pkcs8_x509.c +559 -43
  352. data/third_party/boringssl/crypto/pool/internal.h +1 -1
  353. data/third_party/boringssl/crypto/pool/pool.c +21 -0
  354. data/third_party/boringssl/crypto/rand_extra/deterministic.c +8 -0
  355. data/third_party/boringssl/crypto/rand_extra/fuchsia.c +1 -14
  356. data/third_party/boringssl/crypto/refcount_lock.c +2 -2
  357. data/third_party/boringssl/crypto/rsa_extra/rsa_print.c +22 -0
  358. data/third_party/boringssl/crypto/siphash/siphash.c +80 -0
  359. data/third_party/boringssl/crypto/stack/stack.c +83 -32
  360. data/third_party/boringssl/crypto/thread_none.c +2 -2
  361. data/third_party/boringssl/crypto/thread_pthread.c +2 -2
  362. data/third_party/boringssl/crypto/thread_win.c +38 -19
  363. data/third_party/boringssl/crypto/x509/a_strex.c +22 -2
  364. data/third_party/boringssl/crypto/x509/asn1_gen.c +2 -1
  365. data/third_party/boringssl/crypto/x509/by_dir.c +7 -0
  366. data/third_party/boringssl/crypto/x509/by_file.c +12 -10
  367. data/third_party/boringssl/crypto/x509/t_crl.c +5 -8
  368. data/third_party/boringssl/crypto/x509/t_req.c +1 -3
  369. data/third_party/boringssl/crypto/x509/t_x509.c +5 -8
  370. data/third_party/boringssl/crypto/x509/x509_cmp.c +1 -1
  371. data/third_party/boringssl/crypto/x509/x509_def.c +1 -1
  372. data/third_party/boringssl/crypto/x509/x509_lu.c +114 -5
  373. data/third_party/boringssl/crypto/x509/x509_req.c +20 -0
  374. data/third_party/boringssl/crypto/x509/x509_set.c +5 -0
  375. data/third_party/boringssl/crypto/x509/x509_trs.c +1 -0
  376. data/third_party/boringssl/crypto/x509/x509_txt.c +4 -5
  377. data/third_party/boringssl/crypto/x509/x509_vfy.c +145 -138
  378. data/third_party/boringssl/crypto/x509/x509_vpm.c +2 -0
  379. data/third_party/boringssl/crypto/x509/x509cset.c +40 -0
  380. data/third_party/boringssl/crypto/x509/x509name.c +2 -3
  381. data/third_party/boringssl/crypto/x509/x_all.c +109 -210
  382. data/third_party/boringssl/crypto/x509/x_x509.c +6 -0
  383. data/third_party/boringssl/crypto/x509v3/ext_dat.h +1 -3
  384. data/third_party/boringssl/crypto/x509v3/internal.h +56 -0
  385. data/third_party/boringssl/crypto/x509v3/pcy_cache.c +2 -0
  386. data/third_party/boringssl/crypto/x509v3/pcy_node.c +1 -0
  387. data/third_party/boringssl/crypto/x509v3/pcy_tree.c +4 -2
  388. data/third_party/boringssl/crypto/x509v3/v3_akey.c +5 -2
  389. data/third_party/boringssl/crypto/x509v3/v3_alt.c +19 -13
  390. data/third_party/boringssl/crypto/x509v3/v3_conf.c +2 -1
  391. data/third_party/boringssl/crypto/x509v3/v3_cpols.c +3 -2
  392. data/third_party/boringssl/crypto/x509v3/v3_genn.c +1 -6
  393. data/third_party/boringssl/crypto/x509v3/v3_lib.c +1 -0
  394. data/third_party/boringssl/crypto/x509v3/v3_ocsp.c +68 -0
  395. data/third_party/boringssl/crypto/x509v3/v3_pci.c +2 -1
  396. data/third_party/boringssl/crypto/x509v3/v3_purp.c +47 -69
  397. data/third_party/boringssl/crypto/x509v3/v3_skey.c +5 -2
  398. data/third_party/boringssl/crypto/x509v3/v3_utl.c +69 -25
  399. data/third_party/boringssl/include/openssl/aead.h +45 -19
  400. data/third_party/boringssl/include/openssl/aes.h +32 -7
  401. data/third_party/boringssl/include/openssl/asn1.h +7 -77
  402. data/third_party/boringssl/include/openssl/base.h +120 -6
  403. data/third_party/boringssl/include/openssl/base64.h +4 -1
  404. data/third_party/boringssl/include/openssl/bio.h +112 -81
  405. data/third_party/boringssl/include/openssl/blowfish.h +3 -3
  406. data/third_party/boringssl/include/openssl/bn.h +55 -29
  407. data/third_party/boringssl/include/openssl/buf.h +2 -2
  408. data/third_party/boringssl/include/openssl/bytestring.h +54 -32
  409. data/third_party/boringssl/include/openssl/cast.h +2 -2
  410. data/third_party/boringssl/include/openssl/cipher.h +46 -16
  411. data/third_party/boringssl/include/openssl/cmac.h +6 -2
  412. data/third_party/boringssl/include/openssl/conf.h +3 -6
  413. data/third_party/boringssl/include/openssl/cpu.h +25 -9
  414. data/third_party/boringssl/include/openssl/crypto.h +32 -10
  415. data/third_party/boringssl/include/openssl/curve25519.h +4 -4
  416. data/third_party/boringssl/include/openssl/dh.h +3 -2
  417. data/third_party/boringssl/include/openssl/digest.h +21 -7
  418. data/third_party/boringssl/include/openssl/dsa.h +8 -2
  419. data/third_party/boringssl/include/openssl/e_os2.h +18 -0
  420. data/third_party/boringssl/include/openssl/ec.h +25 -21
  421. data/third_party/boringssl/include/openssl/ec_key.h +36 -8
  422. data/third_party/boringssl/include/openssl/ecdh.h +17 -0
  423. data/third_party/boringssl/include/openssl/ecdsa.h +3 -3
  424. data/third_party/boringssl/include/openssl/engine.h +4 -4
  425. data/third_party/boringssl/include/openssl/err.h +3 -0
  426. data/third_party/boringssl/include/openssl/evp.h +199 -42
  427. data/third_party/boringssl/include/openssl/hmac.h +4 -4
  428. data/third_party/boringssl/include/openssl/hrss.h +100 -0
  429. data/third_party/boringssl/include/openssl/lhash.h +131 -23
  430. data/third_party/boringssl/include/openssl/md4.h +6 -4
  431. data/third_party/boringssl/include/openssl/md5.h +6 -4
  432. data/third_party/boringssl/include/openssl/mem.h +6 -2
  433. data/third_party/boringssl/include/openssl/nid.h +3 -0
  434. data/third_party/boringssl/include/openssl/obj.h +3 -0
  435. data/third_party/boringssl/include/openssl/pem.h +102 -64
  436. data/third_party/boringssl/include/openssl/pkcs7.h +136 -3
  437. data/third_party/boringssl/include/openssl/pkcs8.h +42 -3
  438. data/third_party/boringssl/include/openssl/pool.h +13 -2
  439. data/third_party/boringssl/include/openssl/ripemd.h +5 -4
  440. data/third_party/boringssl/include/openssl/rsa.h +46 -15
  441. data/third_party/boringssl/include/openssl/sha.h +40 -28
  442. data/third_party/boringssl/include/openssl/siphash.h +37 -0
  443. data/third_party/boringssl/include/openssl/span.h +17 -9
  444. data/third_party/boringssl/include/openssl/ssl.h +766 -393
  445. data/third_party/boringssl/include/openssl/ssl3.h +4 -3
  446. data/third_party/boringssl/include/openssl/stack.h +134 -77
  447. data/third_party/boringssl/include/openssl/thread.h +1 -1
  448. data/third_party/boringssl/include/openssl/tls1.h +25 -9
  449. data/third_party/boringssl/include/openssl/type_check.h +14 -15
  450. data/third_party/boringssl/include/openssl/x509.h +28 -3
  451. data/third_party/boringssl/include/openssl/x509_vfy.h +98 -32
  452. data/third_party/boringssl/include/openssl/x509v3.h +17 -13
  453. data/third_party/boringssl/ssl/d1_both.cc +9 -18
  454. data/third_party/boringssl/ssl/d1_lib.cc +4 -3
  455. data/third_party/boringssl/ssl/d1_pkt.cc +4 -4
  456. data/third_party/boringssl/ssl/d1_srtp.cc +15 -15
  457. data/third_party/boringssl/ssl/dtls_method.cc +0 -1
  458. data/third_party/boringssl/ssl/dtls_record.cc +28 -28
  459. data/third_party/boringssl/ssl/handoff.cc +295 -91
  460. data/third_party/boringssl/ssl/handshake.cc +133 -72
  461. data/third_party/boringssl/ssl/handshake_client.cc +218 -189
  462. data/third_party/boringssl/ssl/handshake_server.cc +399 -272
  463. data/third_party/boringssl/ssl/internal.h +1413 -928
  464. data/third_party/boringssl/ssl/s3_both.cc +175 -36
  465. data/third_party/boringssl/ssl/s3_lib.cc +9 -13
  466. data/third_party/boringssl/ssl/s3_pkt.cc +63 -29
  467. data/third_party/boringssl/ssl/ssl_aead_ctx.cc +55 -35
  468. data/third_party/boringssl/ssl/ssl_asn1.cc +57 -73
  469. data/third_party/boringssl/ssl/ssl_buffer.cc +13 -12
  470. data/third_party/boringssl/ssl/ssl_cert.cc +313 -210
  471. data/third_party/boringssl/ssl/ssl_cipher.cc +159 -221
  472. data/third_party/boringssl/ssl/ssl_file.cc +2 -0
  473. data/third_party/boringssl/ssl/ssl_key_share.cc +164 -19
  474. data/third_party/boringssl/ssl/ssl_lib.cc +847 -555
  475. data/third_party/boringssl/ssl/ssl_privkey.cc +441 -111
  476. data/third_party/boringssl/ssl/ssl_session.cc +230 -178
  477. data/third_party/boringssl/ssl/ssl_transcript.cc +21 -142
  478. data/third_party/boringssl/ssl/ssl_versions.cc +88 -93
  479. data/third_party/boringssl/ssl/ssl_x509.cc +279 -218
  480. data/third_party/boringssl/ssl/t1_enc.cc +5 -96
  481. data/third_party/boringssl/ssl/t1_lib.cc +931 -678
  482. data/third_party/boringssl/ssl/tls13_both.cc +251 -121
  483. data/third_party/boringssl/ssl/tls13_client.cc +129 -73
  484. data/third_party/boringssl/ssl/tls13_enc.cc +350 -282
  485. data/third_party/boringssl/ssl/tls13_server.cc +259 -192
  486. data/third_party/boringssl/ssl/tls_method.cc +26 -21
  487. data/third_party/boringssl/ssl/tls_record.cc +42 -47
  488. data/third_party/boringssl/third_party/fiat/curve25519.c +261 -1324
  489. data/third_party/boringssl/third_party/fiat/curve25519_32.h +911 -0
  490. data/third_party/boringssl/third_party/fiat/curve25519_64.h +559 -0
  491. data/third_party/boringssl/third_party/fiat/p256.c +238 -999
  492. data/third_party/boringssl/third_party/fiat/p256_32.h +3226 -0
  493. data/third_party/boringssl/third_party/fiat/p256_64.h +1217 -0
  494. data/third_party/upb/upb/port_def.inc +1 -1
  495. data/third_party/upb/upb/table.c +2 -1
  496. metadata +72 -44
  497. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_load_balancer_api.h +0 -127
  498. data/src/core/lib/gpr/mpscq.cc +0 -117
  499. data/src/core/lib/gpr/mpscq.h +0 -88
  500. data/src/core/lib/gprpp/abstract.h +0 -47
  501. data/src/core/lib/gprpp/pair.h +0 -38
  502. data/third_party/boringssl/crypto/cipher_extra/e_ssl3.c +0 -460
  503. data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +0 -256
  504. data/third_party/boringssl/include/openssl/lhash_macros.h +0 -174
  505. data/third_party/boringssl/ssl/custom_extensions.cc +0 -265
@@ -0,0 +1,171 @@
1
+ /*
2
+ *
3
+ * Copyright 2018 gRPC authors.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ *
17
+ */
18
+
19
+ #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_XDS_XDS_API_H
20
+ #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_XDS_XDS_API_H
21
+
22
+ #include <grpc/support/port_platform.h>
23
+
24
+ #include <stdint.h>
25
+
26
+ #include <grpc/slice_buffer.h>
27
+
28
+ #include "src/core/ext/filters/client_channel/server_address.h"
29
+ #include "src/core/ext/filters/client_channel/xds/xds_bootstrap.h"
30
+ #include "src/core/ext/filters/client_channel/xds/xds_client_stats.h"
31
+
32
+ namespace grpc_core {
33
+
34
+ class XdsPriorityListUpdate {
35
+ public:
36
+ struct LocalityMap {
37
+ struct Locality {
38
+ bool operator==(const Locality& other) const {
39
+ return *name == *other.name && serverlist == other.serverlist &&
40
+ lb_weight == other.lb_weight && priority == other.priority;
41
+ }
42
+
43
+ // This comparator only compares the locality names.
44
+ struct Less {
45
+ bool operator()(const Locality& lhs, const Locality& rhs) const {
46
+ return XdsLocalityName::Less()(lhs.name, rhs.name);
47
+ }
48
+ };
49
+
50
+ RefCountedPtr<XdsLocalityName> name;
51
+ ServerAddressList serverlist;
52
+ uint32_t lb_weight;
53
+ uint32_t priority;
54
+ };
55
+
56
+ bool Contains(const RefCountedPtr<XdsLocalityName>& name) const {
57
+ return localities.find(name) != localities.end();
58
+ }
59
+
60
+ size_t size() const { return localities.size(); }
61
+
62
+ Map<RefCountedPtr<XdsLocalityName>, Locality, XdsLocalityName::Less>
63
+ localities;
64
+ };
65
+
66
+ bool operator==(const XdsPriorityListUpdate& other) const;
67
+ bool operator!=(const XdsPriorityListUpdate& other) const {
68
+ return !(*this == other);
69
+ }
70
+
71
+ void Add(LocalityMap::Locality locality);
72
+
73
+ const LocalityMap* Find(uint32_t priority) const;
74
+
75
+ bool Contains(uint32_t priority) const {
76
+ return priority < priorities_.size();
77
+ }
78
+ bool Contains(const RefCountedPtr<XdsLocalityName>& name);
79
+
80
+ bool empty() const { return priorities_.empty(); }
81
+ size_t size() const { return priorities_.size(); }
82
+
83
+ // Callers should make sure the priority list is non-empty.
84
+ uint32_t LowestPriority() const {
85
+ return static_cast<uint32_t>(priorities_.size()) - 1;
86
+ }
87
+
88
+ private:
89
+ InlinedVector<LocalityMap, 2> priorities_;
90
+ };
91
+
92
+ // There are two phases of accessing this class's content:
93
+ // 1. to initialize in the control plane combiner;
94
+ // 2. to use in the data plane combiner.
95
+ // So no additional synchronization is needed.
96
+ class XdsDropConfig : public RefCounted<XdsDropConfig> {
97
+ public:
98
+ struct DropCategory {
99
+ bool operator==(const DropCategory& other) const {
100
+ return strcmp(name.get(), other.name.get()) == 0 &&
101
+ parts_per_million == other.parts_per_million;
102
+ }
103
+
104
+ UniquePtr<char> name;
105
+ const uint32_t parts_per_million;
106
+ };
107
+
108
+ using DropCategoryList = InlinedVector<DropCategory, 2>;
109
+
110
+ void AddCategory(UniquePtr<char> name, uint32_t parts_per_million) {
111
+ drop_category_list_.emplace_back(
112
+ DropCategory{std::move(name), parts_per_million});
113
+ }
114
+
115
+ // The only method invoked from the data plane combiner.
116
+ bool ShouldDrop(const UniquePtr<char>** category_name) const;
117
+
118
+ const DropCategoryList& drop_category_list() const {
119
+ return drop_category_list_;
120
+ }
121
+
122
+ bool operator==(const XdsDropConfig& other) const {
123
+ return drop_category_list_ == other.drop_category_list_;
124
+ }
125
+ bool operator!=(const XdsDropConfig& other) const {
126
+ return !(*this == other);
127
+ }
128
+
129
+ private:
130
+ DropCategoryList drop_category_list_;
131
+ };
132
+
133
+ struct EdsUpdate {
134
+ XdsPriorityListUpdate priority_list_update;
135
+ RefCountedPtr<XdsDropConfig> drop_config;
136
+ bool drop_all = false;
137
+ };
138
+
139
+ // TODO(juanlishen): Add fields as part of implementing CDS support.
140
+ struct CdsUpdate {};
141
+
142
+ // Creates an EDS request querying \a service_name.
143
+ grpc_slice XdsEdsRequestCreateAndEncode(const char* server_name,
144
+ const XdsBootstrap::Node* node,
145
+ const char* build_version);
146
+
147
+ // Parses the EDS response and returns the args to update locality map. If there
148
+ // is any error, the output update is invalid.
149
+ grpc_error* XdsEdsResponseDecodeAndParse(const grpc_slice& encoded_response,
150
+ EdsUpdate* update);
151
+
152
+ // Creates an LRS request querying \a server_name.
153
+ grpc_slice XdsLrsRequestCreateAndEncode(const char* server_name,
154
+ const XdsBootstrap::Node* node,
155
+ const char* build_version);
156
+
157
+ // Creates an LRS request sending client-side load reports. If all the counters
158
+ // in \a client_stats are zero, returns empty slice.
159
+ grpc_slice XdsLrsRequestCreateAndEncode(const char* server_name,
160
+ XdsClientStats* client_stats);
161
+
162
+ // Parses the LRS response and returns \a cluster_name and \a
163
+ // load_reporting_interval for client-side load reporting. If there is any
164
+ // error, the output config is invalid.
165
+ grpc_error* XdsLrsResponseDecodeAndParse(const grpc_slice& encoded_response,
166
+ UniquePtr<char>* cluster_name,
167
+ grpc_millis* load_reporting_interval);
168
+
169
+ } // namespace grpc_core
170
+
171
+ #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_XDS_XDS_API_H */
@@ -0,0 +1,450 @@
1
+ //
2
+ // Copyright 2019 gRPC authors.
3
+ //
4
+ // Licensed under the Apache License, Version 2.0 (the "License");
5
+ // you may not use this file except in compliance with the License.
6
+ // You may obtain a copy of the License at
7
+ //
8
+ // http://www.apache.org/licenses/LICENSE-2.0
9
+ //
10
+ // Unless required by applicable law or agreed to in writing, software
11
+ // distributed under the License is distributed on an "AS IS" BASIS,
12
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ // See the License for the specific language governing permissions and
14
+ // limitations under the License.
15
+ //
16
+
17
+ #include <grpc/support/port_platform.h>
18
+
19
+ #include "src/core/ext/filters/client_channel/xds/xds_bootstrap.h"
20
+
21
+ #include <errno.h>
22
+ #include <stdlib.h>
23
+
24
+ #include <grpc/support/string_util.h>
25
+
26
+ #include "src/core/lib/gpr/env.h"
27
+ #include "src/core/lib/iomgr/load_file.h"
28
+ #include "src/core/lib/slice/slice_internal.h"
29
+
30
+ namespace grpc_core {
31
+
32
+ UniquePtr<XdsBootstrap> XdsBootstrap::ReadFromFile(grpc_error** error) {
33
+ UniquePtr<char> path(gpr_getenv("GRPC_XDS_BOOTSTRAP"));
34
+ if (path == nullptr) {
35
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
36
+ "GRPC_XDS_BOOTSTRAP env var not set");
37
+ return nullptr;
38
+ }
39
+ grpc_slice contents;
40
+ *error = grpc_load_file(path.get(), /*add_null_terminator=*/true, &contents);
41
+ if (*error != GRPC_ERROR_NONE) return nullptr;
42
+ return MakeUnique<XdsBootstrap>(contents, error);
43
+ }
44
+
45
+ XdsBootstrap::XdsBootstrap(grpc_slice contents, grpc_error** error)
46
+ : contents_(contents) {
47
+ tree_ = grpc_json_parse_string_with_len(
48
+ reinterpret_cast<char*>(GPR_SLICE_START_PTR(contents_)),
49
+ GPR_SLICE_LENGTH(contents_));
50
+ if (tree_ == nullptr) {
51
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
52
+ "failed to parse bootstrap file JSON");
53
+ return;
54
+ }
55
+ if (tree_->type != GRPC_JSON_OBJECT || tree_->key != nullptr) {
56
+ *error = GRPC_ERROR_CREATE_FROM_STATIC_STRING(
57
+ "malformed JSON in bootstrap file");
58
+ return;
59
+ }
60
+ InlinedVector<grpc_error*, 1> error_list;
61
+ bool seen_xds_server = false;
62
+ bool seen_node = false;
63
+ for (grpc_json* child = tree_->child; child != nullptr; child = child->next) {
64
+ if (child->key == nullptr) {
65
+ error_list.push_back(
66
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("JSON key is null"));
67
+ } else if (strcmp(child->key, "xds_server") == 0) {
68
+ if (child->type != GRPC_JSON_OBJECT) {
69
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
70
+ "\"xds_server\" field is not an object"));
71
+ }
72
+ if (seen_xds_server) {
73
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
74
+ "duplicate \"xds_server\" field"));
75
+ }
76
+ seen_xds_server = true;
77
+ grpc_error* parse_error = ParseXdsServer(child);
78
+ if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
79
+ } else if (strcmp(child->key, "node") == 0) {
80
+ if (child->type != GRPC_JSON_OBJECT) {
81
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
82
+ "\"node\" field is not an object"));
83
+ }
84
+ if (seen_node) {
85
+ error_list.push_back(
86
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("duplicate \"node\" field"));
87
+ }
88
+ seen_node = true;
89
+ grpc_error* parse_error = ParseNode(child);
90
+ if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
91
+ }
92
+ }
93
+ if (!seen_xds_server) {
94
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
95
+ "\"xds_server\" field not present"));
96
+ }
97
+ *error = GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing xds bootstrap file",
98
+ &error_list);
99
+ }
100
+
101
+ XdsBootstrap::~XdsBootstrap() {
102
+ grpc_json_destroy(tree_);
103
+ grpc_slice_unref_internal(contents_);
104
+ }
105
+
106
+ grpc_error* XdsBootstrap::ParseXdsServer(grpc_json* json) {
107
+ InlinedVector<grpc_error*, 1> error_list;
108
+ server_uri_ = nullptr;
109
+ bool seen_channel_creds = false;
110
+ for (grpc_json* child = json->child; child != nullptr; child = child->next) {
111
+ if (child->key == nullptr) {
112
+ error_list.push_back(
113
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("JSON key is null"));
114
+ } else if (strcmp(child->key, "server_uri") == 0) {
115
+ if (child->type != GRPC_JSON_STRING) {
116
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
117
+ "\"server_uri\" field is not a string"));
118
+ }
119
+ if (server_uri_ != nullptr) {
120
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
121
+ "duplicate \"server_uri\" field"));
122
+ }
123
+ server_uri_ = child->value;
124
+ } else if (strcmp(child->key, "channel_creds") == 0) {
125
+ if (child->type != GRPC_JSON_ARRAY) {
126
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
127
+ "\"channel_creds\" field is not an array"));
128
+ }
129
+ if (seen_channel_creds) {
130
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
131
+ "duplicate \"channel_creds\" field"));
132
+ }
133
+ seen_channel_creds = true;
134
+ grpc_error* parse_error = ParseChannelCredsArray(child);
135
+ if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
136
+ }
137
+ }
138
+ if (server_uri_ == nullptr) {
139
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
140
+ "\"server_uri\" field not present"));
141
+ }
142
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing \"xds_server\" object",
143
+ &error_list);
144
+ }
145
+
146
+ grpc_error* XdsBootstrap::ParseChannelCredsArray(grpc_json* json) {
147
+ InlinedVector<grpc_error*, 1> error_list;
148
+ size_t idx = 0;
149
+ for (grpc_json *child = json->child; child != nullptr;
150
+ child = child->next, ++idx) {
151
+ if (child->key != nullptr) {
152
+ char* msg;
153
+ gpr_asprintf(&msg, "array element %" PRIuPTR " key is not null", idx);
154
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg));
155
+ }
156
+ if (child->type != GRPC_JSON_OBJECT) {
157
+ char* msg;
158
+ gpr_asprintf(&msg, "array element %" PRIuPTR " is not an object", idx);
159
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg));
160
+ } else {
161
+ grpc_error* parse_error = ParseChannelCreds(child, idx);
162
+ if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
163
+ }
164
+ }
165
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing \"channel_creds\" array",
166
+ &error_list);
167
+ }
168
+
169
+ grpc_error* XdsBootstrap::ParseChannelCreds(grpc_json* json, size_t idx) {
170
+ InlinedVector<grpc_error*, 1> error_list;
171
+ ChannelCreds channel_creds;
172
+ for (grpc_json* child = json->child; child != nullptr; child = child->next) {
173
+ if (child->key == nullptr) {
174
+ error_list.push_back(
175
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("JSON key is null"));
176
+ } else if (strcmp(child->key, "type") == 0) {
177
+ if (child->type != GRPC_JSON_STRING) {
178
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
179
+ "\"type\" field is not a string"));
180
+ }
181
+ if (channel_creds.type != nullptr) {
182
+ error_list.push_back(
183
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("duplicate \"type\" field"));
184
+ }
185
+ channel_creds.type = child->value;
186
+ } else if (strcmp(child->key, "config") == 0) {
187
+ if (child->type != GRPC_JSON_OBJECT) {
188
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
189
+ "\"config\" field is not an object"));
190
+ }
191
+ if (channel_creds.config != nullptr) {
192
+ error_list.push_back(
193
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("duplicate \"config\" field"));
194
+ }
195
+ channel_creds.config = child;
196
+ }
197
+ }
198
+ if (channel_creds.type != nullptr) channel_creds_.push_back(channel_creds);
199
+ // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error
200
+ // string is not static in this case.
201
+ if (error_list.empty()) return GRPC_ERROR_NONE;
202
+ char* msg;
203
+ gpr_asprintf(&msg, "errors parsing index %" PRIuPTR, idx);
204
+ grpc_error* error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
205
+ gpr_free(msg);
206
+ for (size_t i = 0; i < error_list.size(); ++i) {
207
+ error = grpc_error_add_child(error, error_list[i]);
208
+ }
209
+ return error;
210
+ }
211
+
212
+ grpc_error* XdsBootstrap::ParseNode(grpc_json* json) {
213
+ InlinedVector<grpc_error*, 1> error_list;
214
+ node_ = MakeUnique<Node>();
215
+ bool seen_metadata = false;
216
+ bool seen_locality = false;
217
+ for (grpc_json* child = json->child; child != nullptr; child = child->next) {
218
+ if (child->key == nullptr) {
219
+ error_list.push_back(
220
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("JSON key is null"));
221
+ } else if (strcmp(child->key, "id") == 0) {
222
+ if (child->type != GRPC_JSON_STRING) {
223
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
224
+ "\"id\" field is not a string"));
225
+ }
226
+ if (node_->id != nullptr) {
227
+ error_list.push_back(
228
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("duplicate \"id\" field"));
229
+ }
230
+ node_->id = child->value;
231
+ } else if (strcmp(child->key, "cluster") == 0) {
232
+ if (child->type != GRPC_JSON_STRING) {
233
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
234
+ "\"cluster\" field is not a string"));
235
+ }
236
+ if (node_->cluster != nullptr) {
237
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
238
+ "duplicate \"cluster\" field"));
239
+ }
240
+ node_->cluster = child->value;
241
+ } else if (strcmp(child->key, "locality") == 0) {
242
+ if (child->type != GRPC_JSON_OBJECT) {
243
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
244
+ "\"locality\" field is not an object"));
245
+ }
246
+ if (seen_locality) {
247
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
248
+ "duplicate \"locality\" field"));
249
+ }
250
+ seen_locality = true;
251
+ grpc_error* parse_error = ParseLocality(child);
252
+ if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
253
+ } else if (strcmp(child->key, "metadata") == 0) {
254
+ if (child->type != GRPC_JSON_OBJECT) {
255
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
256
+ "\"metadata\" field is not an object"));
257
+ }
258
+ if (seen_metadata) {
259
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
260
+ "duplicate \"metadata\" field"));
261
+ }
262
+ seen_metadata = true;
263
+ InlinedVector<grpc_error*, 1> parse_errors =
264
+ ParseMetadataStruct(child, &node_->metadata);
265
+ if (!parse_errors.empty()) {
266
+ grpc_error* parse_error = GRPC_ERROR_CREATE_FROM_VECTOR(
267
+ "errors parsing \"metadata\" object", &parse_errors);
268
+ error_list.push_back(parse_error);
269
+ }
270
+ }
271
+ }
272
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing \"node\" object",
273
+ &error_list);
274
+ }
275
+
276
+ grpc_error* XdsBootstrap::ParseLocality(grpc_json* json) {
277
+ InlinedVector<grpc_error*, 1> error_list;
278
+ node_->locality_region = nullptr;
279
+ node_->locality_zone = nullptr;
280
+ node_->locality_subzone = nullptr;
281
+ for (grpc_json* child = json->child; child != nullptr; child = child->next) {
282
+ if (child->key == nullptr) {
283
+ error_list.push_back(
284
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("JSON key is null"));
285
+ } else if (strcmp(child->key, "region") == 0) {
286
+ if (child->type != GRPC_JSON_STRING) {
287
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
288
+ "\"region\" field is not a string"));
289
+ }
290
+ if (node_->locality_region != nullptr) {
291
+ error_list.push_back(
292
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("duplicate \"region\" field"));
293
+ }
294
+ node_->locality_region = child->value;
295
+ } else if (strcmp(child->key, "zone") == 0) {
296
+ if (child->type != GRPC_JSON_STRING) {
297
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
298
+ "\"zone\" field is not a string"));
299
+ }
300
+ if (node_->locality_zone != nullptr) {
301
+ error_list.push_back(
302
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("duplicate \"zone\" field"));
303
+ }
304
+ node_->locality_zone = child->value;
305
+ } else if (strcmp(child->key, "subzone") == 0) {
306
+ if (child->type != GRPC_JSON_STRING) {
307
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
308
+ "\"subzone\" field is not a string"));
309
+ }
310
+ if (node_->locality_subzone != nullptr) {
311
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_STATIC_STRING(
312
+ "duplicate \"subzone\" field"));
313
+ }
314
+ node_->locality_subzone = child->value;
315
+ }
316
+ }
317
+ return GRPC_ERROR_CREATE_FROM_VECTOR("errors parsing \"locality\" object",
318
+ &error_list);
319
+ }
320
+
321
+ InlinedVector<grpc_error*, 1> XdsBootstrap::ParseMetadataStruct(
322
+ grpc_json* json,
323
+ Map<const char*, XdsBootstrap::MetadataValue, StringLess>* result) {
324
+ InlinedVector<grpc_error*, 1> error_list;
325
+ for (grpc_json* child = json->child; child != nullptr; child = child->next) {
326
+ if (child->key == nullptr) {
327
+ error_list.push_back(
328
+ GRPC_ERROR_CREATE_FROM_STATIC_STRING("JSON key is null"));
329
+ continue;
330
+ }
331
+ if (result->find(child->key) != result->end()) {
332
+ char* msg;
333
+ gpr_asprintf(&msg, "duplicate metadata key \"%s\"", child->key);
334
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg));
335
+ gpr_free(msg);
336
+ }
337
+ MetadataValue& value = (*result)[child->key];
338
+ grpc_error* parse_error = ParseMetadataValue(child, 0, &value);
339
+ if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
340
+ }
341
+ return error_list;
342
+ }
343
+
344
+ InlinedVector<grpc_error*, 1> XdsBootstrap::ParseMetadataList(
345
+ grpc_json* json, std::vector<MetadataValue>* result) {
346
+ InlinedVector<grpc_error*, 1> error_list;
347
+ size_t idx = 0;
348
+ for (grpc_json *child = json->child; child != nullptr;
349
+ child = child->next, ++idx) {
350
+ if (child->key != nullptr) {
351
+ char* msg;
352
+ gpr_asprintf(&msg, "JSON key is non-null for index %" PRIuPTR, idx);
353
+ error_list.push_back(GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg));
354
+ gpr_free(msg);
355
+ }
356
+ result->emplace_back();
357
+ grpc_error* parse_error = ParseMetadataValue(child, idx, &result->back());
358
+ if (parse_error != GRPC_ERROR_NONE) error_list.push_back(parse_error);
359
+ }
360
+ return error_list;
361
+ }
362
+
363
+ grpc_error* XdsBootstrap::ParseMetadataValue(grpc_json* json, size_t idx,
364
+ MetadataValue* result) {
365
+ grpc_error* error = GRPC_ERROR_NONE;
366
+ auto context_func = [json, idx]() {
367
+ char* context;
368
+ if (json->key != nullptr) {
369
+ gpr_asprintf(&context, "key \"%s\"", json->key);
370
+ } else {
371
+ gpr_asprintf(&context, "index %" PRIuPTR, idx);
372
+ }
373
+ return context;
374
+ };
375
+ switch (json->type) {
376
+ case GRPC_JSON_STRING:
377
+ result->type = MetadataValue::Type::STRING;
378
+ result->string_value = json->value;
379
+ break;
380
+ case GRPC_JSON_NUMBER:
381
+ result->type = MetadataValue::Type::DOUBLE;
382
+ errno = 0; // To distinguish error.
383
+ result->double_value = strtod(json->value, nullptr);
384
+ if (errno != 0) {
385
+ char* context = context_func();
386
+ char* msg;
387
+ gpr_asprintf(&msg, "error parsing numeric value for %s: \"%s\"",
388
+ context, json->value);
389
+ error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
390
+ gpr_free(context);
391
+ gpr_free(msg);
392
+ }
393
+ break;
394
+ case GRPC_JSON_TRUE:
395
+ result->type = MetadataValue::Type::BOOL;
396
+ result->bool_value = true;
397
+ break;
398
+ case GRPC_JSON_FALSE:
399
+ result->type = MetadataValue::Type::BOOL;
400
+ result->bool_value = false;
401
+ break;
402
+ case GRPC_JSON_NULL:
403
+ result->type = MetadataValue::Type::MD_NULL;
404
+ break;
405
+ case GRPC_JSON_ARRAY: {
406
+ result->type = MetadataValue::Type::LIST;
407
+ InlinedVector<grpc_error*, 1> error_list =
408
+ ParseMetadataList(json, &result->list_value);
409
+ if (!error_list.empty()) {
410
+ // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error
411
+ // string is not static in this case.
412
+ char* context = context_func();
413
+ char* msg;
414
+ gpr_asprintf(&msg, "errors parsing struct for %s", context);
415
+ error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
416
+ gpr_free(context);
417
+ gpr_free(msg);
418
+ for (size_t i = 0; i < error_list.size(); ++i) {
419
+ error = grpc_error_add_child(error, error_list[i]);
420
+ }
421
+ }
422
+ break;
423
+ }
424
+ case GRPC_JSON_OBJECT: {
425
+ result->type = MetadataValue::Type::STRUCT;
426
+ InlinedVector<grpc_error*, 1> error_list =
427
+ ParseMetadataStruct(json, &result->struct_value);
428
+ if (!error_list.empty()) {
429
+ // Can't use GRPC_ERROR_CREATE_FROM_VECTOR() here, because the error
430
+ // string is not static in this case.
431
+ char* context = context_func();
432
+ char* msg;
433
+ gpr_asprintf(&msg, "errors parsing struct for %s", context);
434
+ error = GRPC_ERROR_CREATE_FROM_COPIED_STRING(msg);
435
+ gpr_free(context);
436
+ gpr_free(msg);
437
+ for (size_t i = 0; i < error_list.size(); ++i) {
438
+ error = grpc_error_add_child(error, error_list[i]);
439
+ GRPC_ERROR_UNREF(error_list[i]);
440
+ }
441
+ }
442
+ break;
443
+ }
444
+ default:
445
+ break;
446
+ }
447
+ return error;
448
+ }
449
+
450
+ } // namespace grpc_core