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.
- checksums.yaml +4 -4
- data/Makefile +38 -17
- data/include/grpc/create_channel_from_endpoint.h +54 -0
- data/include/grpc/credentials.h +11 -5
- data/include/grpc/event_engine/event_engine.h +74 -17
- data/include/grpc/grpc_posix.h +20 -1
- data/include/grpc/impl/channel_arg_names.h +2 -4
- data/include/grpc/module.modulemap +1 -0
- data/include/grpc/support/json.h +24 -0
- data/src/core/call/interception_chain.h +7 -11
- data/src/core/channelz/channel_trace.cc +213 -115
- data/src/core/channelz/channel_trace.h +380 -86
- data/src/core/channelz/channelz.cc +270 -181
- data/src/core/channelz/channelz.h +168 -55
- data/src/core/channelz/channelz_registry.cc +2 -1
- data/src/core/channelz/channelz_registry.h +24 -0
- data/src/core/channelz/property_list.cc +357 -0
- data/src/core/channelz/property_list.h +202 -0
- data/src/core/channelz/ztrace_collector.h +3 -2
- data/src/core/client_channel/backup_poller.cc +17 -2
- data/src/core/client_channel/client_channel.cc +17 -28
- data/src/core/client_channel/client_channel_filter.cc +19 -29
- data/src/core/client_channel/config_selector.h +8 -2
- data/src/core/client_channel/dynamic_filters.cc +5 -6
- data/src/core/client_channel/dynamic_filters.h +1 -1
- data/src/core/client_channel/global_subchannel_pool.cc +4 -1
- data/src/core/client_channel/retry_filter.cc +21 -27
- data/src/core/client_channel/retry_filter.h +10 -7
- data/src/core/client_channel/retry_filter_legacy_call_data.cc +5 -5
- data/src/core/client_channel/retry_filter_legacy_call_data.h +1 -1
- data/src/core/client_channel/retry_interceptor.cc +30 -44
- data/src/core/client_channel/retry_interceptor.h +18 -17
- data/src/core/client_channel/retry_throttle.cc +46 -61
- data/src/core/client_channel/retry_throttle.h +17 -39
- data/src/core/client_channel/subchannel.cc +43 -19
- data/src/core/client_channel/subchannel.h +8 -0
- data/src/core/config/config_vars.cc +2 -0
- data/src/core/config/core_configuration.cc +1 -0
- data/src/core/config/core_configuration.h +11 -0
- data/src/core/credentials/call/call_creds_registry.h +125 -0
- data/src/core/credentials/call/call_creds_registry_init.cc +91 -0
- data/src/core/credentials/call/gcp_service_account_identity/gcp_service_account_identity_credentials.cc +6 -48
- data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.cc +86 -0
- data/src/core/credentials/call/jwt_token_file/jwt_token_file_call_credentials.h +74 -0
- data/src/core/credentials/call/jwt_util.cc +70 -0
- data/src/core/credentials/call/jwt_util.h +32 -0
- data/src/core/credentials/transport/channel_creds_registry_init.cc +1 -1
- data/src/core/credentials/transport/google_default/google_default_credentials.cc +72 -4
- data/src/core/credentials/transport/ssl/ssl_credentials.cc +0 -1
- data/src/core/credentials/transport/tls/load_system_roots_supported.cc +1 -0
- data/src/core/credentials/transport/xds/xds_credentials.cc +0 -3
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.cc +8 -8
- data/src/core/ext/filters/gcp_authentication/gcp_authentication_filter.h +16 -16
- data/src/core/ext/filters/http/client_authority_filter.cc +2 -4
- data/src/core/ext/filters/http/message_compress/compression_filter.h +25 -22
- data/src/core/ext/filters/http/server/http_server_filter.h +12 -11
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +120 -35
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +6 -5
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +162 -115
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +0 -3
- data/src/core/ext/transport/chttp2/transport/decode_huff.cc +1239 -3514
- data/src/core/ext/transport/chttp2/transport/decode_huff.h +1008 -1486
- data/src/core/ext/transport/chttp2/transport/flow_control.h +22 -17
- data/src/core/ext/transport/chttp2/transport/frame.cc +10 -0
- data/src/core/ext/transport/chttp2/transport/frame.h +2 -2
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +7 -8
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +4 -5
- data/src/core/ext/transport/chttp2/transport/header_assembler.h +299 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +11 -5
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +12 -1
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +1017 -0
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +593 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +19 -22
- data/{third_party/abseil-cpp/absl/strings/cord_buffer.cc → src/core/ext/transport/chttp2/transport/http2_stats_collector.cc} +14 -14
- data/src/core/ext/transport/chttp2/transport/http2_stats_collector.h +33 -0
- data/src/core/ext/transport/chttp2/transport/http2_status.h +6 -1
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +43 -0
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +65 -0
- data/src/core/ext/transport/chttp2/transport/http2_ztrace_collector.h +0 -29
- data/src/core/ext/transport/chttp2/transport/internal.h +18 -8
- data/src/core/ext/transport/chttp2/transport/keepalive.cc +105 -0
- data/src/core/ext/transport/chttp2/transport/keepalive.h +138 -0
- data/src/core/ext/transport/chttp2/transport/message_assembler.h +185 -0
- data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -4
- data/src/core/ext/transport/chttp2/transport/ping_callbacks.h +19 -0
- data/src/core/ext/transport/chttp2/transport/ping_promise.cc +151 -0
- data/src/core/ext/transport/chttp2/transport/ping_promise.h +180 -0
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.cc +5 -9
- data/src/core/ext/transport/chttp2/transport/ping_rate_policy.h +11 -0
- data/src/core/ext/transport/chttp2/transport/stream_lists.cc +39 -1
- data/src/core/ext/transport/chttp2/transport/transport_common.cc +19 -0
- data/src/core/ext/transport/chttp2/transport/transport_common.h +27 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +37 -11
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb.h +571 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.c +120 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/channelz.upb_minitable.h +36 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb.h +1272 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.c +312 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/promise.upb_minitable.h +50 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +984 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +226 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +44 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.c +175 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/promise.upbdefs.h +82 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +135 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +67 -0
- data/src/core/filter/auth/auth_filters.h +0 -25
- data/src/core/filter/auth/client_auth_filter.cc +0 -118
- data/src/core/filter/filter_args.h +9 -23
- data/src/core/handshaker/handshaker.cc +23 -14
- data/src/core/handshaker/handshaker.h +3 -0
- data/src/core/handshaker/http_connect/http_connect_handshaker.cc +3 -1
- data/src/core/handshaker/security/legacy_secure_endpoint.cc +6 -5
- data/src/core/handshaker/security/secure_endpoint.cc +70 -25
- data/src/core/handshaker/security/security_handshaker.cc +4 -1
- data/src/core/handshaker/tcp_connect/tcp_connect_handshaker.cc +7 -1
- data/src/core/lib/channel/channel_args.cc +15 -0
- data/src/core/lib/channel/channel_args.h +3 -0
- data/src/core/lib/channel/channel_stack.cc +22 -23
- data/src/core/lib/channel/channel_stack.h +9 -7
- data/src/core/lib/channel/channel_stack_builder_impl.cc +1 -1
- data/src/core/lib/channel/channel_stack_builder_impl.h +2 -7
- data/src/core/lib/channel/promise_based_filter.h +5 -5
- data/src/core/lib/debug/trace_impl.h +0 -1
- data/src/core/lib/event_engine/ares_resolver.cc +165 -46
- data/src/core/lib/event_engine/ares_resolver.h +48 -2
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +3 -1
- data/src/core/lib/event_engine/cf_engine/cf_engine.h +1 -4
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +2 -6
- data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.cc +40 -0
- data/src/core/lib/event_engine/endpoint_channel_arg_wrapper.h +60 -0
- data/src/core/lib/event_engine/event_engine.cc +7 -0
- data/src/core/lib/event_engine/extensions/channelz.h +10 -6
- data/src/core/lib/event_engine/grpc_polled_fd.h +5 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +130 -162
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +11 -15
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +75 -117
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -9
- data/src/core/lib/event_engine/posix_engine/event_poller.h +18 -15
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +0 -18
- data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.cc +124 -0
- data/src/core/lib/event_engine/posix_engine/file_descriptor_collection.h +243 -0
- data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +29 -19
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +6 -2
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +6 -1
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +145 -92
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +9 -19
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +333 -116
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +61 -18
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +45 -37
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.h +6 -4
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.cc +32 -142
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener_utils.h +6 -5
- data/src/core/lib/event_engine/posix_engine/posix_interface.h +211 -0
- data/src/core/lib/event_engine/posix_engine/posix_interface_posix.cc +1083 -0
- data/src/core/lib/event_engine/posix_engine/posix_interface_windows.cc +281 -0
- data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.cc +154 -0
- data/src/core/lib/event_engine/posix_engine/posix_write_event_sink.h +174 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +3 -719
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +10 -170
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +33 -22
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +13 -11
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +117 -151
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +26 -94
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +26 -25
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +6 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +36 -62
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +6 -2
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +7 -6
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +12 -6
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +3 -1
- data/src/core/lib/event_engine/shim.cc +9 -0
- data/src/core/lib/event_engine/shim.h +3 -0
- data/src/core/lib/event_engine/thread_pool/thread_pool.h +7 -3
- data/src/core/lib/event_engine/thread_pool/thread_pool_factory.cc +0 -17
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.cc +4 -2
- data/src/core/lib/event_engine/thread_pool/work_stealing_thread_pool.h +3 -2
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +4 -0
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.h +4 -0
- data/src/core/lib/event_engine/windows/windows_endpoint.h +2 -6
- data/src/core/lib/event_engine/windows/windows_engine.cc +0 -1
- data/src/core/lib/event_engine/windows/windows_engine.h +1 -3
- data/src/core/lib/event_engine/windows/windows_listener.cc +14 -2
- data/src/core/lib/experiments/experiments.cc +45 -93
- data/src/core/lib/experiments/experiments.h +21 -51
- data/src/core/lib/iomgr/endpoint.cc +4 -3
- data/src/core/lib/iomgr/endpoint.h +7 -4
- data/src/core/lib/iomgr/endpoint_cfstream.cc +3 -2
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +7 -2
- data/src/core/lib/iomgr/ev_poll_posix.cc +7 -2
- data/src/core/lib/iomgr/event_engine_shims/endpoint.cc +4 -6
- data/src/core/lib/iomgr/tcp_posix.cc +12 -6
- data/src/core/lib/iomgr/tcp_windows.cc +3 -2
- data/src/core/lib/promise/activity.h +1 -0
- data/src/core/lib/promise/arena_promise.h +23 -7
- data/src/core/lib/promise/detail/promise_factory.h +10 -0
- data/src/core/lib/promise/detail/promise_like.h +118 -11
- data/src/core/lib/promise/detail/promise_variant.h +50 -0
- data/src/core/lib/promise/detail/seq_state.h +687 -548
- data/src/core/lib/promise/if.h +20 -0
- data/src/core/lib/promise/inter_activity_latch.h +147 -0
- data/src/core/lib/promise/inter_activity_mutex.h +547 -0
- data/src/core/lib/promise/loop.h +65 -3
- data/src/core/lib/promise/map.h +24 -0
- data/src/core/lib/promise/match_promise.h +103 -0
- data/src/core/lib/promise/mpsc.cc +425 -0
- data/src/core/lib/promise/mpsc.h +490 -0
- data/src/core/lib/promise/party.cc +50 -1
- data/src/core/lib/promise/party.h +66 -1
- data/src/core/lib/promise/race.h +31 -0
- data/src/core/lib/promise/seq.h +4 -1
- data/src/core/lib/promise/status_flag.h +7 -0
- data/src/core/lib/promise/try_seq.h +4 -1
- data/src/core/lib/promise/wait_set.cc +28 -0
- data/src/core/lib/promise/wait_set.h +86 -0
- data/src/core/lib/resource_quota/arena.h +19 -0
- data/src/core/lib/slice/slice.h +5 -0
- data/src/core/lib/surface/channel_create.cc +88 -13
- data/src/core/lib/surface/channel_create.h +4 -0
- data/src/core/lib/surface/channel_init.cc +164 -47
- data/src/core/lib/surface/channel_init.h +64 -1
- data/src/core/lib/surface/filter_stack_call.cc +18 -9
- data/src/core/lib/surface/init.cc +6 -15
- data/src/core/lib/surface/legacy_channel.cc +3 -5
- data/src/core/lib/surface/legacy_channel.h +3 -1
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/promise_endpoint.cc +110 -0
- data/src/core/lib/transport/promise_endpoint.h +307 -0
- data/src/core/load_balancing/child_policy_handler.cc +2 -4
- data/src/core/load_balancing/delegating_helper.h +2 -3
- data/src/core/load_balancing/health_check_client.cc +1 -5
- data/src/core/load_balancing/lb_policy.h +1 -3
- data/src/core/load_balancing/oob_backend_metric.cc +1 -5
- data/src/core/load_balancing/pick_first/pick_first.cc +3 -0
- data/src/core/load_balancing/xds/cds.cc +10 -1
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -0
- data/src/core/resolver/xds/xds_config.cc +6 -3
- data/src/core/resolver/xds/xds_config.h +9 -4
- data/src/core/resolver/xds/xds_dependency_manager.cc +21 -6
- data/src/core/resolver/xds/xds_dependency_manager.h +2 -1
- data/src/core/resolver/xds/xds_resolver.cc +31 -11
- data/src/core/server/server.cc +83 -12
- data/src/core/server/server.h +21 -2
- data/src/core/server/xds_server_config_fetcher.cc +63 -25
- data/src/core/service_config/service_config.h +1 -1
- data/src/core/service_config/service_config_impl.h +1 -1
- data/src/core/telemetry/context_list_entry.cc +38 -0
- data/src/core/telemetry/context_list_entry.h +42 -12
- data/src/core/telemetry/stats_data.cc +233 -207
- data/src/core/telemetry/stats_data.h +250 -153
- data/src/core/telemetry/tcp_tracer.h +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +11 -3
- data/src/core/tsi/fake_transport_security.cc +17 -0
- data/src/core/tsi/ssl_transport_security.cc +2 -0
- data/src/core/tsi/transport_security_grpc.cc +8 -0
- data/src/core/tsi/transport_security_grpc.h +15 -0
- data/src/core/util/backoff.cc +1 -5
- data/src/core/util/backoff.h +1 -0
- data/src/core/util/down_cast.h +1 -1
- data/src/core/util/function_signature.h +15 -1
- data/src/core/util/http_client/httpcli.cc +12 -5
- data/src/core/util/http_client/httpcli.h +4 -1
- data/src/core/util/latent_see.h +8 -5
- data/src/core/util/log.cc +4 -0
- data/src/core/util/memory_usage.h +268 -0
- data/src/core/util/per_cpu.cc +2 -0
- data/src/core/util/per_cpu.h +7 -0
- data/src/core/util/shared_bit_gen.h +20 -0
- data/src/core/util/single_set_ptr.h +2 -2
- data/src/core/util/upb_utils.h +42 -0
- data/src/core/util/uri.cc +3 -2
- data/src/core/util/useful.h +53 -2
- data/src/core/util/wait_for_single_owner.cc +31 -0
- data/src/core/util/wait_for_single_owner.h +24 -0
- data/src/core/xds/grpc/xds_bootstrap_grpc.cc +2 -0
- data/src/core/xds/grpc/xds_bootstrap_grpc.h +5 -0
- data/src/core/xds/grpc/xds_client_grpc.cc +6 -2
- data/src/core/xds/grpc/xds_common_types_parser.cc +138 -50
- data/src/core/xds/grpc/xds_common_types_parser.h +12 -0
- data/src/core/xds/grpc/xds_http_filter.h +7 -0
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.cc +22 -0
- data/src/core/xds/grpc/xds_http_gcp_authn_filter.h +3 -0
- data/src/core/xds/grpc/xds_route_config_parser.cc +15 -38
- data/src/core/xds/grpc/xds_server_grpc.cc +63 -13
- data/src/core/xds/grpc/xds_server_grpc.h +10 -2
- data/src/core/xds/grpc/xds_server_grpc_interface.h +4 -0
- data/src/core/xds/grpc/xds_transport_grpc.cc +18 -0
- data/src/core/xds/xds_client/xds_bootstrap.h +2 -0
- data/src/core/xds/xds_client/xds_client.cc +26 -5
- data/src/ruby/ext/grpc/extconf.rb +2 -0
- data/src/ruby/ext/grpc/rb_call.c +1 -8
- data/src/ruby/ext/grpc/rb_channel.c +72 -568
- data/src/ruby/ext/grpc/rb_channel.h +0 -3
- data/src/ruby/ext/grpc/rb_completion_queue.c +26 -14
- data/src/ruby/ext/grpc/rb_completion_queue.h +1 -7
- data/src/ruby/ext/grpc/rb_grpc.c +9 -5
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
- data/src/ruby/ext/grpc/rb_loader.c +0 -4
- data/src/ruby/ext/grpc/rb_server.c +31 -50
- data/src/ruby/lib/grpc/generic/client_stub.rb +4 -4
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/core_spec.rb +22 -0
- data/src/ruby/spec/generic/active_call_spec.rb +1 -1
- data/third_party/abseil-cpp/absl/algorithm/container.h +2 -19
- data/third_party/abseil-cpp/absl/base/attributes.h +76 -7
- data/third_party/abseil-cpp/absl/base/call_once.h +11 -12
- data/third_party/abseil-cpp/absl/base/config.h +20 -129
- data/third_party/abseil-cpp/absl/base/{internal/fast_type_id.h → fast_type_id.h} +11 -16
- data/third_party/abseil-cpp/absl/base/internal/cycleclock.cc +0 -5
- data/third_party/abseil-cpp/absl/base/internal/cycleclock_config.h +7 -7
- data/third_party/abseil-cpp/absl/base/internal/endian.h +34 -38
- data/third_party/abseil-cpp/absl/base/internal/iterator_traits.h +71 -0
- data/third_party/abseil-cpp/absl/base/internal/low_level_alloc.cc +6 -5
- data/third_party/abseil-cpp/absl/base/internal/{nullability_impl.h → nullability_deprecated.h} +45 -8
- data/third_party/abseil-cpp/absl/base/internal/spinlock.cc +0 -9
- data/third_party/abseil-cpp/absl/base/internal/spinlock.h +3 -13
- data/third_party/abseil-cpp/absl/base/internal/unaligned_access.h +6 -6
- data/third_party/abseil-cpp/absl/base/internal/unscaledcycleclock.h +8 -3
- data/third_party/abseil-cpp/absl/base/no_destructor.h +11 -32
- data/third_party/abseil-cpp/absl/base/nullability.h +84 -72
- data/third_party/abseil-cpp/absl/base/options.h +3 -80
- data/third_party/abseil-cpp/absl/base/policy_checks.h +7 -7
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +1 -3
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +3 -4
- data/third_party/abseil-cpp/absl/container/btree_map.h +4 -2
- data/third_party/abseil-cpp/absl/container/btree_set.h +4 -2
- data/third_party/abseil-cpp/absl/container/fixed_array.h +7 -14
- data/third_party/abseil-cpp/absl/container/flat_hash_map.h +5 -0
- data/third_party/abseil-cpp/absl/container/flat_hash_set.h +6 -1
- data/third_party/abseil-cpp/absl/container/inlined_vector.h +8 -5
- data/third_party/abseil-cpp/absl/container/internal/btree.h +132 -29
- data/third_party/abseil-cpp/absl/container/internal/btree_container.h +175 -71
- data/third_party/abseil-cpp/absl/container/internal/common.h +43 -0
- data/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h +1 -2
- data/third_party/abseil-cpp/absl/container/internal/container_memory.h +9 -10
- data/third_party/abseil-cpp/absl/container/internal/hash_function_defaults.h +1 -8
- data/third_party/abseil-cpp/absl/container/internal/hash_policy_traits.h +0 -4
- data/third_party/abseil-cpp/absl/container/internal/hashtable_control_bytes.h +527 -0
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc +20 -4
- data/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h +31 -12
- data/third_party/abseil-cpp/absl/container/internal/inlined_vector.h +2 -7
- data/third_party/abseil-cpp/absl/container/internal/layout.h +26 -42
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_map.h +199 -68
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc +1354 -183
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h +881 -1424
- data/third_party/abseil-cpp/absl/container/internal/raw_hash_set_resize_impl.h +80 -0
- data/third_party/abseil-cpp/absl/crc/crc32c.cc +0 -4
- data/third_party/abseil-cpp/absl/crc/crc32c.h +7 -5
- data/third_party/abseil-cpp/absl/crc/internal/crc32_x86_arm_combined_simd.h +0 -22
- data/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc +45 -74
- data/third_party/abseil-cpp/absl/debugging/internal/addresses.h +57 -0
- data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.cc +1 -1
- data/third_party/abseil-cpp/absl/debugging/internal/decode_rust_punycode.h +5 -5
- data/third_party/abseil-cpp/absl/debugging/internal/demangle.cc +8 -35
- data/third_party/abseil-cpp/absl/debugging/internal/demangle_rust.cc +16 -16
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_aarch64-inl.inc +40 -37
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_arm-inl.inc +16 -7
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_emscripten-inl.inc +14 -5
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_generic-inl.inc +10 -4
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_powerpc-inl.inc +27 -16
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_riscv-inl.inc +13 -4
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_unimplemented-inl.inc +4 -3
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_win32-inl.inc +15 -28
- data/third_party/abseil-cpp/absl/debugging/internal/stacktrace_x86-inl.inc +19 -9
- data/third_party/abseil-cpp/absl/debugging/stacktrace.cc +144 -27
- data/third_party/abseil-cpp/absl/debugging/stacktrace.h +73 -5
- data/third_party/abseil-cpp/absl/debugging/symbolize_elf.inc +19 -9
- data/third_party/abseil-cpp/absl/debugging/symbolize_emscripten.inc +3 -2
- data/third_party/abseil-cpp/absl/debugging/symbolize_win32.inc +25 -6
- data/third_party/abseil-cpp/absl/flags/commandlineflag.h +2 -2
- data/third_party/abseil-cpp/absl/flags/flag.h +4 -3
- data/third_party/abseil-cpp/absl/flags/internal/commandlineflag.h +2 -2
- data/third_party/abseil-cpp/absl/flags/internal/flag.cc +2 -1
- data/third_party/abseil-cpp/absl/flags/internal/flag.h +7 -6
- data/third_party/abseil-cpp/absl/flags/internal/registry.h +4 -3
- data/third_party/abseil-cpp/absl/flags/reflection.cc +2 -3
- data/third_party/abseil-cpp/absl/functional/any_invocable.h +8 -10
- data/third_party/abseil-cpp/absl/functional/function_ref.h +2 -9
- data/third_party/abseil-cpp/absl/functional/internal/any_invocable.h +110 -226
- data/third_party/abseil-cpp/absl/functional/internal/front_binder.h +10 -12
- data/third_party/abseil-cpp/absl/functional/internal/function_ref.h +2 -5
- data/third_party/abseil-cpp/absl/hash/hash.h +18 -0
- data/third_party/abseil-cpp/absl/hash/internal/hash.cc +1 -5
- data/third_party/abseil-cpp/absl/hash/internal/hash.h +86 -61
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.cc +25 -68
- data/third_party/abseil-cpp/absl/hash/internal/low_level_hash.h +2 -6
- data/third_party/abseil-cpp/absl/hash/internal/weakly_mixed_integer.h +38 -0
- data/third_party/abseil-cpp/absl/log/check.h +2 -1
- data/third_party/abseil-cpp/absl/log/globals.h +4 -5
- data/third_party/abseil-cpp/absl/log/internal/append_truncated.h +28 -0
- data/third_party/abseil-cpp/absl/log/internal/check_op.cc +22 -22
- data/third_party/abseil-cpp/absl/log/internal/check_op.h +65 -62
- data/third_party/abseil-cpp/absl/log/internal/conditions.cc +5 -3
- data/third_party/abseil-cpp/absl/log/internal/conditions.h +7 -2
- data/third_party/abseil-cpp/absl/log/internal/log_message.cc +85 -43
- data/third_party/abseil-cpp/absl/log/internal/log_message.h +84 -59
- data/third_party/abseil-cpp/absl/log/internal/nullstream.h +1 -0
- data/third_party/abseil-cpp/absl/log/internal/proto.cc +3 -2
- data/third_party/abseil-cpp/absl/log/internal/proto.h +3 -3
- data/third_party/abseil-cpp/absl/log/internal/strip.h +4 -12
- data/third_party/abseil-cpp/absl/log/internal/vlog_config.h +8 -6
- data/third_party/abseil-cpp/absl/log/internal/voidify.h +10 -4
- data/third_party/abseil-cpp/absl/log/log.h +48 -35
- data/third_party/abseil-cpp/absl/log/log_sink_registry.h +2 -2
- data/third_party/abseil-cpp/absl/meta/type_traits.h +46 -175
- data/third_party/abseil-cpp/absl/numeric/bits.h +68 -2
- data/third_party/abseil-cpp/absl/numeric/int128.cc +0 -52
- data/third_party/abseil-cpp/absl/numeric/internal/bits.h +7 -3
- data/third_party/abseil-cpp/absl/profiling/internal/exponential_biased.cc +1 -1
- data/third_party/abseil-cpp/absl/random/bit_gen_ref.h +10 -11
- data/third_party/abseil-cpp/absl/random/distributions.h +6 -8
- data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +1 -1
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +5 -6
- data/third_party/abseil-cpp/absl/random/internal/{pool_urbg.cc → entropy_pool.cc} +22 -90
- data/third_party/abseil-cpp/absl/random/internal/entropy_pool.h +35 -0
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +5 -6
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +1 -1
- data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +20 -12
- data/third_party/abseil-cpp/absl/random/internal/seed_material.h +5 -5
- data/third_party/abseil-cpp/absl/random/random.h +88 -53
- data/third_party/abseil-cpp/absl/random/seed_sequences.cc +6 -2
- data/third_party/abseil-cpp/absl/status/internal/status_internal.cc +3 -4
- data/third_party/abseil-cpp/absl/status/internal/status_internal.h +3 -4
- data/third_party/abseil-cpp/absl/status/internal/statusor_internal.h +4 -3
- data/third_party/abseil-cpp/absl/status/status.cc +4 -8
- data/third_party/abseil-cpp/absl/status/status.h +8 -8
- data/third_party/abseil-cpp/absl/status/status_payload_printer.h +2 -2
- data/third_party/abseil-cpp/absl/status/statusor.cc +2 -2
- data/third_party/abseil-cpp/absl/status/statusor.h +6 -6
- data/third_party/abseil-cpp/absl/strings/ascii.cc +9 -9
- data/third_party/abseil-cpp/absl/strings/ascii.h +18 -18
- data/third_party/abseil-cpp/absl/strings/charconv.cc +21 -22
- data/third_party/abseil-cpp/absl/strings/charconv.h +5 -5
- data/third_party/abseil-cpp/absl/strings/cord.cc +54 -58
- data/third_party/abseil-cpp/absl/strings/cord.h +94 -83
- data/third_party/abseil-cpp/absl/strings/cord_analysis.cc +11 -11
- data/third_party/abseil-cpp/absl/strings/cord_analysis.h +3 -3
- data/third_party/abseil-cpp/absl/strings/escaping.cc +130 -149
- data/third_party/abseil-cpp/absl/strings/escaping.h +9 -10
- data/third_party/abseil-cpp/absl/strings/internal/charconv_bigint.cc +1 -1
- data/third_party/abseil-cpp/absl/strings/internal/cord_internal.h +6 -8
- data/third_party/abseil-cpp/absl/strings/internal/cord_rep_btree.cc +0 -4
- data/third_party/abseil-cpp/absl/strings/internal/cordz_info.cc +0 -4
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.cc +7 -63
- data/third_party/abseil-cpp/absl/strings/internal/str_format/arg.h +1 -11
- data/third_party/abseil-cpp/absl/strings/internal/str_format/extension.cc +0 -22
- data/third_party/abseil-cpp/absl/strings/internal/str_format/output.cc +5 -3
- data/third_party/abseil-cpp/absl/strings/internal/str_format/parser.h +4 -2
- data/third_party/abseil-cpp/absl/strings/internal/str_join_internal.h +3 -3
- data/third_party/abseil-cpp/absl/strings/internal/string_constant.h +0 -5
- data/third_party/abseil-cpp/absl/strings/internal/utf8.cc +96 -1
- data/third_party/abseil-cpp/absl/strings/internal/utf8.h +15 -1
- data/third_party/abseil-cpp/absl/strings/numbers.cc +53 -32
- data/third_party/abseil-cpp/absl/strings/numbers.h +87 -58
- data/third_party/abseil-cpp/absl/strings/str_cat.cc +6 -7
- data/third_party/abseil-cpp/absl/strings/str_cat.h +32 -32
- data/third_party/abseil-cpp/absl/strings/str_format.h +18 -18
- data/third_party/abseil-cpp/absl/strings/str_replace.cc +3 -3
- data/third_party/abseil-cpp/absl/strings/str_replace.h +6 -6
- data/third_party/abseil-cpp/absl/strings/string_view.cc +4 -9
- data/third_party/abseil-cpp/absl/strings/string_view.h +27 -32
- data/third_party/abseil-cpp/absl/strings/strip.h +4 -4
- data/third_party/abseil-cpp/absl/strings/substitute.cc +5 -4
- data/third_party/abseil-cpp/absl/strings/substitute.h +66 -64
- data/third_party/abseil-cpp/absl/synchronization/internal/futex_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/kernel_timeout.cc +0 -5
- data/third_party/abseil-cpp/absl/synchronization/internal/pthread_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/sem_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/stdcpp_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/waiter_base.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/internal/win32_waiter.cc +0 -4
- data/third_party/abseil-cpp/absl/synchronization/mutex.cc +1 -1
- data/third_party/abseil-cpp/absl/synchronization/mutex.h +97 -69
- data/third_party/abseil-cpp/absl/synchronization/notification.h +1 -1
- data/third_party/abseil-cpp/absl/time/civil_time.cc +1 -0
- data/third_party/abseil-cpp/absl/time/duration.cc +12 -7
- data/third_party/abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h +1 -1
- data/third_party/abseil-cpp/absl/time/internal/cctz/src/time_zone_lookup.cc +90 -111
- data/third_party/abseil-cpp/absl/time/time.h +20 -15
- data/third_party/abseil-cpp/absl/types/optional.h +7 -747
- data/third_party/abseil-cpp/absl/types/span.h +13 -11
- data/third_party/abseil-cpp/absl/types/variant.h +5 -784
- data/third_party/abseil-cpp/absl/utility/utility.h +10 -185
- metadata +72 -20
- data/src/core/lib/event_engine/forkable.cc +0 -105
- data/src/core/lib/event_engine/forkable.h +0 -67
- data/src/core/lib/iomgr/python_util.h +0 -46
- data/third_party/abseil-cpp/absl/base/internal/inline_variable.h +0 -108
- data/third_party/abseil-cpp/absl/base/internal/invoke.h +0 -241
- data/third_party/abseil-cpp/absl/log/log_entry.cc +0 -41
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +0 -131
- data/third_party/abseil-cpp/absl/types/bad_optional_access.cc +0 -66
- data/third_party/abseil-cpp/absl/types/bad_optional_access.h +0 -78
- data/third_party/abseil-cpp/absl/types/bad_variant_access.cc +0 -82
- data/third_party/abseil-cpp/absl/types/bad_variant_access.h +0 -82
- data/third_party/abseil-cpp/absl/types/internal/optional.h +0 -352
- 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 =
|
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
|
-
|
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
|
-
|
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
|
|