grpc 1.55.3 → 1.56.0.pre3

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 (385) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +100 -70
  3. data/include/grpc/event_engine/event_engine.h +4 -3
  4. data/include/grpc/grpc_audit_logging.h +96 -0
  5. data/include/grpc/module.modulemap +2 -0
  6. data/include/grpc/support/json.h +218 -0
  7. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +5 -0
  8. data/src/core/ext/filters/client_channel/backend_metric.cc +2 -0
  9. data/src/core/ext/filters/client_channel/channel_connectivity.cc +4 -4
  10. data/src/core/ext/filters/client_channel/client_channel.cc +82 -98
  11. data/src/core/ext/filters/client_channel/client_channel.h +4 -0
  12. data/src/core/ext/filters/client_channel/client_channel_channelz.cc +19 -18
  13. data/src/core/ext/filters/client_channel/client_channel_internal.h +16 -21
  14. data/src/core/ext/filters/client_channel/config_selector.h +9 -24
  15. data/src/core/ext/filters/client_channel/lb_policy/backend_metric_data.h +3 -0
  16. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +5 -4
  17. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.cc +455 -0
  18. data/src/core/ext/filters/client_channel/lb_policy/health_check_client.h +54 -0
  19. data/src/core/ext/filters/client_channel/lb_policy/health_check_client_internal.h +186 -0
  20. data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +2 -7
  21. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +52 -20
  22. data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +23 -2
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +19 -6
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +1 -9
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +16 -7
  26. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +18 -1
  27. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +12 -9
  28. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +6 -4
  29. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +36 -13
  30. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/static_stride_scheduler.cc +76 -6
  31. data/src/core/ext/filters/client_channel/lb_policy/weighted_round_robin/weighted_round_robin.cc +32 -39
  32. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +4 -10
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +52 -47
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +1 -9
  35. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +14 -16
  36. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -43
  37. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_override_host.cc +7 -12
  38. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +12 -19
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +35 -33
  40. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/event_engine_client_channel_resolver.cc +29 -4
  41. data/src/core/ext/filters/client_channel/resolver/dns/event_engine/service_config_helper.cc +1 -1
  42. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +28 -27
  43. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +163 -46
  44. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.h +16 -1
  45. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -0
  46. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +10 -40
  47. data/src/core/ext/filters/client_channel/subchannel.cc +10 -196
  48. data/src/core/ext/filters/client_channel/subchannel.h +3 -43
  49. data/src/core/ext/filters/http/message_compress/compression_filter.cc +5 -5
  50. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +100 -6
  51. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -8
  52. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -3
  53. data/src/core/ext/filters/stateful_session/stateful_session_filter.h +16 -1
  54. data/src/core/ext/transport/chttp2/transport/flow_control.cc +46 -95
  55. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +543 -567
  56. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +9 -150
  57. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +32 -46
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +5 -18
  59. data/src/core/ext/transport/chttp2/transport/internal.h +1 -15
  60. data/src/core/ext/transport/chttp2/transport/parsing.cc +12 -12
  61. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.c +11 -2
  62. data/src/core/ext/upb-generated/xds/data/orca/v3/orca_load_report.upb.h +15 -0
  63. data/src/core/ext/xds/certificate_provider_store.cc +4 -9
  64. data/src/core/ext/xds/certificate_provider_store.h +1 -1
  65. data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +30 -42
  66. data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +14 -9
  67. data/src/core/ext/xds/xds_api.cc +9 -6
  68. data/src/core/ext/xds/xds_api.h +3 -2
  69. data/src/core/ext/xds/xds_audit_logger_registry.cc +122 -0
  70. data/src/core/ext/xds/xds_audit_logger_registry.h +68 -0
  71. data/src/core/ext/xds/xds_bootstrap_grpc.cc +21 -9
  72. data/src/core/ext/xds/xds_bootstrap_grpc.h +5 -0
  73. data/src/core/ext/xds/xds_client.cc +5 -4
  74. data/src/core/ext/xds/xds_client_stats.h +1 -1
  75. data/src/core/ext/xds/xds_cluster.cc +20 -19
  76. data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +11 -8
  77. data/src/core/ext/xds/xds_common_types.cc +3 -1
  78. data/src/core/ext/xds/xds_http_fault_filter.cc +16 -13
  79. data/src/core/ext/xds/xds_http_fault_filter.h +2 -1
  80. data/src/core/ext/xds/xds_http_filters.h +4 -2
  81. data/src/core/ext/xds/xds_http_rbac_filter.cc +154 -67
  82. data/src/core/ext/xds/xds_http_rbac_filter.h +2 -1
  83. data/src/core/ext/xds/xds_http_stateful_session_filter.cc +15 -11
  84. data/src/core/ext/xds/xds_http_stateful_session_filter.h +2 -1
  85. data/src/core/ext/xds/xds_lb_policy_registry.cc +22 -16
  86. data/src/core/ext/xds/xds_listener.cc +1 -0
  87. data/src/core/ext/xds/xds_route_config.cc +40 -3
  88. data/src/core/ext/xds/xds_routing.cc +2 -2
  89. data/src/core/ext/xds/xds_transport_grpc.cc +3 -1
  90. data/src/core/lib/avl/avl.h +5 -0
  91. data/src/core/lib/backoff/random_early_detection.h +0 -5
  92. data/src/core/lib/channel/channel_args.cc +80 -22
  93. data/src/core/lib/channel/channel_args.h +34 -1
  94. data/src/core/lib/channel/channel_trace.cc +16 -12
  95. data/src/core/lib/channel/channelz.cc +159 -132
  96. data/src/core/lib/channel/channelz.h +42 -35
  97. data/src/core/lib/channel/channelz_registry.cc +23 -20
  98. data/src/core/lib/channel/connected_channel.cc +17 -6
  99. data/src/core/lib/channel/promise_based_filter.cc +0 -4
  100. data/src/core/lib/channel/promise_based_filter.h +2 -0
  101. data/src/core/lib/compression/compression_internal.cc +2 -5
  102. data/src/core/lib/config/config_vars.cc +20 -18
  103. data/src/core/lib/config/config_vars.h +4 -4
  104. data/src/core/lib/config/load_config.cc +13 -0
  105. data/src/core/lib/config/load_config.h +6 -0
  106. data/src/core/lib/debug/event_log.h +1 -1
  107. data/src/core/lib/debug/stats_data.h +1 -1
  108. data/src/core/lib/debug/trace.cc +24 -55
  109. data/src/core/lib/debug/trace.h +3 -1
  110. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +211 -0
  111. data/src/core/lib/event_engine/cf_engine/cf_engine.h +86 -0
  112. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +354 -0
  113. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +146 -0
  114. data/src/core/lib/event_engine/cf_engine/cftype_unique_ref.h +79 -0
  115. data/src/core/lib/event_engine/default_event_engine.cc +13 -1
  116. data/src/core/lib/event_engine/default_event_engine_factory.cc +14 -2
  117. data/src/core/lib/event_engine/poller.h +2 -2
  118. data/src/core/lib/event_engine/posix.h +4 -0
  119. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +1 -1
  120. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +7 -18
  121. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -0
  122. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +3 -2
  123. data/src/core/lib/event_engine/posix_engine/posix_engine.h +1 -2
  124. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +4 -33
  125. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +7 -11
  126. data/src/core/lib/event_engine/posix_engine/timer_manager.h +1 -1
  127. data/src/core/lib/event_engine/shim.cc +7 -1
  128. data/src/core/lib/event_engine/{thread_pool.cc → thread_pool/original_thread_pool.cc} +28 -25
  129. data/src/core/lib/event_engine/{thread_pool.h → thread_pool/original_thread_pool.h} +11 -15
  130. data/src/core/lib/event_engine/thread_pool/thread_pool.h +50 -0
  131. data/src/core/lib/event_engine/{executor/executor.h → thread_pool/thread_pool_factory.cc} +17 -15
  132. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +489 -0
  133. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +249 -0
  134. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.cc +166 -0
  135. data/src/core/lib/event_engine/thready_event_engine/thready_event_engine.h +108 -0
  136. data/src/core/lib/event_engine/windows/iocp.cc +4 -3
  137. data/src/core/lib/event_engine/windows/iocp.h +3 -3
  138. data/src/core/lib/event_engine/windows/win_socket.cc +6 -6
  139. data/src/core/lib/event_engine/windows/win_socket.h +4 -4
  140. data/src/core/lib/event_engine/windows/windows_endpoint.cc +11 -10
  141. data/src/core/lib/event_engine/windows/windows_endpoint.h +3 -2
  142. data/src/core/lib/event_engine/windows/windows_engine.cc +19 -17
  143. data/src/core/lib/event_engine/windows/windows_engine.h +6 -6
  144. data/src/core/lib/event_engine/windows/windows_listener.cc +3 -3
  145. data/src/core/lib/event_engine/windows/windows_listener.h +3 -2
  146. data/src/core/lib/event_engine/work_queue/basic_work_queue.cc +63 -0
  147. data/src/core/lib/event_engine/work_queue/basic_work_queue.h +71 -0
  148. data/src/core/lib/event_engine/work_queue/work_queue.h +62 -0
  149. data/src/core/lib/experiments/config.cc +38 -7
  150. data/src/core/lib/experiments/config.h +16 -0
  151. data/src/core/lib/experiments/experiments.cc +67 -20
  152. data/src/core/lib/experiments/experiments.h +27 -21
  153. data/src/core/lib/gpr/log_internal.h +55 -0
  154. data/src/core/lib/gprpp/crash.cc +10 -0
  155. data/src/core/lib/gprpp/crash.h +3 -0
  156. data/src/core/lib/gprpp/per_cpu.cc +33 -0
  157. data/src/core/lib/gprpp/per_cpu.h +29 -6
  158. data/src/core/lib/gprpp/time.cc +1 -0
  159. data/src/core/lib/iomgr/cfstream_handle.cc +1 -1
  160. data/src/core/lib/iomgr/endpoint_cfstream.cc +10 -8
  161. data/src/core/lib/iomgr/ev_apple.cc +12 -12
  162. data/src/core/lib/iomgr/ev_epoll1_linux.cc +10 -3
  163. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +15 -1
  164. data/src/core/lib/iomgr/iocp_windows.cc +24 -3
  165. data/src/core/lib/iomgr/iocp_windows.h +11 -0
  166. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +1 -1
  167. data/src/core/lib/iomgr/socket_utils_common_posix.cc +4 -2
  168. data/src/core/lib/iomgr/socket_windows.cc +61 -7
  169. data/src/core/lib/iomgr/socket_windows.h +9 -2
  170. data/src/core/lib/iomgr/tcp_client_cfstream.cc +14 -3
  171. data/src/core/lib/iomgr/tcp_server_posix.cc +156 -140
  172. data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -13
  173. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +0 -21
  174. data/src/core/lib/iomgr/tcp_server_windows.cc +1 -1
  175. data/src/core/lib/json/json.h +2 -166
  176. data/src/core/lib/json/json_object_loader.cc +8 -9
  177. data/src/core/lib/json/json_object_loader.h +25 -18
  178. data/src/core/lib/json/json_reader.cc +13 -6
  179. data/src/core/lib/json/json_util.cc +6 -11
  180. data/src/core/lib/json/json_writer.cc +7 -8
  181. data/src/core/lib/load_balancing/lb_policy.h +13 -0
  182. data/src/core/lib/load_balancing/lb_policy_registry.cc +2 -1
  183. data/src/core/lib/matchers/matchers.cc +3 -4
  184. data/src/core/lib/matchers/matchers.h +2 -1
  185. data/src/core/lib/promise/activity.cc +5 -0
  186. data/src/core/lib/promise/activity.h +10 -0
  187. data/src/core/lib/promise/detail/promise_factory.h +1 -1
  188. data/src/core/lib/promise/party.cc +31 -13
  189. data/src/core/lib/promise/party.h +11 -2
  190. data/src/core/lib/promise/pipe.h +9 -2
  191. data/src/core/lib/promise/prioritized_race.h +95 -0
  192. data/src/core/lib/promise/sleep.cc +2 -1
  193. data/src/core/lib/resolver/server_address.cc +0 -8
  194. data/src/core/lib/resolver/server_address.h +0 -6
  195. data/src/core/lib/resource_quota/memory_quota.cc +7 -7
  196. data/src/core/lib/resource_quota/memory_quota.h +1 -2
  197. data/src/core/lib/security/authorization/audit_logging.cc +98 -0
  198. data/src/core/lib/security/authorization/audit_logging.h +73 -0
  199. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +47 -2
  200. data/src/core/lib/security/authorization/grpc_authorization_engine.h +18 -1
  201. data/src/core/lib/security/authorization/rbac_policy.cc +36 -4
  202. data/src/core/lib/security/authorization/rbac_policy.h +19 -2
  203. data/src/core/lib/security/authorization/stdout_logger.cc +75 -0
  204. data/src/core/lib/security/authorization/stdout_logger.h +61 -0
  205. data/src/core/lib/security/certificate_provider/certificate_provider_factory.h +8 -4
  206. data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +8 -18
  207. data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +14 -8
  208. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +19 -12
  209. data/src/core/lib/security/credentials/external/external_account_credentials.cc +4 -2
  210. data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +1 -0
  211. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +1 -0
  212. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +1 -0
  213. data/src/core/lib/security/credentials/jwt/json_token.cc +15 -14
  214. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +4 -2
  215. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +1 -0
  216. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +1 -0
  217. data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +1 -5
  218. data/src/core/lib/security/util/json_util.cc +1 -0
  219. data/src/core/lib/service_config/service_config_call_data.h +49 -20
  220. data/src/core/lib/service_config/service_config_impl.cc +2 -1
  221. data/src/core/lib/surface/call.cc +38 -23
  222. data/src/core/lib/surface/completion_queue.cc +6 -2
  223. data/src/core/lib/surface/validate_metadata.cc +22 -37
  224. data/src/core/lib/surface/validate_metadata.h +3 -13
  225. data/src/core/lib/surface/version.cc +2 -2
  226. data/src/core/lib/transport/batch_builder.cc +15 -12
  227. data/src/core/lib/transport/batch_builder.h +39 -35
  228. data/src/core/plugin_registry/grpc_plugin_registry.cc +0 -2
  229. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  230. data/src/ruby/ext/grpc/extconf.rb +8 -9
  231. data/src/ruby/lib/grpc/version.rb +1 -1
  232. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_mbstr.c +9 -8
  233. data/third_party/boringssl-with-bazel/src/crypto/asn1/a_strnid.c +1 -1
  234. data/third_party/boringssl-with-bazel/src/crypto/asn1/internal.h +3 -3
  235. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_dec.c +10 -6
  236. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +7 -4
  237. data/third_party/boringssl-with-bazel/src/crypto/bio/bio.c +6 -4
  238. data/third_party/boringssl-with-bazel/src/crypto/bio/fd.c +2 -1
  239. data/third_party/boringssl-with-bazel/src/crypto/bio/file.c +5 -9
  240. data/third_party/boringssl-with-bazel/src/crypto/bio/pair.c +4 -2
  241. data/third_party/boringssl-with-bazel/src/crypto/blake2/blake2.c +31 -22
  242. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/e_tls.c +29 -26
  243. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/internal.h +8 -0
  244. data/third_party/boringssl-with-bazel/src/crypto/cipher_extra/tls_cbc.c +189 -13
  245. data/third_party/boringssl-with-bazel/src/crypto/cpu_aarch64_openbsd.c +62 -0
  246. data/third_party/boringssl-with-bazel/src/crypto/cpu_arm_openbsd.c +31 -0
  247. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519.c +6 -4
  248. data/third_party/boringssl-with-bazel/src/crypto/curve25519/curve25519_tables.h +795 -795
  249. data/third_party/boringssl-with-bazel/src/crypto/curve25519/internal.h +1 -5
  250. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +4 -0
  251. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/hash_to_curve.c +18 -6
  252. data/third_party/boringssl-with-bazel/src/crypto/ec_extra/internal.h +15 -7
  253. data/third_party/boringssl-with-bazel/src/crypto/ecdh_extra/ecdh_extra.c +1 -1
  254. data/third_party/boringssl-with-bazel/src/crypto/evp/p_rsa.c +1 -1
  255. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/bcm.c +1 -0
  256. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/dh/dh.c +3 -0
  257. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec.c +24 -24
  258. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_key.c +1 -1
  259. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/ec_montgomery.c +7 -7
  260. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h +74 -74
  261. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/oct.c +1 -2
  262. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p224-64.c +11 -11
  263. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256-nistz.c +12 -12
  264. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256.c +14 -15
  265. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/p256_table.h +1 -1
  266. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple.c +10 -10
  267. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/simple_mul.c +23 -23
  268. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/wnaf.c +13 -13
  269. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdh/ecdh.c +1 -1
  270. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +2 -2
  271. data/third_party/boringssl-with-bazel/src/crypto/{hkdf → fipsmodule/hkdf}/hkdf.c +1 -1
  272. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/cbc.c +2 -10
  273. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ctr.c +1 -4
  274. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm.c +115 -133
  275. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/gcm_nohw.c +12 -14
  276. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/internal.h +57 -47
  277. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/ofb.c +1 -8
  278. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/modes/polyval.c +27 -28
  279. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rand/urandom.c +11 -23
  280. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/internal.h +21 -16
  281. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/padding.c +5 -288
  282. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa.c +143 -83
  283. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/rsa/rsa_impl.c +95 -183
  284. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/self_check/self_check.c +71 -0
  285. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/internal.h +8 -0
  286. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/tls/kdf.c +33 -0
  287. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +162 -6
  288. data/third_party/boringssl-with-bazel/src/crypto/internal.h +18 -0
  289. data/third_party/boringssl-with-bazel/src/crypto/kyber/kyber.c +18 -11
  290. data/third_party/boringssl-with-bazel/src/crypto/obj/obj_dat.h +6 -13
  291. data/third_party/boringssl-with-bazel/src/crypto/pem/pem_lib.c +18 -14
  292. data/third_party/boringssl-with-bazel/src/crypto/{refcount_lock.c → refcount_no_threads.c} +3 -13
  293. data/third_party/boringssl-with-bazel/src/crypto/refcount_win.c +89 -0
  294. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/internal.h +77 -0
  295. data/third_party/boringssl-with-bazel/src/crypto/rsa_extra/rsa_crypt.c +568 -0
  296. data/third_party/boringssl-with-bazel/src/crypto/trust_token/internal.h +62 -0
  297. data/third_party/boringssl-with-bazel/src/crypto/trust_token/pmbtoken.c +218 -44
  298. data/third_party/boringssl-with-bazel/src/crypto/trust_token/trust_token.c +35 -0
  299. data/third_party/boringssl-with-bazel/src/crypto/trust_token/voprf.c +588 -39
  300. data/third_party/boringssl-with-bazel/src/crypto/x509/a_sign.c +27 -18
  301. data/third_party/boringssl-with-bazel/src/crypto/x509/asn1_gen.c +1 -1
  302. data/third_party/boringssl-with-bazel/src/crypto/x509/name_print.c +17 -39
  303. data/third_party/boringssl-with-bazel/src/crypto/x509/t_x509.c +39 -48
  304. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_att.c +0 -140
  305. data/third_party/boringssl-with-bazel/src/crypto/x509/x509_req.c +72 -23
  306. data/third_party/boringssl-with-bazel/src/crypto/x509/x509name.c +11 -14
  307. data/third_party/boringssl-with-bazel/src/crypto/x509/x509spki.c +1 -1
  308. data/third_party/boringssl-with-bazel/src/crypto/x509/x_x509a.c +2 -2
  309. data/third_party/boringssl-with-bazel/src/crypto/x509v3/internal.h +1 -1
  310. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_conf.c +33 -46
  311. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_cpols.c +1 -0
  312. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_info.c +3 -5
  313. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_lib.c +14 -46
  314. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_prn.c +14 -26
  315. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_skey.c +17 -10
  316. data/third_party/boringssl-with-bazel/src/crypto/x509v3/v3_utl.c +1 -1
  317. data/third_party/boringssl-with-bazel/src/include/openssl/aead.h +5 -7
  318. data/third_party/boringssl-with-bazel/src/include/openssl/asn1.h +6 -4
  319. data/third_party/boringssl-with-bazel/src/include/openssl/base.h +32 -1
  320. data/third_party/boringssl-with-bazel/src/include/openssl/bio.h +0 -4
  321. data/third_party/boringssl-with-bazel/src/include/openssl/blake2.h +1 -4
  322. data/third_party/boringssl-with-bazel/src/include/openssl/evp.h +3 -3
  323. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +28 -0
  324. data/third_party/boringssl-with-bazel/src/include/openssl/nid.h +2 -11
  325. data/third_party/boringssl-with-bazel/src/include/openssl/pem.h +0 -3
  326. data/third_party/boringssl-with-bazel/src/include/openssl/rsa.h +91 -1
  327. data/third_party/boringssl-with-bazel/src/include/openssl/span.h +5 -0
  328. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +149 -20
  329. data/third_party/boringssl-with-bazel/src/include/openssl/thread.h +4 -0
  330. data/third_party/boringssl-with-bazel/src/include/openssl/tls1.h +4 -0
  331. data/third_party/boringssl-with-bazel/src/include/openssl/trust_token.h +8 -0
  332. data/third_party/boringssl-with-bazel/src/include/openssl/x509.h +774 -615
  333. data/third_party/boringssl-with-bazel/src/include/openssl/x509v3.h +42 -10
  334. data/third_party/boringssl-with-bazel/src/ssl/encrypted_client_hello.cc +11 -6
  335. data/third_party/boringssl-with-bazel/src/ssl/extensions.cc +2 -4
  336. data/third_party/boringssl-with-bazel/src/ssl/handshake_client.cc +24 -16
  337. data/third_party/boringssl-with-bazel/src/ssl/internal.h +65 -18
  338. data/third_party/boringssl-with-bazel/src/ssl/s3_both.cc +37 -18
  339. data/third_party/boringssl-with-bazel/src/ssl/ssl_cipher.cc +187 -193
  340. data/third_party/boringssl-with-bazel/src/ssl/ssl_key_share.cc +13 -129
  341. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +85 -10
  342. data/third_party/boringssl-with-bazel/src/ssl/ssl_privkey.cc +17 -4
  343. data/third_party/boringssl-with-bazel/src/ssl/ssl_versions.cc +27 -19
  344. data/third_party/boringssl-with-bazel/src/ssl/tls13_client.cc +1 -1
  345. data/third_party/boringssl-with-bazel/src/ssl/tls13_enc.cc +5 -21
  346. data/third_party/boringssl-with-bazel/src/ssl/tls13_server.cc +5 -2
  347. data/third_party/boringssl-with-bazel/src/third_party/fiat/curve25519_64_msvc.h +1281 -0
  348. data/third_party/boringssl-with-bazel/src/third_party/fiat/p256_64_msvc.h +2002 -0
  349. data/third_party/cares/cares/include/ares.h +23 -1
  350. data/third_party/cares/cares/{src/lib → include}/ares_nameser.h +9 -7
  351. data/third_party/cares/cares/include/ares_rules.h +2 -2
  352. data/third_party/cares/cares/include/ares_version.h +3 -3
  353. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +266 -0
  354. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +240 -0
  355. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +49 -80
  356. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +37 -43
  357. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +12 -4
  358. data/third_party/cares/cares/src/lib/ares_data.c +16 -0
  359. data/third_party/cares/cares/src/lib/ares_data.h +7 -0
  360. data/third_party/cares/cares/src/lib/ares_destroy.c +8 -0
  361. data/third_party/cares/cares/src/lib/ares_expand_name.c +17 -6
  362. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +1 -0
  363. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +156 -78
  364. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +130 -326
  365. data/third_party/cares/cares/src/lib/ares_init.c +97 -485
  366. data/third_party/cares/cares/src/lib/ares_library_init.c +2 -89
  367. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +23 -142
  368. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +22 -142
  369. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +184 -0
  370. data/third_party/cares/cares/src/lib/ares_private.h +30 -16
  371. data/third_party/cares/cares/src/lib/ares_process.c +55 -16
  372. data/third_party/cares/cares/src/lib/ares_query.c +1 -35
  373. data/third_party/cares/cares/src/lib/ares_rand.c +279 -0
  374. data/third_party/cares/cares/src/lib/ares_send.c +5 -7
  375. data/third_party/cares/cares/src/lib/ares_strdup.c +12 -19
  376. data/third_party/cares/cares/src/lib/ares_strsplit.c +44 -128
  377. data/third_party/cares/cares/src/lib/ares_strsplit.h +9 -10
  378. data/third_party/cares/cares/src/lib/inet_net_pton.c +78 -116
  379. data/third_party/cares/cares/src/tools/ares_getopt.h +53 -0
  380. metadata +50 -16
  381. data/src/core/ext/filters/client_channel/health/health_check_client.cc +0 -175
  382. data/src/core/ext/filters/client_channel/health/health_check_client.h +0 -43
  383. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.cc +0 -176
  384. data/src/core/ext/transport/chttp2/transport/hpack_parse_result.h +0 -325
  385. data/third_party/cares/cares/src/lib/ares_library_init.h +0 -43
@@ -0,0 +1,211 @@
1
+ // Copyright 2023 The gRPC Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <grpc/support/port_platform.h>
16
+
17
+ #ifdef GPR_APPLE
18
+
19
+ #include <CoreFoundation/CoreFoundation.h>
20
+
21
+ #include <grpc/support/cpu.h>
22
+
23
+ #include "src/core/lib/event_engine/cf_engine/cf_engine.h"
24
+ #include "src/core/lib/event_engine/cf_engine/cfstream_endpoint.h"
25
+ #include "src/core/lib/event_engine/posix_engine/timer_manager.h"
26
+ #include "src/core/lib/event_engine/tcp_socket_utils.h"
27
+ #include "src/core/lib/event_engine/thread_pool/thread_pool.h"
28
+ #include "src/core/lib/event_engine/trace.h"
29
+ #include "src/core/lib/event_engine/utils.h"
30
+ #include "src/core/lib/gprpp/crash.h"
31
+
32
+ namespace grpc_event_engine {
33
+ namespace experimental {
34
+
35
+ struct CFEventEngine::Closure final : public EventEngine::Closure {
36
+ absl::AnyInvocable<void()> cb;
37
+ Timer timer;
38
+ CFEventEngine* engine;
39
+ EventEngine::TaskHandle handle;
40
+
41
+ void Run() override {
42
+ GRPC_EVENT_ENGINE_TRACE("CFEventEngine:%p executing callback:%s", engine,
43
+ HandleToString(handle).c_str());
44
+ {
45
+ grpc_core::MutexLock lock(&engine->task_mu_);
46
+ engine->known_handles_.erase(handle);
47
+ }
48
+ cb();
49
+ delete this;
50
+ }
51
+ };
52
+
53
+ CFEventEngine::CFEventEngine()
54
+ : thread_pool_(
55
+ MakeThreadPool(grpc_core::Clamp(gpr_cpu_num_cores(), 2u, 16u))),
56
+ timer_manager_(thread_pool_) {}
57
+
58
+ CFEventEngine::~CFEventEngine() {
59
+ {
60
+ grpc_core::MutexLock lock(&task_mu_);
61
+ if (GRPC_TRACE_FLAG_ENABLED(grpc_event_engine_trace)) {
62
+ for (auto handle : known_handles_) {
63
+ gpr_log(GPR_ERROR,
64
+ "CFEventEngine:%p uncleared TaskHandle at shutdown:%s", this,
65
+ HandleToString(handle).c_str());
66
+ }
67
+ }
68
+ GPR_ASSERT(GPR_LIKELY(known_handles_.empty()));
69
+ timer_manager_.Shutdown();
70
+ }
71
+ thread_pool_->Quiesce();
72
+ }
73
+
74
+ absl::StatusOr<std::unique_ptr<EventEngine::Listener>>
75
+ CFEventEngine::CreateListener(
76
+ Listener::AcceptCallback /* on_accept */,
77
+ absl::AnyInvocable<void(absl::Status)> /* on_shutdown */,
78
+ const EndpointConfig& /* config */,
79
+ std::unique_ptr<MemoryAllocatorFactory> /* memory_allocator_factory */) {
80
+ grpc_core::Crash("unimplemented");
81
+ }
82
+
83
+ CFEventEngine::ConnectionHandle CFEventEngine::Connect(
84
+ OnConnectCallback on_connect, const ResolvedAddress& addr,
85
+ const EndpointConfig& /* args */, MemoryAllocator memory_allocator,
86
+ Duration timeout) {
87
+ auto endpoint_ptr = new CFStreamEndpoint(
88
+ std::static_pointer_cast<CFEventEngine>(shared_from_this()),
89
+ std::move(memory_allocator));
90
+
91
+ ConnectionHandle handle{reinterpret_cast<intptr_t>(endpoint_ptr), 0};
92
+ {
93
+ grpc_core::MutexLock lock(&conn_mu_);
94
+ conn_handles_.insert(handle);
95
+ }
96
+
97
+ auto deadline_timer =
98
+ RunAfter(timeout, [handle, that = std::static_pointer_cast<CFEventEngine>(
99
+ shared_from_this())]() {
100
+ that->CancelConnectInternal(
101
+ handle, absl::DeadlineExceededError("Connect timed out"));
102
+ });
103
+
104
+ auto on_connect2 =
105
+ [that = std::static_pointer_cast<CFEventEngine>(shared_from_this()),
106
+ deadline_timer, handle,
107
+ on_connect = std::move(on_connect)](absl::Status status) mutable {
108
+ // best effort canceling deadline timer
109
+ that->Cancel(deadline_timer);
110
+
111
+ {
112
+ grpc_core::MutexLock lock(&that->conn_mu_);
113
+ that->conn_handles_.erase(handle);
114
+ }
115
+
116
+ auto endpoint_ptr = reinterpret_cast<CFStreamEndpoint*>(handle.keys[0]);
117
+
118
+ if (!status.ok()) {
119
+ on_connect(std::move(status));
120
+ delete endpoint_ptr;
121
+ return;
122
+ }
123
+
124
+ on_connect(std::unique_ptr<EventEngine::Endpoint>(endpoint_ptr));
125
+ };
126
+
127
+ endpoint_ptr->Connect(std::move(on_connect2), addr);
128
+
129
+ return handle;
130
+ }
131
+
132
+ bool CFEventEngine::CancelConnect(ConnectionHandle handle) {
133
+ CancelConnectInternal(handle, absl::CancelledError("CancelConnect"));
134
+ // on_connect will always be called, even if cancellation is successful
135
+ return false;
136
+ }
137
+
138
+ bool CFEventEngine::CancelConnectInternal(ConnectionHandle handle,
139
+ absl::Status status) {
140
+ grpc_core::MutexLock lock(&conn_mu_);
141
+
142
+ if (!conn_handles_.contains(handle)) {
143
+ GRPC_EVENT_ENGINE_TRACE(
144
+ "Unknown connection handle: %s",
145
+ HandleToString<EventEngine::ConnectionHandle>(handle).c_str());
146
+ return false;
147
+ }
148
+ conn_handles_.erase(handle);
149
+
150
+ // keep the `conn_mu_` lock to prevent endpoint_ptr from being deleted
151
+
152
+ auto endpoint_ptr = reinterpret_cast<CFStreamEndpoint*>(handle.keys[0]);
153
+ return endpoint_ptr->CancelConnect(status);
154
+ }
155
+
156
+ bool CFEventEngine::IsWorkerThread() { grpc_core::Crash("unimplemented"); }
157
+
158
+ std::unique_ptr<EventEngine::DNSResolver> CFEventEngine::GetDNSResolver(
159
+ const DNSResolver::ResolverOptions& /* options */) {
160
+ grpc_core::Crash("unimplemented");
161
+ }
162
+
163
+ void CFEventEngine::Run(EventEngine::Closure* closure) {
164
+ thread_pool_->Run(closure);
165
+ }
166
+
167
+ void CFEventEngine::Run(absl::AnyInvocable<void()> closure) {
168
+ thread_pool_->Run(std::move(closure));
169
+ }
170
+
171
+ EventEngine::TaskHandle CFEventEngine::RunAfter(Duration when,
172
+ EventEngine::Closure* closure) {
173
+ return RunAfterInternal(when, [closure]() { closure->Run(); });
174
+ }
175
+
176
+ EventEngine::TaskHandle CFEventEngine::RunAfter(
177
+ Duration when, absl::AnyInvocable<void()> closure) {
178
+ return RunAfterInternal(when, std::move(closure));
179
+ }
180
+
181
+ bool CFEventEngine::Cancel(TaskHandle handle) {
182
+ grpc_core::MutexLock lock(&task_mu_);
183
+ if (!known_handles_.contains(handle)) return false;
184
+ auto* cd = reinterpret_cast<Closure*>(handle.keys[0]);
185
+ bool r = timer_manager_.TimerCancel(&cd->timer);
186
+ known_handles_.erase(handle);
187
+ if (r) delete cd;
188
+ return r;
189
+ }
190
+
191
+ EventEngine::TaskHandle CFEventEngine::RunAfterInternal(
192
+ Duration when, absl::AnyInvocable<void()> cb) {
193
+ auto when_ts = ToTimestamp(timer_manager_.Now(), when);
194
+ auto* cd = new Closure;
195
+ cd->cb = std::move(cb);
196
+ cd->engine = this;
197
+ EventEngine::TaskHandle handle{reinterpret_cast<intptr_t>(cd),
198
+ aba_token_.fetch_add(1)};
199
+ grpc_core::MutexLock lock(&task_mu_);
200
+ known_handles_.insert(handle);
201
+ cd->handle = handle;
202
+ GRPC_EVENT_ENGINE_TRACE("CFEventEngine:%p scheduling callback:%s", this,
203
+ HandleToString(handle).c_str());
204
+ timer_manager_.TimerInit(&cd->timer, when_ts, cd);
205
+ return handle;
206
+ }
207
+
208
+ } // namespace experimental
209
+ } // namespace grpc_event_engine
210
+
211
+ #endif // GPR_APPLE
@@ -0,0 +1,86 @@
1
+ // Copyright 2023 The gRPC Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ #ifndef GRPC_SRC_CORE_LIB_EVENT_ENGINE_CF_ENGINE_CF_ENGINE_H
15
+ #define GRPC_SRC_CORE_LIB_EVENT_ENGINE_CF_ENGINE_CF_ENGINE_H
16
+ #include <grpc/support/port_platform.h>
17
+
18
+ #ifdef GPR_APPLE
19
+
20
+ #include <grpc/event_engine/event_engine.h>
21
+
22
+ #include "src/core/lib/event_engine/handle_containers.h"
23
+ #include "src/core/lib/event_engine/posix_engine/event_poller.h"
24
+ #include "src/core/lib/event_engine/posix_engine/lockfree_event.h"
25
+ #include "src/core/lib/event_engine/posix_engine/posix_engine_closure.h"
26
+ #include "src/core/lib/event_engine/posix_engine/timer_manager.h"
27
+ #include "src/core/lib/gprpp/sync.h"
28
+ #include "src/core/lib/surface/init_internally.h"
29
+
30
+ namespace grpc_event_engine {
31
+ namespace experimental {
32
+
33
+ class CFEventEngine : public EventEngine,
34
+ public Scheduler,
35
+ public grpc_core::KeepsGrpcInitialized {
36
+ public:
37
+ CFEventEngine();
38
+ ~CFEventEngine() override;
39
+
40
+ absl::StatusOr<std::unique_ptr<Listener>> CreateListener(
41
+ Listener::AcceptCallback on_accept,
42
+ absl::AnyInvocable<void(absl::Status)> on_shutdown,
43
+ const EndpointConfig& config,
44
+ std::unique_ptr<MemoryAllocatorFactory> memory_allocator_factory)
45
+ override;
46
+
47
+ ConnectionHandle Connect(OnConnectCallback on_connect,
48
+ const ResolvedAddress& addr,
49
+ const EndpointConfig& args,
50
+ MemoryAllocator memory_allocator,
51
+ Duration timeout) override;
52
+ bool CancelConnect(ConnectionHandle handle) override;
53
+ bool IsWorkerThread() override;
54
+ std::unique_ptr<DNSResolver> GetDNSResolver(
55
+ const DNSResolver::ResolverOptions& options) override;
56
+ void Run(Closure* closure) override;
57
+ void Run(absl::AnyInvocable<void()> closure) override;
58
+ TaskHandle RunAfter(Duration when, Closure* closure) override;
59
+ TaskHandle RunAfter(Duration when,
60
+ absl::AnyInvocable<void()> closure) override;
61
+ bool Cancel(TaskHandle handle) override;
62
+
63
+ private:
64
+ struct Closure;
65
+ EventEngine::TaskHandle RunAfterInternal(Duration when,
66
+ absl::AnyInvocable<void()> cb);
67
+
68
+ bool CancelConnectInternal(ConnectionHandle handle, absl::Status status);
69
+
70
+ grpc_core::Mutex task_mu_;
71
+ TaskHandleSet known_handles_ ABSL_GUARDED_BY(task_mu_);
72
+ std::atomic<intptr_t> aba_token_{0};
73
+
74
+ grpc_core::Mutex conn_mu_;
75
+ ConnectionHandleSet conn_handles_ ABSL_GUARDED_BY(conn_mu_);
76
+
77
+ std::shared_ptr<ThreadPool> thread_pool_;
78
+ TimerManager timer_manager_;
79
+ };
80
+
81
+ } // namespace experimental
82
+ } // namespace grpc_event_engine
83
+
84
+ #endif // GPR_APPLE
85
+
86
+ #endif // GRPC_SRC_CORE_LIB_EVENT_ENGINE_CF_ENGINE_CF_ENGINE_H
@@ -0,0 +1,354 @@
1
+ // Copyright 2023 The gRPC Authors
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+
15
+ #include <grpc/support/port_platform.h>
16
+
17
+ #ifdef GPR_APPLE
18
+
19
+ #include "src/core/lib/event_engine/cf_engine/cfstream_endpoint.h"
20
+ #include "src/core/lib/event_engine/trace.h"
21
+ #include "src/core/lib/gprpp/strerror.h"
22
+
23
+ namespace grpc_event_engine {
24
+ namespace experimental {
25
+
26
+ namespace {
27
+
28
+ int kDefaultReadBufferSize = 8192;
29
+
30
+ absl::Status CFErrorToStatus(CFTypeUniqueRef<CFErrorRef> cf_error) {
31
+ if (cf_error == nullptr) {
32
+ return absl::OkStatus();
33
+ }
34
+ CFErrorDomain cf_domain = CFErrorGetDomain((cf_error));
35
+ CFIndex code = CFErrorGetCode((cf_error));
36
+ CFTypeUniqueRef<CFStringRef> cf_desc = CFErrorCopyDescription((cf_error));
37
+ char domain_buf[256];
38
+ char desc_buf[256];
39
+ CFStringGetCString(cf_domain, domain_buf, 256, kCFStringEncodingUTF8);
40
+ CFStringGetCString(cf_desc, desc_buf, 256, kCFStringEncodingUTF8);
41
+ return absl::Status(absl::StatusCode::kUnknown,
42
+ absl::StrFormat("(domain:%s, code:%ld, description:%s)",
43
+ domain_buf, code, desc_buf));
44
+ }
45
+
46
+ absl::StatusOr<EventEngine::ResolvedAddress> CFReadStreamLocallAddress(
47
+ CFReadStreamRef stream) {
48
+ CFTypeUniqueRef<CFDataRef> cf_native_handle = static_cast<CFDataRef>(
49
+ CFReadStreamCopyProperty(stream, kCFStreamPropertySocketNativeHandle));
50
+ CFSocketNativeHandle socket;
51
+ CFDataGetBytes(cf_native_handle, CFRangeMake(0, sizeof(CFSocketNativeHandle)),
52
+ (UInt8*)&socket);
53
+ EventEngine::ResolvedAddress addr;
54
+ socklen_t len = EventEngine::ResolvedAddress::MAX_SIZE_BYTES;
55
+ if (getsockname(socket, const_cast<sockaddr*>(addr.address()), &len) < 0) {
56
+ return absl::InternalError(
57
+ absl::StrCat("getsockname:", grpc_core::StrError(errno)));
58
+ }
59
+ return EventEngine::ResolvedAddress(addr.address(), len);
60
+ }
61
+
62
+ } // namespace
63
+
64
+ bool CFStreamEndpointImpl::CancelConnect(absl::Status status) {
65
+ GRPC_EVENT_ENGINE_ENDPOINT_TRACE(
66
+ "CFStreamEndpointImpl::CancelConnect: status: %s, this: %p",
67
+ status.ToString().c_str(), this);
68
+
69
+ return open_event_.SetShutdown(std::move(status));
70
+ }
71
+
72
+ void CFStreamEndpointImpl::Connect(
73
+ absl::AnyInvocable<void(absl::Status)> on_connect,
74
+ EventEngine::ResolvedAddress addr) {
75
+ auto addr_uri = ResolvedAddressToURI(addr);
76
+
77
+ if (!addr_uri.ok()) {
78
+ on_connect(std::move(addr_uri).status());
79
+ return;
80
+ }
81
+
82
+ GRPC_EVENT_ENGINE_ENDPOINT_TRACE("CFStreamEndpointImpl::Connect: %s",
83
+ addr_uri.value().c_str());
84
+
85
+ peer_address_ = std::move(addr);
86
+ auto host_port = ResolvedAddressToNormalizedString(peer_address_);
87
+ if (!host_port.ok()) {
88
+ on_connect(std::move(host_port).status());
89
+ return;
90
+ }
91
+
92
+ peer_address_string_ = host_port.value();
93
+ GRPC_EVENT_ENGINE_ENDPOINT_TRACE(
94
+ "CFStreamEndpointImpl::Connect, host_port: %s", host_port->c_str());
95
+
96
+ std::string host_string;
97
+ std::string port_string;
98
+ grpc_core::SplitHostPort(host_port.value(), &host_string, &port_string);
99
+ CFStringRef host = CFStringCreateWithCString(NULL, host_string.c_str(),
100
+ kCFStringEncodingUTF8);
101
+ int port = ResolvedAddressGetPort(peer_address_);
102
+ CFStreamCreatePairWithSocketToHost(NULL, host, port, &cf_read_stream_,
103
+ &cf_write_stream_);
104
+
105
+ CFStreamClientContext cf_context = {0, this, Retain, Release, nullptr};
106
+ CFReadStreamSetClient(
107
+ cf_read_stream_,
108
+ kCFStreamEventOpenCompleted | kCFStreamEventHasBytesAvailable |
109
+ kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
110
+ ReadCallback, &cf_context);
111
+ CFWriteStreamSetClient(
112
+ cf_write_stream_,
113
+ kCFStreamEventOpenCompleted | kCFStreamEventCanAcceptBytes |
114
+ kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered,
115
+ WriteCallback, &cf_context);
116
+ CFReadStreamSetDispatchQueue(cf_read_stream_,
117
+ dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0));
118
+ CFWriteStreamSetDispatchQueue(
119
+ cf_write_stream_, dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0));
120
+
121
+ if (!CFReadStreamOpen(cf_read_stream_)) {
122
+ auto status = CFErrorToStatus(CFReadStreamCopyError(cf_read_stream_));
123
+ on_connect(std::move(status));
124
+ return;
125
+ }
126
+
127
+ if (!CFWriteStreamOpen(cf_write_stream_)) {
128
+ auto status = CFErrorToStatus(CFWriteStreamCopyError(cf_write_stream_));
129
+ on_connect(std::move(status));
130
+ return;
131
+ }
132
+
133
+ open_event_.NotifyOn(new PosixEngineClosure(
134
+ [that = Ref(),
135
+ on_connect = std::move(on_connect)](absl::Status status) mutable {
136
+ if (!status.ok()) {
137
+ on_connect(std::move(status));
138
+ return;
139
+ }
140
+
141
+ auto local_addr = CFReadStreamLocallAddress(that->cf_read_stream_);
142
+ if (!local_addr.ok()) {
143
+ on_connect(std::move(local_addr).status());
144
+ return;
145
+ }
146
+
147
+ that->local_address_ = local_addr.value();
148
+ that->local_address_string_ =
149
+ *ResolvedAddressToURI(that->local_address_);
150
+ on_connect(absl::OkStatus());
151
+ },
152
+ false /* is_permanent */));
153
+ }
154
+
155
+ /* static */ void CFStreamEndpointImpl::ReadCallback(
156
+ CFReadStreamRef stream, CFStreamEventType type,
157
+ void* client_callback_info) {
158
+ auto self = static_cast<CFStreamEndpointImpl*>(client_callback_info);
159
+
160
+ GRPC_EVENT_ENGINE_ENDPOINT_TRACE(
161
+ "CFStreamEndpointImpl::ReadCallback, type: %lu, this: %p", type, self);
162
+
163
+ switch (type) {
164
+ case kCFStreamEventOpenCompleted:
165
+ // wait for write stream open completed to signal connection ready
166
+ break;
167
+ case kCFStreamEventHasBytesAvailable:
168
+ ABSL_FALLTHROUGH_INTENDED;
169
+ case kCFStreamEventEndEncountered:
170
+ self->read_event_.SetReady();
171
+ break;
172
+ case kCFStreamEventErrorOccurred: {
173
+ auto status = CFErrorToStatus(CFReadStreamCopyError(stream));
174
+ GRPC_EVENT_ENGINE_ENDPOINT_TRACE("CFStream Read error: %s",
175
+ status.ToString().c_str());
176
+
177
+ self->open_event_.SetShutdown(status);
178
+ self->read_event_.SetShutdown(status);
179
+ self->write_event_.SetShutdown(status);
180
+ } break;
181
+ default:
182
+ GPR_UNREACHABLE_CODE(return);
183
+ }
184
+ }
185
+
186
+ /* static */
187
+ void CFStreamEndpointImpl::WriteCallback(CFWriteStreamRef stream,
188
+ CFStreamEventType type,
189
+ void* client_callback_info) {
190
+ auto self = static_cast<CFStreamEndpointImpl*>(client_callback_info);
191
+ GRPC_EVENT_ENGINE_ENDPOINT_TRACE(
192
+ "CFStreamEndpointImpl::WriteCallback, type: %lu, this: %p", type, self);
193
+
194
+ switch (type) {
195
+ case kCFStreamEventOpenCompleted:
196
+ self->open_event_.SetReady();
197
+ break;
198
+ case kCFStreamEventCanAcceptBytes:
199
+ ABSL_FALLTHROUGH_INTENDED;
200
+ case kCFStreamEventEndEncountered:
201
+ self->write_event_.SetReady();
202
+ break;
203
+ case kCFStreamEventErrorOccurred: {
204
+ auto status = CFErrorToStatus(CFWriteStreamCopyError(stream));
205
+ GRPC_EVENT_ENGINE_ENDPOINT_TRACE("CFStream Write error: %s",
206
+ status.ToString().c_str());
207
+
208
+ self->open_event_.SetShutdown(status);
209
+ self->read_event_.SetShutdown(status);
210
+ self->write_event_.SetShutdown(status);
211
+ } break;
212
+ default:
213
+ GPR_UNREACHABLE_CODE(return);
214
+ }
215
+ }
216
+
217
+ CFStreamEndpointImpl::CFStreamEndpointImpl(
218
+ std::shared_ptr<CFEventEngine> engine, MemoryAllocator memory_allocator)
219
+ : engine_(std::move(engine)),
220
+ memory_allocator_(std::move(memory_allocator)),
221
+ open_event_(engine_.get()),
222
+ read_event_(engine_.get()),
223
+ write_event_(engine_.get()) {
224
+ open_event_.InitEvent();
225
+ read_event_.InitEvent();
226
+ write_event_.InitEvent();
227
+ }
228
+
229
+ CFStreamEndpointImpl::~CFStreamEndpointImpl() {
230
+ open_event_.DestroyEvent();
231
+ read_event_.DestroyEvent();
232
+ write_event_.DestroyEvent();
233
+ }
234
+
235
+ void CFStreamEndpointImpl::Shutdown() {
236
+ GRPC_EVENT_ENGINE_ENDPOINT_TRACE("CFStreamEndpointImpl::Shutdown: this: %p",
237
+ this);
238
+
239
+ auto shutdownStatus =
240
+ absl::Status(absl::StatusCode::kUnknown,
241
+ absl::StrFormat("Shutting down CFStreamEndpointImpl"));
242
+ open_event_.SetShutdown(shutdownStatus);
243
+ read_event_.SetShutdown(shutdownStatus);
244
+ write_event_.SetShutdown(shutdownStatus);
245
+
246
+ CFReadStreamSetClient(cf_read_stream_, kCFStreamEventNone, nullptr, nullptr);
247
+ CFWriteStreamSetClient(cf_write_stream_, kCFStreamEventNone, nullptr,
248
+ nullptr);
249
+ CFReadStreamClose(cf_read_stream_);
250
+ CFWriteStreamClose(cf_write_stream_);
251
+ }
252
+
253
+ bool CFStreamEndpointImpl::Read(
254
+ absl::AnyInvocable<void(absl::Status)> on_read, SliceBuffer* buffer,
255
+ const EventEngine::Endpoint::ReadArgs* /* args */) {
256
+ GRPC_EVENT_ENGINE_ENDPOINT_TRACE("CFStreamEndpointImpl::Read, this: %p",
257
+ this);
258
+
259
+ read_event_.NotifyOn(new PosixEngineClosure(
260
+ [that = Ref(), on_read = std::move(on_read),
261
+ buffer](absl::Status status) mutable {
262
+ if (status.ok()) {
263
+ that->DoRead(std::move(on_read), buffer);
264
+ } else {
265
+ on_read(status);
266
+ }
267
+ },
268
+ false /* is_permanent*/));
269
+
270
+ return false;
271
+ }
272
+
273
+ void CFStreamEndpointImpl::DoRead(
274
+ absl::AnyInvocable<void(absl::Status)> on_read, SliceBuffer* buffer) {
275
+ GRPC_EVENT_ENGINE_ENDPOINT_TRACE("CFStreamEndpointImpl::DoRead, this: %p",
276
+ this);
277
+
278
+ auto buffer_index = buffer->AppendIndexed(
279
+ Slice(memory_allocator_.MakeSlice(kDefaultReadBufferSize)));
280
+
281
+ CFIndex read_size = CFReadStreamRead(
282
+ cf_read_stream_,
283
+ internal::SliceCast<MutableSlice>(buffer->MutableSliceAt(buffer_index))
284
+ .begin(),
285
+ kDefaultReadBufferSize);
286
+
287
+ if (read_size < 0) {
288
+ auto status = CFErrorToStatus(CFReadStreamCopyError(cf_read_stream_));
289
+ GRPC_EVENT_ENGINE_ENDPOINT_TRACE("CFStream read error: %s, read_size: %ld",
290
+ status.ToString().c_str(), read_size);
291
+ on_read(status);
292
+ return;
293
+ }
294
+
295
+ buffer->RemoveLastNBytes(buffer->Length() - read_size);
296
+ on_read(absl::OkStatus());
297
+ }
298
+
299
+ bool CFStreamEndpointImpl::Write(
300
+ absl::AnyInvocable<void(absl::Status)> on_writable, SliceBuffer* data,
301
+ const EventEngine::Endpoint::WriteArgs* /* args */) {
302
+ GRPC_EVENT_ENGINE_ENDPOINT_TRACE("CFStreamEndpointImpl::Write, this: %p",
303
+ this);
304
+
305
+ write_event_.NotifyOn(new PosixEngineClosure(
306
+ [that = Ref(), on_writable = std::move(on_writable),
307
+ data](absl::Status status) mutable {
308
+ if (status.ok()) {
309
+ that->DoWrite(std::move(on_writable), data);
310
+ } else {
311
+ on_writable(status);
312
+ }
313
+ },
314
+ false /* is_permanent*/));
315
+
316
+ return false;
317
+ }
318
+
319
+ void CFStreamEndpointImpl::DoWrite(
320
+ absl::AnyInvocable<void(absl::Status)> on_writable, SliceBuffer* data) {
321
+ GRPC_EVENT_ENGINE_ENDPOINT_TRACE("CFStreamEndpointImpl::DoWrite, this: %p",
322
+ this);
323
+
324
+ size_t total_written_size = 0;
325
+ for (size_t i = 0; i < data->Count(); i++) {
326
+ auto slice = data->RefSlice(i);
327
+ size_t written_size =
328
+ CFWriteStreamWrite(cf_write_stream_, slice.begin(), slice.size());
329
+
330
+ total_written_size += written_size;
331
+ if (written_size < slice.size()) {
332
+ SliceBuffer written;
333
+ data->MoveFirstNBytesIntoSliceBuffer(total_written_size, written);
334
+
335
+ write_event_.NotifyOn(new PosixEngineClosure(
336
+ [that = Ref(), on_writable = std::move(on_writable),
337
+ data](absl::Status status) mutable {
338
+ if (status.ok()) {
339
+ that->DoWrite(std::move(on_writable), data);
340
+ } else {
341
+ on_writable(status);
342
+ }
343
+ },
344
+ false /* is_permanent*/));
345
+ return;
346
+ }
347
+ }
348
+ on_writable(absl::OkStatus());
349
+ }
350
+
351
+ } // namespace experimental
352
+ } // namespace grpc_event_engine
353
+
354
+ #endif // GPR_APPLE