grpc 1.73.0 → 1.74.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (499) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +38 -17
  3. data/include/grpc/create_channel_from_endpoint.h +54 -0
  4. data/include/grpc/credentials.h +11 -5
  5. data/include/grpc/event_engine/event_engine.h +74 -17
  6. data/include/grpc/grpc_posix.h +20 -1
  7. data/include/grpc/impl/channel_arg_names.h +2 -4
  8. data/include/grpc/module.modulemap +1 -0
  9. data/include/grpc/support/json.h +24 -0
  10. data/src/core/call/interception_chain.h +7 -11
  11. data/src/core/channelz/channel_trace.cc +213 -115
  12. data/src/core/channelz/channel_trace.h +380 -86
  13. data/src/core/channelz/channelz.cc +270 -181
  14. data/src/core/channelz/channelz.h +168 -55
  15. data/src/core/channelz/channelz_registry.cc +2 -1
  16. data/src/core/channelz/channelz_registry.h +24 -0
  17. data/src/core/channelz/property_list.cc +357 -0
  18. data/src/core/channelz/property_list.h +202 -0
  19. data/src/core/channelz/ztrace_collector.h +3 -2
  20. data/src/core/client_channel/backup_poller.cc +17 -2
  21. data/src/core/client_channel/client_channel.cc +17 -28
  22. data/src/core/client_channel/client_channel_filter.cc +19 -29
  23. data/src/core/client_channel/config_selector.h +8 -2
  24. data/src/core/client_channel/dynamic_filters.cc +5 -6
  25. data/src/core/client_channel/dynamic_filters.h +1 -1
  26. data/src/core/client_channel/global_subchannel_pool.cc +4 -1
  27. data/src/core/client_channel/retry_filter.cc +21 -27
  28. data/src/core/client_channel/retry_filter.h +10 -7
  29. data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
  30. data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
  31. data/src/core/client_channel/retry_interceptor.cc +30 -44
  32. data/src/core/client_channel/retry_interceptor.h +18 -17
  33. data/src/core/client_channel/retry_throttle.cc +46 -61
  34. data/src/core/client_channel/retry_throttle.h +17 -39
  35. data/src/core/client_channel/subchannel.cc +43 -19
  36. data/src/core/client_channel/subchannel.h +8 -0
  37. data/src/core/config/config_vars.cc +2 -0
  38. data/src/core/config/core_configuration.cc +1 -0
  39. data/src/core/config/core_configuration.h +11 -0
  40. data/src/core/credentials/call/call_creds_registry.h +125 -0
  41. data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
  42. data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
  43. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
  44. data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
  45. data/src/core/credentials/call/jwt_util.cc +70 -0
  46. data/src/core/credentials/call/jwt_util.h +32 -0
  47. data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
  48. data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
  49. data/src/core/credentials/transport/ssl/ssl_credentials.cc +0 -1
  50. data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
  51. data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
  52. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
  53. data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
  54. data/src/core/ext/filters/http/client_authority_filter.cc +2 -4
  55. data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
  56. data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
  57. data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
  58. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
  59. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +162 -115
  60. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
  61. data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
  62. data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
  63. data/src/core/ext/transport/chttp2/transport/flow_control.h +22 -17
  64. data/src/core/ext/transport/chttp2/transport/frame.cc +10 -0
  65. data/src/core/ext/transport/chttp2/transport/frame.h +2 -2
  66. data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
  67. data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
  68. data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
  69. data/src/core/ext/transport/chttp2/transport/header_assembler.h +299 -0
  70. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
  71. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
  72. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
  73. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1017 -0
  74. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +593 -0
  75. data/src/core/ext/transport/chttp2/transport/http2_settings.h +19 -22
  76. data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
  77. data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
  78. data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
  79. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +43 -0
  80. data/src/core/ext/transport/chttp2/transport/http2_transport.h +65 -0
  81. data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
  82. data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
  83. data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
  84. data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
  85. data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
  86. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -4
  87. data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
  88. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +151 -0
  89. data/src/core/ext/transport/chttp2/transport/ping_promise.h +180 -0
  90. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
  91. data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
  92. data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
  93. data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
  94. data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
  95. data/src/core/ext/transport/chttp2/transport/writing.cc +37 -11
  96. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
  97. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
  98. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
  99. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
  100. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
  101. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
  102. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +984 -0
  103. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +226 -0
  104. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
  105. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
  106. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
  107. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +135 -0
  108. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
  109. data/src/core/filter/auth/auth_filters.h +0 -25
  110. data/src/core/filter/auth/client_auth_filter.cc +0 -118
  111. data/src/core/filter/filter_args.h +9 -23
  112. data/src/core/handshaker/handshaker.cc +23 -14
  113. data/src/core/handshaker/handshaker.h +3 -0
  114. data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
  115. data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -5
  116. data/src/core/handshaker/security/secure_endpoint.cc +70 -25
  117. data/src/core/handshaker/security/security_handshaker.cc +4 -1
  118. data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
  119. data/src/core/lib/channel/channel_args.cc +15 -0
  120. data/src/core/lib/channel/channel_args.h +3 -0
  121. data/src/core/lib/channel/channel_stack.cc +22 -23
  122. data/src/core/lib/channel/channel_stack.h +9 -7
  123. data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
  124. data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
  125. data/src/core/lib/channel/promise_based_filter.h +5 -5
  126. data/src/core/lib/debug/trace_impl.h +0 -1
  127. data/src/core/lib/event_engine/ares_resolver.cc +165 -46
  128. data/src/core/lib/event_engine/ares_resolver.h +48 -2
  129. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -1
  130. data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -4
  131. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +2 -6
  132. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
  133. data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
  134. data/src/core/lib/event_engine/event_engine.cc +7 -0
  135. data/src/core/lib/event_engine/extensions/channelz.h +10 -6
  136. data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
  137. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +130 -162
  138. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +11 -15
  139. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +75 -117
  140. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -9
  141. data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -15
  142. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +0 -18
  143. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
  144. data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
  145. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +29 -19
  146. data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
  147. data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
  148. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +145 -92
  149. data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
  150. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +333 -116
  151. data/src/core/lib/event_engine/posix_engine/posix_engine.h +61 -18
  152. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +45 -37
  153. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
  154. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
  155. data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
  156. data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
  157. data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
  158. data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
  159. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
  160. data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
  161. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
  162. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +10 -170
  163. data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
  164. data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
  165. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
  166. data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
  167. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
  168. data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
  169. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
  170. data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
  171. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
  172. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
  173. data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
  174. data/src/core/lib/event_engine/shim.cc +9 -0
  175. data/src/core/lib/event_engine/shim.h +3 -0
  176. data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
  177. data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
  178. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
  179. data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
  180. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +4 -0
  181. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
  182. data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
  183. data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
  184. data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
  185. data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
  186. data/src/core/lib/experiments/experiments.cc +45 -93
  187. data/src/core/lib/experiments/experiments.h +21 -51
  188. data/src/core/lib/iomgr/endpoint.cc +4 -3
  189. data/src/core/lib/iomgr/endpoint.h +7 -4
  190. data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
  191. data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
  192. data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
  193. data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
  194. data/src/core/lib/iomgr/tcp_posix.cc +12 -6
  195. data/src/core/lib/iomgr/tcp_windows.cc +3 -2
  196. data/src/core/lib/promise/activity.h +1 -0
  197. data/src/core/lib/promise/arena_promise.h +23 -7
  198. data/src/core/lib/promise/detail/promise_factory.h +10 -0
  199. data/src/core/lib/promise/detail/promise_like.h +118 -11
  200. data/src/core/lib/promise/detail/promise_variant.h +50 -0
  201. data/src/core/lib/promise/detail/seq_state.h +687 -548
  202. data/src/core/lib/promise/if.h +20 -0
  203. data/src/core/lib/promise/inter_activity_latch.h +147 -0
  204. data/src/core/lib/promise/inter_activity_mutex.h +547 -0
  205. data/src/core/lib/promise/loop.h +65 -3
  206. data/src/core/lib/promise/map.h +24 -0
  207. data/src/core/lib/promise/match_promise.h +103 -0
  208. data/src/core/lib/promise/mpsc.cc +425 -0
  209. data/src/core/lib/promise/mpsc.h +490 -0
  210. data/src/core/lib/promise/party.cc +50 -1
  211. data/src/core/lib/promise/party.h +66 -1
  212. data/src/core/lib/promise/race.h +31 -0
  213. data/src/core/lib/promise/seq.h +4 -1
  214. data/src/core/lib/promise/status_flag.h +7 -0
  215. data/src/core/lib/promise/try_seq.h +4 -1
  216. data/src/core/lib/promise/wait_set.cc +28 -0
  217. data/src/core/lib/promise/wait_set.h +86 -0
  218. data/src/core/lib/resource_quota/arena.h +19 -0
  219. data/src/core/lib/slice/slice.h +5 -0
  220. data/src/core/lib/surface/channel_create.cc +88 -13
  221. data/src/core/lib/surface/channel_create.h +4 -0
  222. data/src/core/lib/surface/channel_init.cc +164 -47
  223. data/src/core/lib/surface/channel_init.h +64 -1
  224. data/src/core/lib/surface/filter_stack_call.cc +18 -9
  225. data/src/core/lib/surface/init.cc +6 -15
  226. data/src/core/lib/surface/legacy_channel.cc +3 -5
  227. data/src/core/lib/surface/legacy_channel.h +3 -1
  228. data/src/core/lib/surface/version.cc +2 -2
  229. data/src/core/lib/transport/promise_endpoint.cc +110 -0
  230. data/src/core/lib/transport/promise_endpoint.h +307 -0
  231. data/src/core/load_balancing/child_policy_handler.cc +2 -4
  232. data/src/core/load_balancing/delegating_helper.h +2 -3
  233. data/src/core/load_balancing/health_check_client.cc +1 -5
  234. data/src/core/load_balancing/lb_policy.h +1 -3
  235. data/src/core/load_balancing/oob_backend_metric.cc +1 -5
  236. data/src/core/load_balancing/pick_first/pick_first.cc +3 -0
  237. data/src/core/load_balancing/xds/cds.cc +10 -1
  238. data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
  239. data/src/core/resolver/xds/xds_config.cc +6 -3
  240. data/src/core/resolver/xds/xds_config.h +9 -4
  241. data/src/core/resolver/xds/xds_dependency_manager.cc +21 -6
  242. data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
  243. data/src/core/resolver/xds/xds_resolver.cc +31 -11
  244. data/src/core/server/server.cc +83 -12
  245. data/src/core/server/server.h +21 -2
  246. data/src/core/server/xds_server_config_fetcher.cc +63 -25
  247. data/src/core/service_config/service_config.h +1 -1
  248. data/src/core/service_config/service_config_impl.h +1 -1
  249. data/src/core/telemetry/context_list_entry.cc +38 -0
  250. data/src/core/telemetry/context_list_entry.h +42 -12
  251. data/src/core/telemetry/stats_data.cc +233 -207
  252. data/src/core/telemetry/stats_data.h +250 -153
  253. data/src/core/telemetry/tcp_tracer.h +1 -1
  254. data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
  255. data/src/core/tsi/fake_transport_security.cc +17 -0
  256. data/src/core/tsi/ssl_transport_security.cc +2 -0
  257. data/src/core/tsi/transport_security_grpc.cc +8 -0
  258. data/src/core/tsi/transport_security_grpc.h +15 -0
  259. data/src/core/util/backoff.cc +1 -5
  260. data/src/core/util/backoff.h +1 -0
  261. data/src/core/util/down_cast.h +1 -1
  262. data/src/core/util/function_signature.h +15 -1
  263. data/src/core/util/http_client/httpcli.cc +12 -5
  264. data/src/core/util/http_client/httpcli.h +4 -1
  265. data/src/core/util/latent_see.h +8 -5
  266. data/src/core/util/log.cc +4 -0
  267. data/src/core/util/memory_usage.h +268 -0
  268. data/src/core/util/per_cpu.cc +2 -0
  269. data/src/core/util/per_cpu.h +7 -0
  270. data/src/core/util/shared_bit_gen.h +20 -0
  271. data/src/core/util/single_set_ptr.h +2 -2
  272. data/src/core/util/upb_utils.h +42 -0
  273. data/src/core/util/uri.cc +3 -2
  274. data/src/core/util/useful.h +53 -2
  275. data/src/core/util/wait_for_single_owner.cc +31 -0
  276. data/src/core/util/wait_for_single_owner.h +24 -0
  277. data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
  278. data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
  279. data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
  280. data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
  281. data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
  282. data/src/core/xds/grpc/xds_http_filter.h +7 -0
  283. data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
  284. data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
  285. data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
  286. data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
  287. data/src/core/xds/grpc/xds_server_grpc.h +10 -2
  288. data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
  289. data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
  290. data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
  291. data/src/core/xds/xds_client/xds_client.cc +26 -5
  292. data/src/ruby/ext/grpc/extconf.rb +2 -0
  293. data/src/ruby/ext/grpc/rb_call.c +1 -8
  294. data/src/ruby/ext/grpc/rb_channel.c +72 -568
  295. data/src/ruby/ext/grpc/rb_channel.h +0 -3
  296. data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
  297. data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
  298. data/src/ruby/ext/grpc/rb_grpc.c +9 -5
  299. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  300. data/src/ruby/ext/grpc/rb_loader.c +0 -4
  301. data/src/ruby/ext/grpc/rb_server.c +31 -50
  302. data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
  303. data/src/ruby/lib/grpc/version.rb +1 -1
  304. data/src/ruby/spec/core_spec.rb +22 -0
  305. data/src/ruby/spec/generic/active_call_spec.rb +1 -1
  306. data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
  307. data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
  308. data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
  309. data/third_party/abseil-cpp/absl/base/config.h +20 -129
  310. data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
  311. data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
  312. data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
  313. data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
  314. data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
  315. data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
  316. data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
  317. data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
  318. data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
  319. data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
  320. data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
  321. data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
  322. data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
  323. data/third_party/abseil-cpp/absl/base/options.h +3 -80
  324. data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
  325. data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
  326. data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
  327. data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
  328. data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
  329. data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
  330. data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
  331. data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
  332. data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
  333. data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
  334. data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
  335. data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
  336. data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
  337. data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
  338. data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
  339. data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
  340. data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
  341. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
  342. data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
  343. data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
  344. data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
  345. data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
  346. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
  347. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
  348. data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
  349. data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
  350. data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
  351. data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
  352. data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
  353. data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
  354. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
  355. data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
  356. data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
  357. data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
  358. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
  359. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
  360. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
  361. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
  362. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
  363. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
  364. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
  365. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
  366. data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
  367. data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
  368. data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
  369. data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
  370. data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
  371. data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
  372. data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
  373. data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
  374. data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
  375. data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
  376. data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
  377. data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
  378. data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
  379. data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
  380. data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
  381. data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
  382. data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
  383. data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
  384. data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
  385. data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
  386. data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
  387. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
  388. data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
  389. data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
  390. data/third_party/abseil-cpp/absl/log/check.h +2 -1
  391. data/third_party/abseil-cpp/absl/log/globals.h +4 -5
  392. data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
  393. data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
  394. data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
  395. data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
  396. data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
  397. data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
  398. data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
  399. data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
  400. data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
  401. data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
  402. data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
  403. data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
  404. data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
  405. data/third_party/abseil-cpp/absl/log/log.h +48 -35
  406. data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
  407. data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
  408. data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
  409. data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
  410. data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
  411. data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
  412. data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
  413. data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
  414. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
  415. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
  416. data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
  417. data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
  418. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
  419. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
  420. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
  421. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
  422. data/third_party/abseil-cpp/absl/random/random.h +88 -53
  423. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
  424. data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
  425. data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
  426. data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
  427. data/third_party/abseil-cpp/absl/status/status.cc +4 -8
  428. data/third_party/abseil-cpp/absl/status/status.h +8 -8
  429. data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
  430. data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
  431. data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
  432. data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
  433. data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
  434. data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
  435. data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
  436. data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
  437. data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
  438. data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
  439. data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
  440. data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
  441. data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
  442. data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
  443. data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
  444. data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
  445. data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
  446. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
  447. data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
  448. data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
  449. data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
  450. data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
  451. data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
  452. data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
  453. data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
  454. data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
  455. data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
  456. data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
  457. data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
  458. data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
  459. data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
  460. data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
  461. data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
  462. data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
  463. data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
  464. data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
  465. data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
  466. data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
  467. data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
  468. data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
  469. data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
  470. data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
  471. data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
  472. data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
  473. data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
  474. data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
  475. data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
  476. data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
  477. data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
  478. data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
  479. data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
  480. data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
  481. data/third_party/abseil-cpp/absl/time/time.h +20 -15
  482. data/third_party/abseil-cpp/absl/types/optional.h +7 -747
  483. data/third_party/abseil-cpp/absl/types/span.h +13 -11
  484. data/third_party/abseil-cpp/absl/types/variant.h +5 -784
  485. data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
  486. metadata +72 -20
  487. data/src/core/lib/event_engine/forkable.cc +0 -105
  488. data/src/core/lib/event_engine/forkable.h +0 -67
  489. data/src/core/lib/iomgr/python_util.h +0 -46
  490. data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
  491. data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
  492. data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
  493. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
  494. data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
  495. data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
  496. data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
  497. data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
  498. data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
  499. data/third_party/abseil-cpp/absl/types/internal/variant.h +0 -1622
@@ -14,7 +14,6 @@
14
14
 
15
15
  #include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
16
16
 
17
- #include <errno.h>
18
17
  #include <grpc/event_engine/event_engine.h>
19
18
  #include <grpc/event_engine/memory_allocator.h>
20
19
  #include <grpc/impl/channel_arg_names.h>
@@ -23,12 +22,8 @@
23
22
 
24
23
  #include <optional>
25
24
 
26
- #include "absl/cleanup/cleanup.h"
27
- #include "absl/status/statusor.h"
28
- #include "absl/strings/str_cat.h"
29
25
  #include "src/core/lib/iomgr/port.h"
30
26
  #include "src/core/util/crash.h" // IWYU pragma: keep
31
- #include "src/core/util/time.h"
32
27
  #include "src/core/util/useful.h"
33
28
 
34
29
  #ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
@@ -44,15 +39,9 @@
44
39
  #include <unistd.h>
45
40
  #endif // GRPC_POSIX_SOCKET_UTILS_COMMON
46
41
 
47
- #include <atomic>
48
42
  #include <cstring>
49
43
 
50
44
  #include "absl/log/check.h"
51
- #include "absl/log/log.h"
52
- #include "absl/status/status.h"
53
- #include "src/core/lib/event_engine/tcp_socket_utils.h"
54
- #include "src/core/util/status_helper.h"
55
- #include "src/core/util/strerror.h"
56
45
 
57
46
  #ifdef GRPC_HAVE_UNIX_SOCKET
58
47
  #ifdef GPR_WINDOWS
@@ -79,75 +68,6 @@ int AdjustValue(int default_value, int min_value, int max_value,
79
68
  return *actual_value;
80
69
  }
81
70
 
82
- #ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
83
- // The default values for TCP_USER_TIMEOUT are currently configured to be in
84
- // line with the default values of KEEPALIVE_TIMEOUT as proposed in
85
- // https://github.com/grpc/proposal/blob/master/A18-tcp-user-timeout.md */
86
- int kDefaultClientUserTimeoutMs = 20000;
87
- int kDefaultServerUserTimeoutMs = 20000;
88
- bool kDefaultClientUserTimeoutEnabled = false;
89
- bool kDefaultServerUserTimeoutEnabled = true;
90
-
91
- absl::Status ErrorForFd(
92
- int fd, const experimental::EventEngine::ResolvedAddress& addr) {
93
- if (fd >= 0) return absl::OkStatus();
94
- const char* addr_str = reinterpret_cast<const char*>(addr.address());
95
- return absl::Status(absl::StatusCode::kInternal,
96
- absl::StrCat("socket: ", grpc_core::StrError(errno),
97
- std::string(addr_str, addr.size())));
98
- }
99
-
100
- int CreateSocket(std::function<int(int, int, int)> socket_factory, int family,
101
- int type, int protocol) {
102
- int res = socket_factory != nullptr ? socket_factory(family, type, protocol)
103
- : socket(family, type, protocol);
104
- if (res < 0 && errno == EMFILE) {
105
- int saved_errno = errno;
106
- LOG_EVERY_N_SEC(ERROR, 10)
107
- << "socket(" << family << ", " << type << ", " << protocol
108
- << ") returned " << res << " with error: |"
109
- << grpc_core::StrError(errno)
110
- << "|. This process might not have a sufficient file descriptor limit "
111
- "for the number of connections grpc wants to open (which is "
112
- "generally a function of the number of grpc channels, the lb policy "
113
- "of each channel, and the number of backends each channel is load "
114
- "balancing across).";
115
- errno = saved_errno;
116
- }
117
- return res;
118
- }
119
-
120
- absl::Status PrepareTcpClientSocket(PosixSocketWrapper sock,
121
- const EventEngine::ResolvedAddress& addr,
122
- const PosixTcpOptions& options) {
123
- bool close_fd = true;
124
- auto sock_cleanup = absl::MakeCleanup([&close_fd, &sock]() -> void {
125
- if (close_fd and sock.Fd() >= 0) {
126
- close(sock.Fd());
127
- }
128
- });
129
- GRPC_RETURN_IF_ERROR(sock.SetSocketNonBlocking(1));
130
- GRPC_RETURN_IF_ERROR(sock.SetSocketCloexec(1));
131
- if (options.tcp_receive_buffer_size != options.kReadBufferSizeUnset) {
132
- GRPC_RETURN_IF_ERROR(sock.SetSocketRcvBuf(options.tcp_receive_buffer_size));
133
- }
134
- if (addr.address()->sa_family != AF_UNIX && !ResolvedAddressIsVSock(addr)) {
135
- // If its not a unix socket or vsock address.
136
- GRPC_RETURN_IF_ERROR(sock.SetSocketLowLatency(1));
137
- GRPC_RETURN_IF_ERROR(sock.SetSocketReuseAddr(1));
138
- GRPC_RETURN_IF_ERROR(sock.SetSocketDscp(options.dscp));
139
- sock.TrySetSocketTcpUserTimeout(options, true);
140
- }
141
- GRPC_RETURN_IF_ERROR(sock.SetSocketNoSigpipeIfPossible());
142
- GRPC_RETURN_IF_ERROR(sock.ApplySocketMutatorInOptions(
143
- GRPC_FD_CLIENT_CONNECTION_USAGE, options));
144
- // No errors. Set close_fd to false to ensure the socket is not closed.
145
- close_fd = false;
146
- return absl::OkStatus();
147
- }
148
-
149
- #endif // GRPC_POSIX_SOCKET_UTILS_COMMON
150
-
151
71
  } // namespace
152
72
 
153
73
  PosixTcpOptions TcpOptionsFromEndpointConfig(const EndpointConfig& config) {
@@ -185,7 +105,7 @@ PosixTcpOptions TcpOptionsFromEndpointConfig(const EndpointConfig& config) {
185
105
  config.GetInt(GRPC_ARG_EXPAND_WILDCARD_ADDRS)) != 0);
186
106
  options.dscp = AdjustValue(PosixTcpOptions::kDscpNotSet, 0, 63,
187
107
  config.GetInt(GRPC_ARG_DSCP));
188
- options.allow_reuse_port = PosixSocketWrapper::IsSocketReusePortSupported();
108
+ options.allow_reuse_port = IsSocketReusePortSupported();
189
109
  auto allow_reuse_port_value = config.GetInt(GRPC_ARG_ALLOW_REUSEPORT);
190
110
  if (allow_reuse_port_value.has_value()) {
191
111
  options.allow_reuse_port =
@@ -219,53 +139,6 @@ PosixTcpOptions TcpOptionsFromEndpointConfig(const EndpointConfig& config) {
219
139
  return options;
220
140
  }
221
141
 
222
- #ifdef GRPC_POSIX_SOCKETUTILS
223
-
224
- int Accept4(int sockfd,
225
- grpc_event_engine::experimental::EventEngine::ResolvedAddress& addr,
226
- int nonblock, int cloexec) {
227
- int fd, flags;
228
- EventEngine::ResolvedAddress peer_addr;
229
- socklen_t len = EventEngine::ResolvedAddress::MAX_SIZE_BYTES;
230
- fd = accept(sockfd, const_cast<sockaddr*>(peer_addr.address()), &len);
231
- if (fd >= 0) {
232
- if (nonblock) {
233
- flags = fcntl(fd, F_GETFL, 0);
234
- if (flags < 0) goto close_and_error;
235
- if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) != 0) goto close_and_error;
236
- }
237
- if (cloexec) {
238
- flags = fcntl(fd, F_GETFD, 0);
239
- if (flags < 0) goto close_and_error;
240
- if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) != 0) goto close_and_error;
241
- }
242
- }
243
- addr = EventEngine::ResolvedAddress(peer_addr.address(), len);
244
- return fd;
245
-
246
- close_and_error:
247
- close(fd);
248
- return -1;
249
- }
250
-
251
- #elif GRPC_LINUX_SOCKETUTILS
252
-
253
- int Accept4(int sockfd,
254
- grpc_event_engine::experimental::EventEngine::ResolvedAddress& addr,
255
- int nonblock, int cloexec) {
256
- int flags = 0;
257
- flags |= nonblock ? SOCK_NONBLOCK : 0;
258
- flags |= cloexec ? SOCK_CLOEXEC : 0;
259
- EventEngine::ResolvedAddress peer_addr;
260
- socklen_t len = EventEngine::ResolvedAddress::MAX_SIZE_BYTES;
261
- int ret =
262
- accept4(sockfd, const_cast<sockaddr*>(peer_addr.address()), &len, flags);
263
- addr = EventEngine::ResolvedAddress(peer_addr.address(), len);
264
- return ret;
265
- }
266
-
267
- #endif // GRPC_LINUX_SOCKETUTILS
268
-
269
142
  #ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
270
143
 
271
144
  void UnlinkIfUnixDomainSocket(
@@ -291,389 +164,7 @@ void UnlinkIfUnixDomainSocket(
291
164
  #endif
292
165
  }
293
166
 
294
- // Instruct the kernel to wait for specified number of bytes to be received on
295
- // the socket before generating an interrupt for packet receive. If the call
296
- // succeeds, it returns the number of bytes (wait threshold) that was actually
297
- // set.
298
- absl::StatusOr<int> PosixSocketWrapper::SetSocketRcvLowat(int bytes) {
299
- if (setsockopt(fd_, SOL_SOCKET, SO_RCVLOWAT, &bytes, sizeof(bytes)) != 0) {
300
- return absl::Status(
301
- absl::StatusCode::kInternal,
302
- absl::StrCat("setsockopt(SO_RCVLOWAT): ", grpc_core::StrError(errno)));
303
- }
304
- return bytes;
305
- }
306
-
307
- // Set a socket to use zerocopy
308
- absl::Status PosixSocketWrapper::SetSocketZeroCopy() {
309
- #ifdef GRPC_LINUX_ERRQUEUE
310
- const int enable = 1;
311
- auto err = setsockopt(fd_, SOL_SOCKET, SO_ZEROCOPY, &enable, sizeof(enable));
312
- if (err != 0) {
313
- return absl::Status(
314
- absl::StatusCode::kInternal,
315
- absl::StrCat("setsockopt(SO_ZEROCOPY): ", grpc_core::StrError(errno)));
316
- }
317
- return absl::OkStatus();
318
- #else
319
- return absl::Status(absl::StatusCode::kInternal,
320
- absl::StrCat("setsockopt(SO_ZEROCOPY): ",
321
- grpc_core::StrError(ENOSYS).c_str()));
322
- #endif
323
- }
324
-
325
- // Set a socket to non blocking mode
326
- absl::Status PosixSocketWrapper::SetSocketNonBlocking(int non_blocking) {
327
- int oldflags = fcntl(fd_, F_GETFL, 0);
328
- if (oldflags < 0) {
329
- return absl::Status(absl::StatusCode::kInternal,
330
- absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
331
- }
332
-
333
- if (non_blocking) {
334
- oldflags |= O_NONBLOCK;
335
- } else {
336
- oldflags &= ~O_NONBLOCK;
337
- }
338
-
339
- if (fcntl(fd_, F_SETFL, oldflags) != 0) {
340
- return absl::Status(absl::StatusCode::kInternal,
341
- absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
342
- }
343
-
344
- return absl::OkStatus();
345
- }
346
-
347
- absl::Status PosixSocketWrapper::SetSocketNoSigpipeIfPossible() {
348
- #ifdef GRPC_HAVE_SO_NOSIGPIPE
349
- int val = 1;
350
- int newval;
351
- socklen_t intlen = sizeof(newval);
352
- if (0 != setsockopt(fd_, SOL_SOCKET, SO_NOSIGPIPE, &val, sizeof(val))) {
353
- return absl::Status(
354
- absl::StatusCode::kInternal,
355
- absl::StrCat("setsockopt(SO_NOSIGPIPE): ", grpc_core::StrError(errno)));
356
- }
357
- if (0 != getsockopt(fd_, SOL_SOCKET, SO_NOSIGPIPE, &newval, &intlen)) {
358
- return absl::Status(
359
- absl::StatusCode::kInternal,
360
- absl::StrCat("getsockopt(SO_NOSIGPIPE): ", grpc_core::StrError(errno)));
361
- }
362
- if ((newval != 0) != (val != 0)) {
363
- return absl::Status(absl::StatusCode::kInternal,
364
- "Failed to set SO_NOSIGPIPE");
365
- }
366
- #endif
367
- return absl::OkStatus();
368
- }
369
-
370
- absl::Status PosixSocketWrapper::SetSocketIpPktInfoIfPossible() {
371
- #ifdef GRPC_HAVE_IP_PKTINFO
372
- int get_local_ip = 1;
373
- if (0 != setsockopt(fd_, IPPROTO_IP, IP_PKTINFO, &get_local_ip,
374
- sizeof(get_local_ip))) {
375
- return absl::Status(
376
- absl::StatusCode::kInternal,
377
- absl::StrCat("setsockopt(IP_PKTINFO): ", grpc_core::StrError(errno)));
378
- }
379
- #endif
380
- return absl::OkStatus();
381
- }
382
-
383
- absl::Status PosixSocketWrapper::SetSocketIpv6RecvPktInfoIfPossible() {
384
- #ifdef GRPC_HAVE_IPV6_RECVPKTINFO
385
- int get_local_ip = 1;
386
- if (0 != setsockopt(fd_, IPPROTO_IPV6, IPV6_RECVPKTINFO, &get_local_ip,
387
- sizeof(get_local_ip))) {
388
- return absl::Status(absl::StatusCode::kInternal,
389
- absl::StrCat("setsockopt(IPV6_RECVPKTINFO): ",
390
- grpc_core::StrError(errno)));
391
- }
392
- #endif
393
- return absl::OkStatus();
394
- }
395
-
396
- absl::Status PosixSocketWrapper::SetSocketSndBuf(int buffer_size_bytes) {
397
- return 0 == setsockopt(fd_, SOL_SOCKET, SO_SNDBUF, &buffer_size_bytes,
398
- sizeof(buffer_size_bytes))
399
- ? absl::OkStatus()
400
- : absl::Status(absl::StatusCode::kInternal,
401
- absl::StrCat("setsockopt(SO_SNDBUF): ",
402
- grpc_core::StrError(errno)));
403
- }
404
-
405
- absl::Status PosixSocketWrapper::SetSocketRcvBuf(int buffer_size_bytes) {
406
- return 0 == setsockopt(fd_, SOL_SOCKET, SO_RCVBUF, &buffer_size_bytes,
407
- sizeof(buffer_size_bytes))
408
- ? absl::OkStatus()
409
- : absl::Status(absl::StatusCode::kInternal,
410
- absl::StrCat("setsockopt(SO_RCVBUF): ",
411
- grpc_core::StrError(errno)));
412
- }
413
-
414
- // Set a socket to close on exec
415
- absl::Status PosixSocketWrapper::SetSocketCloexec(int close_on_exec) {
416
- int oldflags = fcntl(fd_, F_GETFD, 0);
417
- if (oldflags < 0) {
418
- return absl::Status(absl::StatusCode::kInternal,
419
- absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
420
- }
421
-
422
- if (close_on_exec) {
423
- oldflags |= FD_CLOEXEC;
424
- } else {
425
- oldflags &= ~FD_CLOEXEC;
426
- }
427
-
428
- if (fcntl(fd_, F_SETFD, oldflags) != 0) {
429
- return absl::Status(absl::StatusCode::kInternal,
430
- absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
431
- }
432
-
433
- return absl::OkStatus();
434
- }
435
-
436
- // set a socket to reuse old addresses
437
- absl::Status PosixSocketWrapper::SetSocketReuseAddr(int reuse) {
438
- int val = (reuse != 0);
439
- int newval;
440
- socklen_t intlen = sizeof(newval);
441
- if (0 != setsockopt(fd_, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val))) {
442
- return absl::Status(
443
- absl::StatusCode::kInternal,
444
- absl::StrCat("setsockopt(SO_REUSEADDR): ", grpc_core::StrError(errno)));
445
- }
446
- if (0 != getsockopt(fd_, SOL_SOCKET, SO_REUSEADDR, &newval, &intlen)) {
447
- return absl::Status(
448
- absl::StatusCode::kInternal,
449
- absl::StrCat("getsockopt(SO_REUSEADDR): ", grpc_core::StrError(errno)));
450
- }
451
- if ((newval != 0) != val) {
452
- return absl::Status(absl::StatusCode::kInternal,
453
- "Failed to set SO_REUSEADDR");
454
- }
455
-
456
- return absl::OkStatus();
457
- }
458
-
459
- // set a socket to reuse old ports
460
- absl::Status PosixSocketWrapper::SetSocketReusePort(int reuse) {
461
- #ifndef SO_REUSEPORT
462
- return absl::Status(absl::StatusCode::kInternal,
463
- "SO_REUSEPORT unavailable on compiling system");
464
- #else
465
- int val = (reuse != 0);
466
- int newval;
467
- socklen_t intlen = sizeof(newval);
468
- if (0 != setsockopt(fd_, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val))) {
469
- return absl::Status(
470
- absl::StatusCode::kInternal,
471
- absl::StrCat("setsockopt(SO_REUSEPORT): ", grpc_core::StrError(errno)));
472
- }
473
- if (0 != getsockopt(fd_, SOL_SOCKET, SO_REUSEPORT, &newval, &intlen)) {
474
- return absl::Status(
475
- absl::StatusCode::kInternal,
476
- absl::StrCat("getsockopt(SO_REUSEPORT): ", grpc_core::StrError(errno)));
477
- }
478
- if ((newval != 0) != val) {
479
- return absl::Status(absl::StatusCode::kInternal,
480
- "Failed to set SO_REUSEPORT");
481
- }
482
-
483
- return absl::OkStatus();
484
- #endif
485
- }
486
-
487
- bool PosixSocketWrapper::IsSocketReusePortSupported() {
488
- static bool kSupportSoReusePort = []() -> bool {
489
- int s = socket(AF_INET, SOCK_STREAM, 0);
490
- if (s < 0) {
491
- // This might be an ipv6-only environment in which case
492
- // 'socket(AF_INET,..)' call would fail. Try creating IPv6 socket in
493
- // that case
494
- s = socket(AF_INET6, SOCK_STREAM, 0);
495
- }
496
- if (s >= 0) {
497
- PosixSocketWrapper sock(s);
498
- bool result = sock.SetSocketReusePort(1).ok();
499
- close(sock.Fd());
500
- return result;
501
- } else {
502
- return false;
503
- }
504
- }();
505
- return kSupportSoReusePort;
506
- }
507
-
508
- // Disable nagle algorithm
509
- absl::Status PosixSocketWrapper::SetSocketLowLatency(int low_latency) {
510
- int val = (low_latency != 0);
511
- int newval;
512
- socklen_t intlen = sizeof(newval);
513
- if (0 != setsockopt(fd_, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val))) {
514
- return absl::Status(
515
- absl::StatusCode::kInternal,
516
- absl::StrCat("setsockopt(TCP_NODELAY): ", grpc_core::StrError(errno)));
517
- }
518
- if (0 != getsockopt(fd_, IPPROTO_TCP, TCP_NODELAY, &newval, &intlen)) {
519
- return absl::Status(
520
- absl::StatusCode::kInternal,
521
- absl::StrCat("getsockopt(TCP_NODELAY): ", grpc_core::StrError(errno)));
522
- }
523
- if ((newval != 0) != val) {
524
- return absl::Status(absl::StatusCode::kInternal,
525
- "Failed to set TCP_NODELAY");
526
- }
527
- return absl::OkStatus();
528
- }
529
-
530
- // Set Differentiated Services Code Point (DSCP)
531
- absl::Status PosixSocketWrapper::SetSocketDscp(int dscp) {
532
- if (dscp == PosixTcpOptions::kDscpNotSet) {
533
- return absl::OkStatus();
534
- }
535
- // The TOS/TrafficClass byte consists of following bits:
536
- // | 7 6 5 4 3 2 | 1 0 |
537
- // | DSCP | ECN |
538
- int newval = dscp << 2;
539
- int val;
540
- socklen_t intlen = sizeof(val);
541
- // Get ECN bits from current IP_TOS value unless IPv6 only
542
- if (0 == getsockopt(fd_, IPPROTO_IP, IP_TOS, &val, &intlen)) {
543
- newval |= (val & 0x3);
544
- if (0 != setsockopt(fd_, IPPROTO_IP, IP_TOS, &newval, sizeof(newval))) {
545
- return absl::Status(
546
- absl::StatusCode::kInternal,
547
- absl::StrCat("setsockopt(IP_TOS): ", grpc_core::StrError(errno)));
548
- }
549
- }
550
- // Get ECN from current Traffic Class value if IPv6 is available
551
- if (0 == getsockopt(fd_, IPPROTO_IPV6, IPV6_TCLASS, &val, &intlen)) {
552
- newval |= (val & 0x3);
553
- if (0 !=
554
- setsockopt(fd_, IPPROTO_IPV6, IPV6_TCLASS, &newval, sizeof(newval))) {
555
- return absl::Status(absl::StatusCode::kInternal,
556
- absl::StrCat("setsockopt(IPV6_TCLASS): ",
557
- grpc_core::StrError(errno)));
558
- }
559
- }
560
- return absl::OkStatus();
561
- }
562
-
563
- #if GPR_LINUX == 1
564
- // For Linux, it will be detected to support TCP_USER_TIMEOUT
565
- #ifndef TCP_USER_TIMEOUT
566
- #define TCP_USER_TIMEOUT 18
567
- #endif
568
- #define SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT 0
569
- #else
570
- // For non-Linux, TCP_USER_TIMEOUT will be used if TCP_USER_TIMEOUT is defined.
571
- #ifdef TCP_USER_TIMEOUT
572
- #define SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT 0
573
- #else
574
- #define TCP_USER_TIMEOUT 0
575
- #define SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT -1
576
- #endif // TCP_USER_TIMEOUT
577
- #endif // GPR_LINUX == 1
578
-
579
- // Whether the socket supports TCP_USER_TIMEOUT option.
580
- // (0: don't know, 1: support, -1: not support)
581
- static std::atomic<int> g_socket_supports_tcp_user_timeout(
582
- SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT);
583
-
584
- void PosixSocketWrapper::ConfigureDefaultTcpUserTimeout(bool enable,
585
- int timeout,
586
- bool is_client) {
587
- if (is_client) {
588
- kDefaultClientUserTimeoutEnabled = enable;
589
- if (timeout > 0) {
590
- kDefaultClientUserTimeoutMs = timeout;
591
- }
592
- } else {
593
- kDefaultServerUserTimeoutEnabled = enable;
594
- if (timeout > 0) {
595
- kDefaultServerUserTimeoutMs = timeout;
596
- }
597
- }
598
- }
599
-
600
- // Set TCP_USER_TIMEOUT
601
- void PosixSocketWrapper::TrySetSocketTcpUserTimeout(
602
- const PosixTcpOptions& options, bool is_client) {
603
- if (g_socket_supports_tcp_user_timeout.load() < 0) {
604
- return;
605
- }
606
- bool enable = is_client ? kDefaultClientUserTimeoutEnabled
607
- : kDefaultServerUserTimeoutEnabled;
608
- int timeout =
609
- is_client ? kDefaultClientUserTimeoutMs : kDefaultServerUserTimeoutMs;
610
- if (options.keep_alive_time_ms > 0) {
611
- enable = options.keep_alive_time_ms != INT_MAX;
612
- }
613
- if (options.keep_alive_timeout_ms > 0) {
614
- timeout = options.keep_alive_timeout_ms;
615
- }
616
- if (enable) {
617
- int newval;
618
- socklen_t len = sizeof(newval);
619
- // If this is the first time to use TCP_USER_TIMEOUT, try to check
620
- // if it is available.
621
- if (g_socket_supports_tcp_user_timeout.load() == 0) {
622
- if (0 != getsockopt(fd_, IPPROTO_TCP, TCP_USER_TIMEOUT, &newval, &len)) {
623
- // This log is intentionally not protected behind a flag, so that users
624
- // know that TCP_USER_TIMEOUT is not being used.
625
- GRPC_TRACE_LOG(tcp, INFO)
626
- << "TCP_USER_TIMEOUT is not available. TCP_USER_TIMEOUT "
627
- "won't be used thereafter";
628
- g_socket_supports_tcp_user_timeout.store(-1);
629
- } else {
630
- GRPC_TRACE_LOG(tcp, INFO)
631
- << "TCP_USER_TIMEOUT is available. TCP_USER_TIMEOUT will be "
632
- "used thereafter";
633
- g_socket_supports_tcp_user_timeout.store(1);
634
- }
635
- }
636
- if (g_socket_supports_tcp_user_timeout.load() > 0) {
637
- if (0 != setsockopt(fd_, IPPROTO_TCP, TCP_USER_TIMEOUT, &timeout,
638
- sizeof(timeout))) {
639
- LOG(ERROR) << "setsockopt(TCP_USER_TIMEOUT) "
640
- << grpc_core::StrError(errno);
641
- return;
642
- }
643
- if (0 != getsockopt(fd_, IPPROTO_TCP, TCP_USER_TIMEOUT, &newval, &len)) {
644
- LOG(ERROR) << "getsockopt(TCP_USER_TIMEOUT) "
645
- << grpc_core::StrError(errno);
646
- return;
647
- }
648
- if (newval != timeout) {
649
- // Do not fail on failing to set TCP_USER_TIMEOUT
650
- LOG(ERROR) << "Failed to set TCP_USER_TIMEOUT";
651
- return;
652
- }
653
- }
654
- }
655
- }
656
-
657
- // Set a socket using a grpc_socket_mutator
658
- absl::Status PosixSocketWrapper::SetSocketMutator(
659
- grpc_fd_usage usage, grpc_socket_mutator* mutator) {
660
- CHECK(mutator);
661
- if (!grpc_socket_mutator_mutate_fd(mutator, fd_, usage)) {
662
- return absl::Status(absl::StatusCode::kInternal,
663
- "grpc_socket_mutator failed.");
664
- }
665
- return absl::OkStatus();
666
- }
667
-
668
- absl::Status PosixSocketWrapper::ApplySocketMutatorInOptions(
669
- grpc_fd_usage usage, const PosixTcpOptions& options) {
670
- if (options.socket_mutator == nullptr) {
671
- return absl::OkStatus();
672
- }
673
- return SetSocketMutator(usage, options.socket_mutator);
674
- }
675
-
676
- bool PosixSocketWrapper::IsIpv6LoopbackAvailable() {
167
+ bool IsIpv6LoopbackAvailable() {
677
168
  static bool kIpv6LoopbackAvailable = []() -> bool {
678
169
  int fd = socket(AF_INET6, SOCK_STREAM, 0);
679
170
  bool loopback_available = false;
@@ -698,216 +189,9 @@ bool PosixSocketWrapper::IsIpv6LoopbackAvailable() {
698
189
  return kIpv6LoopbackAvailable;
699
190
  }
700
191
 
701
- absl::StatusOr<EventEngine::ResolvedAddress>
702
- PosixSocketWrapper::LocalAddress() {
703
- EventEngine::ResolvedAddress addr;
704
- socklen_t len = EventEngine::ResolvedAddress::MAX_SIZE_BYTES;
705
- if (getsockname(fd_, const_cast<sockaddr*>(addr.address()), &len) < 0) {
706
- return absl::InternalError(
707
- absl::StrCat("getsockname:", grpc_core::StrError(errno)));
708
- }
709
- return EventEngine::ResolvedAddress(addr.address(), len);
710
- }
711
-
712
- absl::StatusOr<EventEngine::ResolvedAddress> PosixSocketWrapper::PeerAddress() {
713
- EventEngine::ResolvedAddress addr;
714
- socklen_t len = EventEngine::ResolvedAddress::MAX_SIZE_BYTES;
715
- if (getpeername(fd_, const_cast<sockaddr*>(addr.address()), &len) < 0) {
716
- return absl::InternalError(
717
- absl::StrCat("getpeername:", grpc_core::StrError(errno)));
718
- }
719
- return EventEngine::ResolvedAddress(addr.address(), len);
720
- }
721
-
722
- absl::StatusOr<std::string> PosixSocketWrapper::LocalAddressString() {
723
- auto status = LocalAddress();
724
- if (!status.ok()) {
725
- return status.status();
726
- }
727
- return ResolvedAddressToNormalizedString((*status));
728
- }
729
-
730
- absl::StatusOr<std::string> PosixSocketWrapper::PeerAddressString() {
731
- auto status = PeerAddress();
732
- if (!status.ok()) {
733
- return status.status();
734
- }
735
- return ResolvedAddressToNormalizedString((*status));
736
- }
737
-
738
- absl::StatusOr<PosixSocketWrapper> PosixSocketWrapper::CreateDualStackSocket(
739
- std::function<int(int, int, int)> socket_factory,
740
- const experimental::EventEngine::ResolvedAddress& addr, int type,
741
- int protocol, PosixSocketWrapper::DSMode& dsmode) {
742
- const sockaddr* sock_addr = addr.address();
743
- int family = sock_addr->sa_family;
744
- int newfd;
745
- if (family == AF_INET6) {
746
- if (IsIpv6LoopbackAvailable()) {
747
- newfd = CreateSocket(socket_factory, family, type, protocol);
748
- } else {
749
- newfd = -1;
750
- errno = EAFNOSUPPORT;
751
- }
752
- // Check if we've got a valid dualstack socket.
753
- if (newfd > 0 && SetSocketDualStack(newfd)) {
754
- dsmode = PosixSocketWrapper::DSMode::DSMODE_DUALSTACK;
755
- return PosixSocketWrapper(newfd);
756
- }
757
- // If this isn't an IPv4 address, then return whatever we've got.
758
- if (!ResolvedAddressIsV4Mapped(addr, nullptr)) {
759
- if (newfd < 0) {
760
- return ErrorForFd(newfd, addr);
761
- }
762
- dsmode = PosixSocketWrapper::DSMode::DSMODE_IPV6;
763
- return PosixSocketWrapper(newfd);
764
- }
765
- // Fall back to AF_INET.
766
- if (newfd >= 0) {
767
- close(newfd);
768
- }
769
- family = AF_INET;
770
- }
771
- dsmode = family == AF_INET ? PosixSocketWrapper::DSMode::DSMODE_IPV4
772
- : PosixSocketWrapper::DSMode::DSMODE_NONE;
773
- newfd = CreateSocket(socket_factory, family, type, protocol);
774
- if (newfd < 0) {
775
- return ErrorForFd(newfd, addr);
776
- }
777
- return PosixSocketWrapper(newfd);
778
- }
779
-
780
- absl::StatusOr<PosixSocketWrapper::PosixSocketCreateResult>
781
- PosixSocketWrapper::CreateAndPrepareTcpClientSocket(
782
- const PosixTcpOptions& options,
783
- const EventEngine::ResolvedAddress& target_addr) {
784
- PosixSocketWrapper::DSMode dsmode;
785
- EventEngine::ResolvedAddress mapped_target_addr;
786
-
787
- // Use dualstack sockets where available. Set mapped to v6 or v4 mapped to
788
- // v6.
789
- if (!ResolvedAddressToV4Mapped(target_addr, &mapped_target_addr)) {
790
- // addr is v4 mapped to v6 or just v6.
791
- mapped_target_addr = target_addr;
792
- }
793
- absl::StatusOr<PosixSocketWrapper> posix_socket_wrapper =
794
- PosixSocketWrapper::CreateDualStackSocket(nullptr, mapped_target_addr,
795
- SOCK_STREAM, 0, dsmode);
796
- if (!posix_socket_wrapper.ok()) {
797
- return posix_socket_wrapper.status();
798
- }
799
-
800
- if (dsmode == PosixSocketWrapper::DSMode::DSMODE_IPV4) {
801
- // Original addr is either v4 or v4 mapped to v6. Set mapped_addr to v4.
802
- if (!ResolvedAddressIsV4Mapped(target_addr, &mapped_target_addr)) {
803
- mapped_target_addr = target_addr;
804
- }
805
- }
806
-
807
- auto error = PrepareTcpClientSocket(*posix_socket_wrapper, mapped_target_addr,
808
- options);
809
- if (!error.ok()) {
810
- return error;
811
- }
812
- return PosixSocketWrapper::PosixSocketCreateResult{*posix_socket_wrapper,
813
- mapped_target_addr};
814
- }
815
-
816
192
  #else // GRPC_POSIX_SOCKET_UTILS_COMMON
817
193
 
818
- absl::StatusOr<int> PosixSocketWrapper::SetSocketRcvLowat(int /*bytes*/) {
819
- grpc_core::Crash("unimplemented");
820
- }
821
-
822
- absl::Status PosixSocketWrapper::SetSocketZeroCopy() {
823
- grpc_core::Crash("unimplemented");
824
- }
825
-
826
- absl::Status PosixSocketWrapper::SetSocketNonBlocking(int /*non_blocking*/) {
827
- grpc_core::Crash("unimplemented");
828
- }
829
-
830
- absl::Status PosixSocketWrapper::SetSocketCloexec(int /*close_on_exec*/) {
831
- grpc_core::Crash("unimplemented");
832
- }
833
-
834
- absl::Status PosixSocketWrapper::SetSocketReuseAddr(int /*reuse*/) {
835
- grpc_core::Crash("unimplemented");
836
- }
837
-
838
- absl::Status PosixSocketWrapper::SetSocketLowLatency(int /*low_latency*/) {
839
- grpc_core::Crash("unimplemented");
840
- }
841
-
842
- absl::Status PosixSocketWrapper::SetSocketReusePort(int /*reuse*/) {
843
- grpc_core::Crash("unimplemented");
844
- }
845
-
846
- absl::Status PosixSocketWrapper::SetSocketDscp(int /*dscp*/) {
847
- grpc_core::Crash("unimplemented");
848
- }
849
-
850
- void PosixSocketWrapper::ConfigureDefaultTcpUserTimeout(bool /*enable*/,
851
- int /*timeout*/,
852
- bool /*is_client*/) {}
853
-
854
- void PosixSocketWrapper::TrySetSocketTcpUserTimeout(
855
- const PosixTcpOptions& /*options*/, bool /*is_client*/) {
856
- grpc_core::Crash("unimplemented");
857
- }
858
-
859
- absl::Status PosixSocketWrapper::SetSocketNoSigpipeIfPossible() {
860
- grpc_core::Crash("unimplemented");
861
- }
862
-
863
- absl::Status PosixSocketWrapper::SetSocketIpPktInfoIfPossible() {
864
- grpc_core::Crash("unimplemented");
865
- }
866
-
867
- absl::Status PosixSocketWrapper::SetSocketIpv6RecvPktInfoIfPossible() {
868
- grpc_core::Crash("unimplemented");
869
- }
870
-
871
- absl::Status PosixSocketWrapper::SetSocketSndBuf(int /*buffer_size_bytes*/) {
872
- grpc_core::Crash("unimplemented");
873
- }
874
-
875
- absl::Status PosixSocketWrapper::SetSocketRcvBuf(int /*buffer_size_bytes*/) {
876
- grpc_core::Crash("unimplemented");
877
- }
878
-
879
- absl::Status PosixSocketWrapper::SetSocketMutator(
880
- grpc_fd_usage /*usage*/, grpc_socket_mutator* /*mutator*/) {
881
- grpc_core::Crash("unimplemented");
882
- }
883
-
884
- absl::Status PosixSocketWrapper::ApplySocketMutatorInOptions(
885
- grpc_fd_usage /*usage*/, const PosixTcpOptions& /*options*/) {
886
- grpc_core::Crash("unimplemented");
887
- }
888
-
889
- bool PosixSocketWrapper::IsSocketReusePortSupported() {
890
- grpc_core::Crash("unimplemented");
891
- }
892
-
893
- bool PosixSocketWrapper::IsIpv6LoopbackAvailable() {
894
- grpc_core::Crash("unimplemented");
895
- }
896
-
897
- absl::StatusOr<PosixSocketWrapper> PosixSocketWrapper::CreateDualStackSocket(
898
- std::function<int(int /*domain*/, int /*type*/, int /*protocol*/)>
899
- /* socket_factory */,
900
- const experimental::EventEngine::ResolvedAddress& /*addr*/, int /*type*/,
901
- int /*protocol*/, DSMode& /*dsmode*/) {
902
- grpc_core::Crash("unimplemented");
903
- }
904
-
905
- absl::StatusOr<PosixSocketWrapper::PosixSocketCreateResult>
906
- PosixSocketWrapper::CreateAndPrepareTcpClientSocket(
907
- const PosixTcpOptions& /*options*/,
908
- const EventEngine::ResolvedAddress& /*target_addr*/) {
909
- grpc_core::Crash("unimplemented");
910
- }
194
+ bool IsIpv6LoopbackAvailable() { grpc_core::Crash("unimplemented"); }
911
195
 
912
196
  #endif // GRPC_POSIX_SOCKET_UTILS_COMMON
913
197