grpc 1.50.0-x86_64-linux → 1.51.0-x86_64-linux
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +131 -42
- data/include/grpc/event_engine/event_engine.h +10 -3
- data/include/grpc/event_engine/slice_buffer.h +17 -0
- data/include/grpc/grpc.h +0 -10
- data/include/grpc/impl/codegen/grpc_types.h +1 -5
- data/include/grpc/impl/codegen/port_platform.h +0 -3
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +19 -13
- data/src/core/ext/filters/channel_idle/channel_idle_filter.h +1 -0
- data/src/core/ext/filters/client_channel/backup_poller.cc +3 -3
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +7 -5
- data/src/core/ext/filters/client_channel/client_channel.cc +120 -140
- data/src/core/ext/filters/client_channel/client_channel.h +3 -4
- data/src/core/ext/filters/client_channel/client_channel_channelz.cc +0 -2
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel_service_config.cc +153 -0
- data/src/core/ext/filters/client_channel/{resolver_result_parsing.h → client_channel_service_config.h} +26 -23
- data/src/core/ext/filters/client_channel/connector.h +1 -1
- data/src/core/ext/filters/client_channel/dynamic_filters.cc +20 -47
- data/src/core/ext/filters/client_channel/dynamic_filters.h +7 -8
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +3 -4
- data/src/core/ext/filters/client_channel/http_proxy.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +5 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +8 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +35 -44
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.cc +0 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +1 -3
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +3 -4
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +41 -29
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +2 -2
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +9 -11
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +15 -12
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +8 -10
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +26 -27
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +7 -9
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +44 -26
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +17 -27
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_attributes.cc +42 -0
- data/src/core/ext/filters/client_channel/lb_policy/xds/{xds.h → xds_attributes.h} +15 -17
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +13 -7
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +48 -47
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +40 -126
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_wrr_locality.cc +364 -0
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +9 -9
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +23 -32
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +1 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +22 -23
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +50 -52
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +2 -4
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +1 -3
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +34 -26
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +3 -4
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +4 -7
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +63 -46
- data/src/core/ext/filters/client_channel/retry_filter.cc +80 -102
- data/src/core/ext/filters/client_channel/retry_service_config.cc +192 -234
- data/src/core/ext/filters/client_channel/retry_service_config.h +20 -23
- data/src/core/ext/filters/client_channel/retry_throttle.cc +8 -8
- data/src/core/ext/filters/client_channel/retry_throttle.h +8 -7
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +2 -2
- data/src/core/ext/filters/client_channel/subchannel.cc +21 -25
- data/src/core/ext/filters/client_channel/subchannel.h +2 -2
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +11 -12
- data/src/core/ext/filters/deadline/deadline_filter.cc +13 -14
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +1 -1
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +0 -4
- data/src/core/ext/filters/fault_injection/fault_injection_service_config_parser.cc +118 -0
- data/src/core/ext/filters/fault_injection/{service_config_parser.h → fault_injection_service_config_parser.h} +20 -12
- data/src/core/ext/filters/http/client/http_client_filter.cc +16 -16
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -1
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +13 -13
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +34 -34
- data/src/core/ext/filters/http/server/http_server_filter.cc +26 -25
- data/src/core/ext/filters/message_size/message_size_filter.cc +86 -117
- data/src/core/ext/filters/message_size/message_size_filter.h +22 -15
- data/src/core/ext/filters/rbac/rbac_filter.cc +12 -12
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +728 -530
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +4 -3
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +1 -1
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +6 -7
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +17 -21
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +57 -72
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +5 -5
- data/src/core/ext/transport/chttp2/transport/bin_encoder.h +1 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +212 -253
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +42 -11
- data/src/core/ext/transport/chttp2/transport/flow_control.h +4 -3
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +16 -15
- data/src/core/ext/transport/chttp2/transport/frame_data.h +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_goaway.cc +13 -13
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +4 -3
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.cc +10 -7
- data/src/core/ext/transport/chttp2/transport/frame_settings.cc +15 -17
- data/src/core/ext/transport/chttp2/transport/frame_window_update.cc +5 -4
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +5 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +31 -39
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +7 -6
- data/src/core/ext/transport/chttp2/transport/internal.h +24 -8
- data/src/core/ext/transport/chttp2/transport/parsing.cc +51 -52
- data/src/core/ext/transport/chttp2/transport/varint.cc +2 -3
- data/src/core/ext/transport/chttp2/transport/varint.h +11 -8
- data/src/core/ext/transport/chttp2/transport/writing.cc +16 -16
- data/src/core/ext/transport/inproc/inproc_transport.cc +97 -115
- data/src/core/ext/xds/certificate_provider_store.cc +4 -4
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +4 -7
- data/src/core/ext/xds/xds_api.cc +15 -68
- data/src/core/ext/xds/xds_api.h +3 -7
- data/src/core/ext/xds/xds_bootstrap.h +0 -1
- data/src/core/ext/xds/xds_bootstrap_grpc.cc +3 -12
- data/src/core/ext/xds/xds_bootstrap_grpc.h +16 -1
- data/src/core/ext/xds/xds_certificate_provider.cc +22 -25
- data/src/core/ext/xds/xds_channel_stack_modifier.cc +0 -1
- data/src/core/ext/xds/xds_client.cc +122 -90
- data/src/core/ext/xds/xds_client.h +7 -2
- data/src/core/ext/xds/xds_client_grpc.cc +5 -24
- data/src/core/ext/xds/xds_cluster.cc +291 -183
- data/src/core/ext/xds/xds_cluster.h +11 -15
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +32 -29
- data/src/core/ext/xds/xds_cluster_specifier_plugin.h +35 -16
- data/src/core/ext/xds/xds_common_types.cc +208 -141
- data/src/core/ext/xds/xds_common_types.h +19 -13
- data/src/core/ext/xds/xds_endpoint.cc +214 -129
- data/src/core/ext/xds/xds_endpoint.h +4 -7
- data/src/core/ext/xds/xds_http_fault_filter.cc +56 -43
- data/src/core/ext/xds/xds_http_fault_filter.h +13 -21
- data/src/core/ext/xds/xds_http_filters.cc +60 -73
- data/src/core/ext/xds/xds_http_filters.h +67 -19
- data/src/core/ext/xds/xds_http_rbac_filter.cc +152 -207
- data/src/core/ext/xds/xds_http_rbac_filter.h +12 -15
- data/src/core/ext/xds/xds_lb_policy_registry.cc +122 -169
- data/src/core/ext/xds/xds_lb_policy_registry.h +10 -11
- data/src/core/ext/xds/xds_listener.cc +459 -417
- data/src/core/ext/xds/xds_listener.h +43 -47
- data/src/core/ext/xds/xds_resource_type.h +3 -11
- data/src/core/ext/xds/xds_resource_type_impl.h +8 -13
- data/src/core/ext/xds/xds_route_config.cc +94 -80
- data/src/core/ext/xds/xds_route_config.h +10 -10
- data/src/core/ext/xds/xds_routing.cc +2 -1
- data/src/core/ext/xds/xds_routing.h +2 -0
- data/src/core/ext/xds/xds_server_config_fetcher.cc +109 -94
- data/src/core/ext/xds/xds_transport_grpc.cc +4 -5
- data/src/core/lib/address_utils/parse_address.cc +11 -10
- data/src/core/lib/channel/channel_args.h +16 -1
- data/src/core/lib/channel/channel_stack.cc +23 -20
- data/src/core/lib/channel/channel_stack.h +17 -4
- data/src/core/lib/channel/channel_stack_builder.cc +4 -7
- data/src/core/lib/channel/channel_stack_builder.h +14 -6
- data/src/core/lib/channel/channel_stack_builder_impl.cc +25 -7
- data/src/core/lib/channel/channel_stack_builder_impl.h +2 -0
- data/src/core/lib/channel/channel_trace.cc +4 -5
- data/src/core/lib/channel/channelz.cc +1 -1
- data/src/core/lib/channel/connected_channel.cc +695 -35
- data/src/core/lib/channel/connected_channel.h +0 -4
- data/src/core/lib/channel/promise_based_filter.cc +1004 -140
- data/src/core/lib/channel/promise_based_filter.h +364 -87
- data/src/core/lib/compression/message_compress.cc +5 -5
- data/src/core/lib/debug/event_log.cc +88 -0
- data/src/core/lib/debug/event_log.h +81 -0
- data/src/core/lib/debug/histogram_view.cc +69 -0
- data/src/core/lib/{slice/slice_refcount.cc → debug/histogram_view.h} +15 -13
- data/src/core/lib/debug/stats.cc +22 -119
- data/src/core/lib/debug/stats.h +29 -35
- data/src/core/lib/debug/stats_data.cc +224 -73
- data/src/core/lib/debug/stats_data.h +263 -122
- data/src/core/lib/event_engine/common_closures.h +71 -0
- data/src/core/lib/event_engine/default_event_engine.cc +38 -15
- data/src/core/lib/event_engine/default_event_engine.h +15 -3
- data/src/core/lib/event_engine/default_event_engine_factory.cc +2 -4
- data/src/core/lib/event_engine/memory_allocator.cc +1 -1
- data/src/core/lib/event_engine/poller.h +10 -4
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +618 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +129 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +901 -0
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +97 -0
- data/src/core/lib/event_engine/posix_engine/event_poller.h +111 -0
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +74 -0
- data/src/core/lib/event_engine/{executor/threaded_executor.cc → posix_engine/event_poller_posix_default.h} +13 -16
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.cc +77 -0
- data/src/core/lib/event_engine/posix_engine/internal_errqueue.h +179 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +267 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.h +73 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +1270 -0
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.h +682 -0
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +453 -18
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +148 -24
- data/src/core/lib/event_engine/posix_engine/posix_engine_closure.h +80 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.cc +1081 -0
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +361 -0
- data/src/core/lib/event_engine/posix_engine/timer.h +9 -8
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +57 -194
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +21 -49
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.cc +301 -0
- data/src/core/lib/event_engine/posix_engine/traced_buffer_list.h +179 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.cc +126 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_eventfd.h +45 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.cc +151 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_pipe.h +45 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix.h +76 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.cc +67 -0
- data/src/core/lib/event_engine/posix_engine/wakeup_fd_posix_default.h +37 -0
- data/src/core/lib/event_engine/slice.cc +7 -6
- data/src/core/lib/event_engine/slice_buffer.cc +2 -2
- data/src/core/lib/event_engine/thread_pool.cc +106 -25
- data/src/core/lib/event_engine/thread_pool.h +32 -9
- data/src/core/lib/event_engine/windows/win_socket.cc +7 -7
- data/src/core/lib/event_engine/windows/windows_engine.cc +18 -12
- data/src/core/lib/event_engine/windows/windows_engine.h +8 -4
- data/src/core/lib/experiments/config.cc +1 -1
- data/src/core/lib/experiments/experiments.cc +13 -2
- data/src/core/lib/experiments/experiments.h +8 -1
- data/src/core/lib/gpr/cpu_linux.cc +6 -2
- data/src/core/lib/gpr/log_linux.cc +3 -4
- data/src/core/lib/gpr/string.h +1 -1
- data/src/core/lib/gpr/tmpfile_posix.cc +3 -2
- data/src/core/lib/gprpp/load_file.cc +75 -0
- data/src/core/lib/gprpp/load_file.h +33 -0
- data/src/core/lib/gprpp/per_cpu.h +46 -0
- data/src/core/lib/gprpp/stat_posix.cc +5 -4
- data/src/core/lib/gprpp/stat_windows.cc +3 -2
- data/src/core/lib/gprpp/status_helper.h +1 -3
- data/src/core/lib/gprpp/strerror.cc +41 -0
- data/src/core/{ext/xds/xds_resource_type.cc → lib/gprpp/strerror.h} +9 -13
- data/src/core/lib/gprpp/thd_windows.cc +1 -2
- data/src/core/lib/gprpp/time.cc +3 -4
- data/src/core/lib/gprpp/time.h +13 -2
- data/src/core/lib/gprpp/validation_errors.h +18 -1
- data/src/core/lib/http/httpcli.cc +40 -44
- data/src/core/lib/http/httpcli.h +6 -5
- data/src/core/lib/http/httpcli_security_connector.cc +4 -6
- data/src/core/lib/http/parser.cc +54 -65
- data/src/core/lib/iomgr/buffer_list.cc +105 -116
- data/src/core/lib/iomgr/buffer_list.h +60 -44
- data/src/core/lib/iomgr/call_combiner.cc +11 -10
- data/src/core/lib/iomgr/call_combiner.h +3 -4
- data/src/core/lib/iomgr/cfstream_handle.cc +13 -16
- data/src/core/lib/iomgr/closure.h +49 -5
- data/src/core/lib/iomgr/combiner.cc +2 -2
- data/src/core/lib/iomgr/endpoint.h +1 -1
- data/src/core/lib/iomgr/endpoint_cfstream.cc +26 -25
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +2 -2
- data/src/core/lib/iomgr/error.cc +27 -42
- data/src/core/lib/iomgr/error.h +22 -152
- data/src/core/lib/iomgr/ev_apple.cc +4 -4
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +26 -25
- data/src/core/lib/iomgr/ev_poll_posix.cc +27 -31
- data/src/core/lib/iomgr/exec_ctx.cc +3 -4
- data/src/core/lib/iomgr/exec_ctx.h +2 -3
- data/src/core/lib/iomgr/executor.cc +1 -2
- data/src/core/lib/iomgr/internal_errqueue.cc +3 -1
- data/src/core/lib/iomgr/iocp_windows.cc +1 -0
- data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -1
- data/src/core/lib/iomgr/iomgr_windows.cc +2 -1
- data/src/core/lib/iomgr/load_file.cc +5 -9
- data/src/core/lib/iomgr/lockfree_event.cc +10 -10
- data/src/core/lib/iomgr/pollset_windows.cc +4 -4
- data/src/core/lib/iomgr/python_util.h +2 -2
- data/src/core/lib/iomgr/resolve_address.cc +8 -3
- data/src/core/lib/iomgr/resolve_address.h +3 -4
- data/src/core/lib/iomgr/resolve_address_impl.h +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +14 -25
- data/src/core/lib/iomgr/resolve_address_posix.h +1 -2
- data/src/core/lib/iomgr/resolve_address_windows.cc +14 -17
- data/src/core/lib/iomgr/resolve_address_windows.h +1 -2
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +30 -29
- data/src/core/lib/iomgr/socket_utils_posix.cc +1 -0
- data/src/core/lib/iomgr/socket_utils_posix.h +2 -2
- data/src/core/lib/iomgr/socket_windows.cc +2 -2
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -10
- data/src/core/lib/iomgr/tcp_client_posix.cc +31 -35
- data/src/core/lib/iomgr/tcp_client_windows.cc +8 -12
- data/src/core/lib/iomgr/tcp_posix.cc +92 -108
- data/src/core/lib/iomgr/tcp_server_posix.cc +34 -34
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +18 -21
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +12 -13
- data/src/core/lib/iomgr/tcp_server_utils_posix_noifaddrs.cc +1 -1
- data/src/core/lib/iomgr/tcp_server_windows.cc +26 -29
- data/src/core/lib/iomgr/tcp_windows.cc +27 -34
- data/src/core/lib/iomgr/timer.h +8 -8
- data/src/core/lib/iomgr/timer_generic.cc +9 -15
- data/src/core/lib/iomgr/unix_sockets_posix.cc +2 -4
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +4 -3
- data/src/core/lib/iomgr/wakeup_fd_pipe.cc +10 -8
- data/src/core/lib/json/json_channel_args.h +42 -0
- data/src/core/lib/json/json_object_loader.cc +7 -2
- data/src/core/lib/json/json_object_loader.h +22 -0
- data/src/core/lib/json/json_util.cc +5 -5
- data/src/core/lib/json/json_util.h +4 -4
- data/src/core/lib/load_balancing/lb_policy.cc +1 -1
- data/src/core/lib/load_balancing/lb_policy.h +4 -0
- data/src/core/lib/load_balancing/subchannel_interface.h +0 -7
- data/src/core/lib/matchers/matchers.cc +3 -4
- data/src/core/lib/promise/activity.cc +16 -2
- data/src/core/lib/promise/activity.h +38 -15
- data/src/core/lib/promise/arena_promise.h +80 -51
- data/src/core/lib/promise/context.h +13 -6
- data/src/core/lib/promise/detail/basic_seq.h +9 -28
- data/src/core/lib/promise/detail/promise_factory.h +58 -10
- data/src/core/lib/promise/detail/status.h +28 -0
- data/src/core/lib/promise/detail/switch.h +1455 -0
- data/src/core/lib/promise/exec_ctx_wakeup_scheduler.h +3 -1
- data/src/core/lib/promise/for_each.h +129 -0
- data/src/core/lib/promise/loop.h +7 -5
- data/src/core/lib/promise/map_pipe.h +87 -0
- data/src/core/lib/promise/pipe.cc +19 -0
- data/src/core/lib/promise/pipe.h +505 -0
- data/src/core/lib/promise/poll.h +13 -0
- data/src/core/lib/promise/seq.h +3 -5
- data/src/core/lib/promise/sleep.cc +5 -4
- data/src/core/lib/promise/sleep.h +1 -2
- data/src/core/lib/promise/try_concurrently.h +341 -0
- data/src/core/lib/promise/try_seq.h +10 -13
- data/src/core/lib/resolver/server_address.cc +1 -0
- data/src/core/lib/resolver/server_address.h +1 -3
- data/src/core/lib/resource_quota/api.cc +0 -1
- data/src/core/lib/resource_quota/arena.cc +19 -0
- data/src/core/lib/resource_quota/arena.h +89 -0
- data/src/core/lib/resource_quota/memory_quota.cc +1 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +1 -3
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +4 -2
- data/src/core/lib/security/authorization/matchers.cc +25 -22
- data/src/core/lib/security/authorization/rbac_policy.cc +2 -3
- data/src/core/lib/security/context/security_context.h +10 -0
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +3 -4
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +1 -1
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +77 -55
- data/src/core/lib/security/credentials/external/aws_request_signer.cc +4 -3
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +40 -51
- data/src/core/lib/security/credentials/external/file_external_account_credentials.cc +17 -21
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +21 -25
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +27 -24
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +1 -0
- data/src/core/lib/security/credentials/jwt/json_token.cc +1 -2
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +5 -5
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +24 -30
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -5
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +3 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.cc +19 -27
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_distributor.h +4 -11
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +29 -41
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_verifier.cc +1 -1
- data/src/core/lib/security/security_connector/alts/alts_security_connector.cc +6 -11
- data/src/core/lib/security/security_connector/fake/fake_security_connector.cc +8 -15
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.cc +2 -2
- data/src/core/lib/security/security_connector/insecure/insecure_security_connector.h +2 -6
- data/src/core/lib/security/security_connector/load_system_roots_supported.cc +1 -4
- data/src/core/lib/security/security_connector/local/local_security_connector.cc +7 -11
- data/src/core/lib/security/security_connector/ssl/ssl_security_connector.cc +9 -14
- data/src/core/lib/security/security_connector/ssl_utils.cc +5 -7
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +21 -27
- data/src/core/lib/security/transport/client_auth_filter.cc +1 -1
- data/src/core/lib/security/transport/secure_endpoint.cc +26 -28
- data/src/core/lib/security/transport/security_handshaker.cc +53 -53
- data/src/core/lib/security/transport/server_auth_filter.cc +21 -21
- data/src/core/lib/security/transport/tsi_error.cc +6 -3
- data/src/core/lib/security/util/json_util.cc +4 -5
- data/src/core/lib/service_config/service_config.h +1 -1
- data/src/core/lib/service_config/service_config_impl.cc +111 -158
- data/src/core/lib/service_config/service_config_impl.h +14 -17
- data/src/core/lib/service_config/service_config_parser.cc +14 -31
- data/src/core/lib/service_config/service_config_parser.h +14 -10
- data/src/core/lib/slice/b64.cc +2 -2
- data/src/core/lib/slice/slice.cc +7 -1
- data/src/core/lib/slice/slice.h +19 -6
- data/src/core/lib/slice/slice_buffer.cc +13 -14
- data/src/core/lib/slice/slice_internal.h +13 -21
- data/src/core/lib/slice/slice_refcount.h +34 -19
- data/src/core/lib/surface/byte_buffer.cc +3 -4
- data/src/core/lib/surface/byte_buffer_reader.cc +4 -4
- data/src/core/lib/surface/call.cc +1366 -239
- data/src/core/lib/surface/call.h +44 -0
- data/src/core/lib/surface/call_details.cc +3 -3
- data/src/core/lib/surface/call_trace.cc +113 -0
- data/src/core/lib/surface/call_trace.h +30 -0
- data/src/core/lib/surface/channel.cc +44 -49
- data/src/core/lib/surface/channel.h +9 -1
- data/src/core/lib/surface/channel_ping.cc +1 -1
- data/src/core/lib/surface/channel_stack_type.cc +4 -0
- data/src/core/lib/surface/channel_stack_type.h +2 -0
- data/src/core/lib/surface/completion_queue.cc +38 -52
- data/src/core/lib/surface/init.cc +8 -39
- data/src/core/lib/surface/init_internally.h +8 -0
- data/src/core/lib/surface/lame_client.cc +10 -8
- data/src/core/lib/surface/server.cc +48 -70
- data/src/core/lib/surface/server.h +3 -4
- data/src/core/lib/surface/validate_metadata.cc +11 -12
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/connectivity_state.cc +2 -2
- data/src/core/lib/transport/error_utils.cc +34 -28
- data/src/core/lib/transport/error_utils.h +3 -3
- data/src/core/lib/transport/handshaker.cc +14 -14
- data/src/core/lib/transport/handshaker.h +1 -1
- data/src/core/lib/transport/handshaker_factory.h +26 -0
- data/src/core/lib/transport/handshaker_registry.cc +8 -2
- data/src/core/lib/transport/handshaker_registry.h +3 -4
- data/src/core/lib/transport/http_connect_handshaker.cc +23 -24
- data/src/core/lib/transport/metadata_batch.h +17 -1
- data/src/core/lib/transport/parsed_metadata.cc +2 -6
- data/src/core/lib/transport/tcp_connect_handshaker.cc +15 -20
- data/src/core/lib/transport/transport.cc +63 -17
- data/src/core/lib/transport/transport.h +64 -68
- data/src/core/lib/transport/transport_impl.h +1 -1
- data/src/core/lib/transport/transport_op_string.cc +7 -6
- data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -10
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +2 -14
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +10 -10
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +8 -8
- data/src/core/tsi/alts/handshaker/alts_tsi_utils.cc +2 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_integrity_only_record_protocol.cc +7 -7
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_privacy_integrity_record_protocol.cc +7 -6
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_grpc_record_protocol_common.cc +1 -1
- data/src/core/tsi/alts/zero_copy_frame_protector/alts_zero_copy_grpc_protector.cc +5 -5
- data/src/core/tsi/fake_transport_security.cc +3 -3
- data/src/core/tsi/ssl/key_logging/ssl_key_logging.cc +7 -3
- data/src/core/tsi/ssl/session_cache/ssl_session_boringssl.cc +1 -1
- data/src/core/tsi/ssl/session_cache/ssl_session_openssl.cc +6 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +0 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +0 -3
- data/src/ruby/lib/grpc/2.6/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/2.7/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/3.0/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/3.1/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/grpc_c.so +0 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/channel_spec.rb +0 -43
- data/src/ruby/spec/generic/active_call_spec.rb +12 -3
- data/third_party/abseil-cpp/absl/cleanup/cleanup.h +140 -0
- data/third_party/abseil-cpp/absl/cleanup/internal/cleanup.h +100 -0
- data/third_party/zlib/compress.c +3 -3
- data/third_party/zlib/crc32.c +21 -12
- data/third_party/zlib/deflate.c +112 -106
- data/third_party/zlib/deflate.h +2 -2
- data/third_party/zlib/gzlib.c +1 -1
- data/third_party/zlib/gzread.c +3 -5
- data/third_party/zlib/gzwrite.c +1 -1
- data/third_party/zlib/infback.c +10 -7
- data/third_party/zlib/inflate.c +5 -2
- data/third_party/zlib/inftrees.c +2 -2
- data/third_party/zlib/inftrees.h +1 -1
- data/third_party/zlib/trees.c +61 -62
- data/third_party/zlib/uncompr.c +2 -2
- data/third_party/zlib/zconf.h +16 -3
- data/third_party/zlib/zlib.h +10 -10
- data/third_party/zlib/zutil.c +9 -7
- data/third_party/zlib/zutil.h +1 -0
- metadata +55 -18
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +0 -188
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +0 -187
- data/src/core/lib/event_engine/executor/threaded_executor.h +0 -44
- data/src/core/lib/gpr/murmur_hash.cc +0 -82
- data/src/core/lib/gpr/murmur_hash.h +0 -29
- data/src/core/lib/gpr/tls.h +0 -156
- data/src/core/lib/promise/call_push_pull.h +0 -148
- data/src/core/lib/slice/slice_api.cc +0 -39
- data/src/core/lib/slice/slice_buffer_api.cc +0 -35
- data/src/core/lib/slice/slice_refcount_base.h +0 -60
@@ -0,0 +1,1081 @@
|
|
1
|
+
// Copyright 2022 The gRPC Authors
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include <grpc/support/port_platform.h>
|
16
|
+
|
17
|
+
#include "src/core/lib/event_engine/posix_engine/tcp_socket_utils.h"
|
18
|
+
|
19
|
+
#include <errno.h>
|
20
|
+
#include <inttypes.h>
|
21
|
+
#include <limits.h>
|
22
|
+
#include <stdlib.h>
|
23
|
+
|
24
|
+
#include "absl/cleanup/cleanup.h"
|
25
|
+
#include "absl/status/statusor.h"
|
26
|
+
#include "absl/strings/str_cat.h"
|
27
|
+
#include "absl/strings/string_view.h"
|
28
|
+
#include "absl/types/optional.h"
|
29
|
+
|
30
|
+
#include <grpc/event_engine/event_engine.h>
|
31
|
+
|
32
|
+
#include "src/core/lib/gpr/useful.h"
|
33
|
+
#include "src/core/lib/iomgr/port.h"
|
34
|
+
|
35
|
+
#ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
|
36
|
+
#include <arpa/inet.h> // IWYU pragma: keep
|
37
|
+
#ifdef GRPC_LINUX_TCP_H
|
38
|
+
#include <linux/tcp.h>
|
39
|
+
#else
|
40
|
+
#include <netinet/in.h> // IWYU pragma: keep
|
41
|
+
#include <netinet/tcp.h>
|
42
|
+
#endif
|
43
|
+
#include <fcntl.h>
|
44
|
+
#include <sys/socket.h>
|
45
|
+
#include <unistd.h>
|
46
|
+
#endif
|
47
|
+
|
48
|
+
#include <atomic>
|
49
|
+
#include <cstring>
|
50
|
+
|
51
|
+
#include "absl/status/status.h"
|
52
|
+
#include "absl/strings/str_format.h"
|
53
|
+
|
54
|
+
#include <grpc/impl/codegen/grpc_types.h>
|
55
|
+
#include <grpc/support/log.h>
|
56
|
+
|
57
|
+
#include "src/core/lib/gprpp/host_port.h"
|
58
|
+
#include "src/core/lib/gprpp/status_helper.h"
|
59
|
+
#include "src/core/lib/gprpp/strerror.h"
|
60
|
+
|
61
|
+
#ifdef GRPC_HAVE_UNIX_SOCKET
|
62
|
+
#include <sys/stat.h> // IWYU pragma: keep
|
63
|
+
#include <sys/un.h>
|
64
|
+
#endif
|
65
|
+
|
66
|
+
namespace grpc_event_engine {
|
67
|
+
namespace posix_engine {
|
68
|
+
|
69
|
+
using ::grpc_event_engine::experimental::EndpointConfig;
|
70
|
+
using ::grpc_event_engine::experimental::EventEngine;
|
71
|
+
|
72
|
+
namespace {
|
73
|
+
|
74
|
+
int AdjustValue(int default_value, int min_value, int max_value,
|
75
|
+
absl::optional<int> actual_value) {
|
76
|
+
if (!actual_value.has_value() || *actual_value < min_value ||
|
77
|
+
*actual_value > max_value) {
|
78
|
+
return default_value;
|
79
|
+
}
|
80
|
+
return *actual_value;
|
81
|
+
}
|
82
|
+
|
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
|
+
#ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
|
92
|
+
|
93
|
+
absl::Status ErrorForFd(
|
94
|
+
int fd, const experimental::EventEngine::ResolvedAddress& addr) {
|
95
|
+
if (fd >= 0) return absl::OkStatus();
|
96
|
+
const char* addr_str = reinterpret_cast<const char*>(addr.address());
|
97
|
+
return absl::Status(absl::StatusCode::kInternal,
|
98
|
+
absl::StrCat("socket: ", grpc_core::StrError(errno),
|
99
|
+
std::string(addr_str, addr.size())));
|
100
|
+
}
|
101
|
+
|
102
|
+
int CreateSocket(std::function<int(int, int, int)> socket_factory, int family,
|
103
|
+
int type, int protocol) {
|
104
|
+
return socket_factory != nullptr ? socket_factory(family, type, protocol)
|
105
|
+
: socket(family, type, protocol);
|
106
|
+
}
|
107
|
+
|
108
|
+
const uint8_t kV4MappedPrefix[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff};
|
109
|
+
|
110
|
+
absl::Status PrepareTcpClientSocket(PosixSocketWrapper sock,
|
111
|
+
const EventEngine::ResolvedAddress& addr,
|
112
|
+
const PosixTcpOptions& options) {
|
113
|
+
bool close_fd = true;
|
114
|
+
auto sock_cleanup = absl::MakeCleanup([&close_fd, &sock]() -> void {
|
115
|
+
if (close_fd and sock.Fd() >= 0) {
|
116
|
+
close(sock.Fd());
|
117
|
+
}
|
118
|
+
});
|
119
|
+
GRPC_RETURN_IF_ERROR(sock.SetSocketNonBlocking(1));
|
120
|
+
GRPC_RETURN_IF_ERROR(sock.SetSocketCloexec(1));
|
121
|
+
|
122
|
+
if (reinterpret_cast<const sockaddr*>(addr.address())->sa_family != AF_UNIX) {
|
123
|
+
// If its not a unix socket address.
|
124
|
+
GRPC_RETURN_IF_ERROR(sock.SetSocketLowLatency(1));
|
125
|
+
GRPC_RETURN_IF_ERROR(sock.SetSocketReuseAddr(1));
|
126
|
+
sock.TrySetSocketTcpUserTimeout(options, true);
|
127
|
+
}
|
128
|
+
GRPC_RETURN_IF_ERROR(sock.SetSocketNoSigpipeIfPossible());
|
129
|
+
GRPC_RETURN_IF_ERROR(sock.ApplySocketMutatorInOptions(
|
130
|
+
GRPC_FD_CLIENT_CONNECTION_USAGE, options));
|
131
|
+
// No errors. Set close_fd to false to ensure the socket is not closed.
|
132
|
+
close_fd = false;
|
133
|
+
return absl::OkStatus();
|
134
|
+
}
|
135
|
+
|
136
|
+
#endif /* GRPC_POSIX_SOCKET_UTILS_COMMON */
|
137
|
+
|
138
|
+
} // namespace
|
139
|
+
|
140
|
+
PosixTcpOptions TcpOptionsFromEndpointConfig(const EndpointConfig& config) {
|
141
|
+
void* value;
|
142
|
+
PosixTcpOptions options;
|
143
|
+
options.tcp_read_chunk_size = AdjustValue(
|
144
|
+
PosixTcpOptions::kDefaultReadChunkSize, 1, PosixTcpOptions::kMaxChunkSize,
|
145
|
+
config.GetInt(GRPC_ARG_TCP_READ_CHUNK_SIZE));
|
146
|
+
options.tcp_min_read_chunk_size =
|
147
|
+
AdjustValue(PosixTcpOptions::kDefaultMinReadChunksize, 1,
|
148
|
+
PosixTcpOptions::kMaxChunkSize,
|
149
|
+
config.GetInt(GRPC_ARG_TCP_MIN_READ_CHUNK_SIZE));
|
150
|
+
options.tcp_max_read_chunk_size =
|
151
|
+
AdjustValue(PosixTcpOptions::kDefaultMaxReadChunksize, 1,
|
152
|
+
PosixTcpOptions::kMaxChunkSize,
|
153
|
+
config.GetInt(GRPC_ARG_TCP_MAX_READ_CHUNK_SIZE));
|
154
|
+
options.tcp_tx_zerocopy_send_bytes_threshold =
|
155
|
+
AdjustValue(PosixTcpOptions::kDefaultSendBytesThreshold, 0, INT_MAX,
|
156
|
+
config.GetInt(GRPC_ARG_TCP_TX_ZEROCOPY_SEND_BYTES_THRESHOLD));
|
157
|
+
options.tcp_tx_zerocopy_max_simultaneous_sends =
|
158
|
+
AdjustValue(PosixTcpOptions::kDefaultMaxSends, 0, INT_MAX,
|
159
|
+
config.GetInt(GRPC_ARG_TCP_TX_ZEROCOPY_MAX_SIMULT_SENDS));
|
160
|
+
options.tcp_tx_zero_copy_enabled =
|
161
|
+
(AdjustValue(PosixTcpOptions::kZerocpTxEnabledDefault, 0, 1,
|
162
|
+
config.GetInt(GRPC_ARG_TCP_TX_ZEROCOPY_ENABLED)) != 0);
|
163
|
+
options.keep_alive_time_ms =
|
164
|
+
AdjustValue(0, 1, INT_MAX, config.GetInt(GRPC_ARG_KEEPALIVE_TIME_MS));
|
165
|
+
options.keep_alive_timeout_ms =
|
166
|
+
AdjustValue(0, 1, INT_MAX, config.GetInt(GRPC_ARG_KEEPALIVE_TIMEOUT_MS));
|
167
|
+
options.expand_wildcard_addrs =
|
168
|
+
(AdjustValue(0, 1, INT_MAX,
|
169
|
+
config.GetInt(GRPC_ARG_EXPAND_WILDCARD_ADDRS)) != 0);
|
170
|
+
options.allow_reuse_port =
|
171
|
+
(AdjustValue(0, 1, INT_MAX, config.GetInt(GRPC_ARG_ALLOW_REUSEPORT)) !=
|
172
|
+
0);
|
173
|
+
|
174
|
+
if (options.tcp_min_read_chunk_size > options.tcp_max_read_chunk_size) {
|
175
|
+
options.tcp_min_read_chunk_size = options.tcp_max_read_chunk_size;
|
176
|
+
}
|
177
|
+
options.tcp_read_chunk_size = grpc_core::Clamp(
|
178
|
+
options.tcp_read_chunk_size, options.tcp_min_read_chunk_size,
|
179
|
+
options.tcp_max_read_chunk_size);
|
180
|
+
|
181
|
+
value = config.GetVoidPointer(GRPC_ARG_RESOURCE_QUOTA);
|
182
|
+
if (value != nullptr) {
|
183
|
+
options.resource_quota =
|
184
|
+
reinterpret_cast<grpc_core::ResourceQuota*>(value)->Ref();
|
185
|
+
}
|
186
|
+
value = config.GetVoidPointer(GRPC_ARG_SOCKET_MUTATOR);
|
187
|
+
if (value != nullptr) {
|
188
|
+
options.socket_mutator =
|
189
|
+
grpc_socket_mutator_ref(static_cast<grpc_socket_mutator*>(value));
|
190
|
+
}
|
191
|
+
return options;
|
192
|
+
}
|
193
|
+
|
194
|
+
#ifdef GRPC_POSIX_SOCKETUTILS
|
195
|
+
|
196
|
+
int Accept4(int sockfd,
|
197
|
+
grpc_event_engine::experimental::EventEngine::ResolvedAddress& addr,
|
198
|
+
int nonblock, int cloexec) {
|
199
|
+
int fd, flags;
|
200
|
+
socklen_t len = EventEngine::ResolvedAddress::MAX_SIZE_BYTES;
|
201
|
+
fd = accept(sockfd, const_cast<sockaddr*>(addr.address()), &len);
|
202
|
+
if (fd >= 0) {
|
203
|
+
if (nonblock) {
|
204
|
+
flags = fcntl(fd, F_GETFL, 0);
|
205
|
+
if (flags < 0) goto close_and_error;
|
206
|
+
if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) != 0) goto close_and_error;
|
207
|
+
}
|
208
|
+
if (cloexec) {
|
209
|
+
flags = fcntl(fd, F_GETFD, 0);
|
210
|
+
if (flags < 0) goto close_and_error;
|
211
|
+
if (fcntl(fd, F_SETFD, flags | FD_CLOEXEC) != 0) goto close_and_error;
|
212
|
+
}
|
213
|
+
}
|
214
|
+
return fd;
|
215
|
+
|
216
|
+
close_and_error:
|
217
|
+
close(fd);
|
218
|
+
return -1;
|
219
|
+
}
|
220
|
+
|
221
|
+
#elif GRPC_LINUX_SOCKETUTILS
|
222
|
+
|
223
|
+
int Accept4(int sockfd,
|
224
|
+
grpc_event_engine::experimental::EventEngine::ResolvedAddress& addr,
|
225
|
+
int nonblock, int cloexec) {
|
226
|
+
int flags = 0;
|
227
|
+
flags |= nonblock ? SOCK_NONBLOCK : 0;
|
228
|
+
flags |= cloexec ? SOCK_CLOEXEC : 0;
|
229
|
+
socklen_t len = EventEngine::ResolvedAddress::MAX_SIZE_BYTES;
|
230
|
+
return accept4(sockfd, const_cast<sockaddr*>(addr.address()), &len, flags);
|
231
|
+
}
|
232
|
+
|
233
|
+
#endif /* GRPC_LINUX_SOCKETUTILS */
|
234
|
+
|
235
|
+
#ifdef GRPC_POSIX_SOCKET_UTILS_COMMON
|
236
|
+
|
237
|
+
bool SockaddrIsV4Mapped(const EventEngine::ResolvedAddress* resolved_addr,
|
238
|
+
EventEngine::ResolvedAddress* resolved_addr4_out) {
|
239
|
+
const sockaddr* addr = resolved_addr->address();
|
240
|
+
if (addr->sa_family == AF_INET6) {
|
241
|
+
const sockaddr_in6* addr6 = reinterpret_cast<const sockaddr_in6*>(addr);
|
242
|
+
sockaddr_in* addr4_out =
|
243
|
+
resolved_addr4_out == nullptr
|
244
|
+
? nullptr
|
245
|
+
: reinterpret_cast<sockaddr_in*>(
|
246
|
+
const_cast<sockaddr*>(resolved_addr4_out->address()));
|
247
|
+
|
248
|
+
if (memcmp(addr6->sin6_addr.s6_addr, kV4MappedPrefix,
|
249
|
+
sizeof(kV4MappedPrefix)) == 0) {
|
250
|
+
if (resolved_addr4_out != nullptr) {
|
251
|
+
// Normalize ::ffff:0.0.0.0/96 to IPv4.
|
252
|
+
memset(addr4_out, 0, sizeof(sockaddr_in));
|
253
|
+
addr4_out->sin_family = AF_INET;
|
254
|
+
// s6_addr32 would be nice, but it's non-standard.
|
255
|
+
memcpy(&addr4_out->sin_addr, &addr6->sin6_addr.s6_addr[12], 4);
|
256
|
+
addr4_out->sin_port = addr6->sin6_port;
|
257
|
+
*resolved_addr4_out = EventEngine::ResolvedAddress(
|
258
|
+
reinterpret_cast<sockaddr*>(addr4_out),
|
259
|
+
static_cast<socklen_t>(sizeof(sockaddr_in)));
|
260
|
+
}
|
261
|
+
return true;
|
262
|
+
}
|
263
|
+
}
|
264
|
+
return false;
|
265
|
+
}
|
266
|
+
|
267
|
+
bool SockaddrToV4Mapped(const EventEngine::ResolvedAddress* resolved_addr,
|
268
|
+
EventEngine::ResolvedAddress* resolved_addr6_out) {
|
269
|
+
GPR_ASSERT(resolved_addr != resolved_addr6_out);
|
270
|
+
const sockaddr* addr = resolved_addr->address();
|
271
|
+
sockaddr_in6* addr6_out = const_cast<sockaddr_in6*>(
|
272
|
+
reinterpret_cast<const sockaddr_in6*>(resolved_addr6_out->address()));
|
273
|
+
if (addr->sa_family == AF_INET) {
|
274
|
+
const sockaddr_in* addr4 = reinterpret_cast<const sockaddr_in*>(addr);
|
275
|
+
memset(resolved_addr6_out, 0, sizeof(*resolved_addr6_out));
|
276
|
+
addr6_out->sin6_family = AF_INET6;
|
277
|
+
memcpy(&addr6_out->sin6_addr.s6_addr[0], kV4MappedPrefix, 12);
|
278
|
+
memcpy(&addr6_out->sin6_addr.s6_addr[12], &addr4->sin_addr, 4);
|
279
|
+
addr6_out->sin6_port = addr4->sin_port;
|
280
|
+
*resolved_addr6_out = EventEngine::ResolvedAddress(
|
281
|
+
reinterpret_cast<sockaddr*>(addr6_out),
|
282
|
+
static_cast<socklen_t>(sizeof(sockaddr_in6)));
|
283
|
+
return true;
|
284
|
+
}
|
285
|
+
return false;
|
286
|
+
}
|
287
|
+
|
288
|
+
absl::StatusOr<std::string> SockaddrToString(
|
289
|
+
const EventEngine::ResolvedAddress* resolved_addr, bool normalize) {
|
290
|
+
const int save_errno = errno;
|
291
|
+
EventEngine::ResolvedAddress addr_normalized;
|
292
|
+
if (normalize && SockaddrIsV4Mapped(resolved_addr, &addr_normalized)) {
|
293
|
+
resolved_addr = &addr_normalized;
|
294
|
+
}
|
295
|
+
const sockaddr* addr =
|
296
|
+
reinterpret_cast<const sockaddr*>(resolved_addr->address());
|
297
|
+
std::string out;
|
298
|
+
#ifdef GRPC_HAVE_UNIX_SOCKET
|
299
|
+
if (addr->sa_family == AF_UNIX) {
|
300
|
+
const sockaddr_un* addr_un = reinterpret_cast<const sockaddr_un*>(addr);
|
301
|
+
bool abstract = addr_un->sun_path[0] == '\0';
|
302
|
+
if (abstract) {
|
303
|
+
#ifdef GPR_APPLE
|
304
|
+
int len = resolved_addr->size() - sizeof(addr_un->sun_family) -
|
305
|
+
sizeof(addr_un->sun_len);
|
306
|
+
#else
|
307
|
+
int len = resolved_addr->size() - sizeof(addr_un->sun_family);
|
308
|
+
#endif
|
309
|
+
if (len <= 0) {
|
310
|
+
return absl::InvalidArgumentError("Empty UDS abstract path");
|
311
|
+
}
|
312
|
+
out = std::string(addr_un->sun_path, len);
|
313
|
+
} else {
|
314
|
+
size_t maxlen = sizeof(addr_un->sun_path);
|
315
|
+
if (strnlen(addr_un->sun_path, maxlen) == maxlen) {
|
316
|
+
return absl::InvalidArgumentError("UDS path is not null-terminated");
|
317
|
+
}
|
318
|
+
out = std::string(addr_un->sun_path);
|
319
|
+
}
|
320
|
+
return out;
|
321
|
+
}
|
322
|
+
#endif
|
323
|
+
|
324
|
+
const void* ip = nullptr;
|
325
|
+
int port = 0;
|
326
|
+
uint32_t sin6_scope_id = 0;
|
327
|
+
if (addr->sa_family == AF_INET) {
|
328
|
+
const sockaddr_in* addr4 = reinterpret_cast<const sockaddr_in*>(addr);
|
329
|
+
ip = &addr4->sin_addr;
|
330
|
+
port = ntohs(addr4->sin_port);
|
331
|
+
} else if (addr->sa_family == AF_INET6) {
|
332
|
+
const sockaddr_in6* addr6 = reinterpret_cast<const sockaddr_in6*>(addr);
|
333
|
+
ip = &addr6->sin6_addr;
|
334
|
+
port = ntohs(addr6->sin6_port);
|
335
|
+
sin6_scope_id = addr6->sin6_scope_id;
|
336
|
+
}
|
337
|
+
char ntop_buf[INET6_ADDRSTRLEN];
|
338
|
+
if (ip != nullptr &&
|
339
|
+
inet_ntop(addr->sa_family, ip, ntop_buf, sizeof(ntop_buf)) != nullptr) {
|
340
|
+
if (sin6_scope_id != 0) {
|
341
|
+
// Enclose sin6_scope_id with the format defined in RFC 6874
|
342
|
+
// section 2.
|
343
|
+
std::string host_with_scope =
|
344
|
+
absl::StrFormat("%s%%%" PRIu32, ntop_buf, sin6_scope_id);
|
345
|
+
out = grpc_core::JoinHostPort(host_with_scope, port);
|
346
|
+
} else {
|
347
|
+
out = grpc_core::JoinHostPort(ntop_buf, port);
|
348
|
+
}
|
349
|
+
} else {
|
350
|
+
return absl::InvalidArgumentError(
|
351
|
+
absl::StrCat("Unknown sockaddr family: ", addr->sa_family));
|
352
|
+
}
|
353
|
+
// This is probably redundant, but we wouldn't want to log the wrong
|
354
|
+
// error.
|
355
|
+
errno = save_errno;
|
356
|
+
return out;
|
357
|
+
}
|
358
|
+
|
359
|
+
EventEngine::ResolvedAddress SockaddrMakeWild6(int port) {
|
360
|
+
EventEngine::ResolvedAddress resolved_wild_out;
|
361
|
+
sockaddr_in6* wild_out = reinterpret_cast<sockaddr_in6*>(
|
362
|
+
const_cast<sockaddr*>(resolved_wild_out.address()));
|
363
|
+
GPR_ASSERT(port >= 0 && port < 65536);
|
364
|
+
memset(wild_out, 0, sizeof(sockaddr_in6));
|
365
|
+
wild_out->sin6_family = AF_INET6;
|
366
|
+
wild_out->sin6_port = htons(static_cast<uint16_t>(port));
|
367
|
+
return EventEngine::ResolvedAddress(
|
368
|
+
reinterpret_cast<sockaddr*>(wild_out),
|
369
|
+
static_cast<socklen_t>(sizeof(sockaddr_in6)));
|
370
|
+
}
|
371
|
+
|
372
|
+
EventEngine::ResolvedAddress SockaddrMakeWild4(int port) {
|
373
|
+
EventEngine::ResolvedAddress resolved_wild_out;
|
374
|
+
sockaddr_in* wild_out = reinterpret_cast<sockaddr_in*>(
|
375
|
+
const_cast<sockaddr*>(resolved_wild_out.address()));
|
376
|
+
GPR_ASSERT(port >= 0 && port < 65536);
|
377
|
+
memset(wild_out, 0, sizeof(sockaddr_in));
|
378
|
+
wild_out->sin_family = AF_INET;
|
379
|
+
wild_out->sin_port = htons(static_cast<uint16_t>(port));
|
380
|
+
return EventEngine::ResolvedAddress(
|
381
|
+
reinterpret_cast<sockaddr*>(wild_out),
|
382
|
+
static_cast<socklen_t>(sizeof(sockaddr_in)));
|
383
|
+
}
|
384
|
+
|
385
|
+
int SockaddrGetPort(const EventEngine::ResolvedAddress& resolved_addr) {
|
386
|
+
const sockaddr* addr = resolved_addr.address();
|
387
|
+
switch (addr->sa_family) {
|
388
|
+
case AF_INET:
|
389
|
+
return ntohs((reinterpret_cast<const sockaddr_in*>(addr))->sin_port);
|
390
|
+
case AF_INET6:
|
391
|
+
return ntohs((reinterpret_cast<const sockaddr_in6*>(addr))->sin6_port);
|
392
|
+
#ifdef GRPC_HAVE_UNIX_SOCKET
|
393
|
+
case AF_UNIX:
|
394
|
+
return 1;
|
395
|
+
#endif
|
396
|
+
default:
|
397
|
+
gpr_log(GPR_ERROR, "Unknown socket family %d in SockaddrGetPort",
|
398
|
+
addr->sa_family);
|
399
|
+
abort();
|
400
|
+
}
|
401
|
+
}
|
402
|
+
|
403
|
+
void SockaddrSetPort(EventEngine::ResolvedAddress& resolved_addr, int port) {
|
404
|
+
sockaddr* addr = const_cast<sockaddr*>(resolved_addr.address());
|
405
|
+
switch (addr->sa_family) {
|
406
|
+
case AF_INET:
|
407
|
+
GPR_ASSERT(port >= 0 && port < 65536);
|
408
|
+
(reinterpret_cast<sockaddr_in*>(addr))->sin_port =
|
409
|
+
htons(static_cast<uint16_t>(port));
|
410
|
+
return;
|
411
|
+
case AF_INET6:
|
412
|
+
GPR_ASSERT(port >= 0 && port < 65536);
|
413
|
+
(reinterpret_cast<sockaddr_in6*>(addr))->sin6_port =
|
414
|
+
htons(static_cast<uint16_t>(port));
|
415
|
+
return;
|
416
|
+
default:
|
417
|
+
gpr_log(GPR_ERROR, "Unknown socket family %d in grpc_sockaddr_set_port",
|
418
|
+
addr->sa_family);
|
419
|
+
abort();
|
420
|
+
}
|
421
|
+
}
|
422
|
+
|
423
|
+
void UnlinkIfUnixDomainSocket(
|
424
|
+
const EventEngine::ResolvedAddress& resolved_addr) {
|
425
|
+
#ifdef GRPC_HAVE_UNIX_SOCKET
|
426
|
+
if (resolved_addr.address()->sa_family != AF_UNIX) {
|
427
|
+
return;
|
428
|
+
}
|
429
|
+
struct sockaddr_un* un = reinterpret_cast<struct sockaddr_un*>(
|
430
|
+
const_cast<sockaddr*>(resolved_addr.address()));
|
431
|
+
|
432
|
+
// There is nothing to unlink for an abstract unix socket
|
433
|
+
if (un->sun_path[0] == '\0' && un->sun_path[1] != '\0') {
|
434
|
+
return;
|
435
|
+
}
|
436
|
+
|
437
|
+
struct stat st;
|
438
|
+
if (stat(un->sun_path, &st) == 0 && (st.st_mode & S_IFMT) == S_IFSOCK) {
|
439
|
+
unlink(un->sun_path);
|
440
|
+
}
|
441
|
+
#else
|
442
|
+
(void)resolved_addr;
|
443
|
+
#endif
|
444
|
+
}
|
445
|
+
|
446
|
+
absl::optional<int> SockaddrIsWildcard(
|
447
|
+
const EventEngine::ResolvedAddress& addr) {
|
448
|
+
const EventEngine::ResolvedAddress* resolved_addr = &addr;
|
449
|
+
EventEngine::ResolvedAddress addr4_normalized;
|
450
|
+
if (SockaddrIsV4Mapped(resolved_addr, &addr4_normalized)) {
|
451
|
+
resolved_addr = &addr4_normalized;
|
452
|
+
}
|
453
|
+
if (resolved_addr->address()->sa_family == AF_INET) {
|
454
|
+
// Check for 0.0.0.0
|
455
|
+
const sockaddr_in* addr4 =
|
456
|
+
reinterpret_cast<const sockaddr_in*>(resolved_addr->address());
|
457
|
+
if (addr4->sin_addr.s_addr != 0) {
|
458
|
+
return absl::nullopt;
|
459
|
+
}
|
460
|
+
return static_cast<int>(ntohs(addr4->sin_port));
|
461
|
+
} else if (resolved_addr->address()->sa_family == AF_INET6) {
|
462
|
+
// Check for ::
|
463
|
+
const sockaddr_in6* addr6 =
|
464
|
+
reinterpret_cast<const sockaddr_in6*>(resolved_addr->address());
|
465
|
+
int i;
|
466
|
+
for (i = 0; i < 16; i++) {
|
467
|
+
if (addr6->sin6_addr.s6_addr[i] != 0) {
|
468
|
+
return absl::nullopt;
|
469
|
+
}
|
470
|
+
}
|
471
|
+
return static_cast<int>(ntohs(addr6->sin6_port));
|
472
|
+
} else {
|
473
|
+
return absl::nullopt;
|
474
|
+
}
|
475
|
+
}
|
476
|
+
|
477
|
+
// Instruct the kernel to wait for specified number of bytes to be received on
|
478
|
+
// the socket before generating an interrupt for packet receive. If the call
|
479
|
+
// succeeds, it returns the number of bytes (wait threshold) that was actually
|
480
|
+
// set.
|
481
|
+
absl::StatusOr<int> PosixSocketWrapper::SetSocketRcvLowat(int bytes) {
|
482
|
+
if (setsockopt(fd_, SOL_SOCKET, SO_RCVLOWAT, &bytes, sizeof(bytes)) != 0) {
|
483
|
+
return absl::Status(
|
484
|
+
absl::StatusCode::kInternal,
|
485
|
+
absl::StrCat("setsockopt(SO_RCVLOWAT): ", grpc_core::StrError(errno)));
|
486
|
+
}
|
487
|
+
return bytes;
|
488
|
+
}
|
489
|
+
|
490
|
+
// Set a socket to use zerocopy
|
491
|
+
absl::Status PosixSocketWrapper::SetSocketZeroCopy() {
|
492
|
+
#ifdef GRPC_LINUX_ERRQUEUE
|
493
|
+
const int enable = 1;
|
494
|
+
auto err = setsockopt(fd_, SOL_SOCKET, SO_ZEROCOPY, &enable, sizeof(enable));
|
495
|
+
if (err != 0) {
|
496
|
+
return absl::Status(
|
497
|
+
absl::StatusCode::kInternal,
|
498
|
+
absl::StrCat("setsockopt(SO_ZEROCOPY): ", grpc_core::StrError(errno)));
|
499
|
+
}
|
500
|
+
return absl::OkStatus();
|
501
|
+
#else
|
502
|
+
return absl::Status(absl::StatusCode::kInternal,
|
503
|
+
absl::StrCat("setsockopt(SO_ZEROCOPY): ",
|
504
|
+
grpc_core::StrError(ENOSYS).c_str()));
|
505
|
+
#endif
|
506
|
+
}
|
507
|
+
|
508
|
+
// Set a socket to non blocking mode
|
509
|
+
absl::Status PosixSocketWrapper::SetSocketNonBlocking(int non_blocking) {
|
510
|
+
int oldflags = fcntl(fd_, F_GETFL, 0);
|
511
|
+
if (oldflags < 0) {
|
512
|
+
return absl::Status(absl::StatusCode::kInternal,
|
513
|
+
absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
|
514
|
+
}
|
515
|
+
|
516
|
+
if (non_blocking) {
|
517
|
+
oldflags |= O_NONBLOCK;
|
518
|
+
} else {
|
519
|
+
oldflags &= ~O_NONBLOCK;
|
520
|
+
}
|
521
|
+
|
522
|
+
if (fcntl(fd_, F_SETFL, oldflags) != 0) {
|
523
|
+
return absl::Status(absl::StatusCode::kInternal,
|
524
|
+
absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
|
525
|
+
}
|
526
|
+
|
527
|
+
return absl::OkStatus();
|
528
|
+
}
|
529
|
+
|
530
|
+
absl::Status PosixSocketWrapper::SetSocketNoSigpipeIfPossible() {
|
531
|
+
#ifdef GRPC_HAVE_SO_NOSIGPIPE
|
532
|
+
int val = 1;
|
533
|
+
int newval;
|
534
|
+
socklen_t intlen = sizeof(newval);
|
535
|
+
if (0 != setsockopt(fd_, SOL_SOCKET, SO_NOSIGPIPE, &val, sizeof(val))) {
|
536
|
+
return absl::Status(
|
537
|
+
absl::StatusCode::kInternal,
|
538
|
+
absl::StrCat("setsockopt(SO_NOSIGPIPE): ", grpc_core::StrError(errno)));
|
539
|
+
}
|
540
|
+
if (0 != getsockopt(fd_, SOL_SOCKET, SO_NOSIGPIPE, &newval, &intlen)) {
|
541
|
+
return absl::Status(
|
542
|
+
absl::StatusCode::kInternal,
|
543
|
+
absl::StrCat("getsockopt(SO_NOSIGPIPE): ", grpc_core::StrError(errno)));
|
544
|
+
}
|
545
|
+
if ((newval != 0) != (val != 0)) {
|
546
|
+
return absl::Status(absl::StatusCode::kInternal,
|
547
|
+
"Failed to set SO_NOSIGPIPE");
|
548
|
+
}
|
549
|
+
#endif
|
550
|
+
return absl::OkStatus();
|
551
|
+
}
|
552
|
+
|
553
|
+
absl::Status PosixSocketWrapper::SetSocketIpPktInfoIfPossible() {
|
554
|
+
#ifdef GRPC_HAVE_IP_PKTINFO
|
555
|
+
int get_local_ip = 1;
|
556
|
+
if (0 != setsockopt(fd_, IPPROTO_IP, IP_PKTINFO, &get_local_ip,
|
557
|
+
sizeof(get_local_ip))) {
|
558
|
+
return absl::Status(
|
559
|
+
absl::StatusCode::kInternal,
|
560
|
+
absl::StrCat("setsockopt(IP_PKTINFO): ", grpc_core::StrError(errno)));
|
561
|
+
}
|
562
|
+
#endif
|
563
|
+
return absl::OkStatus();
|
564
|
+
}
|
565
|
+
|
566
|
+
absl::Status PosixSocketWrapper::SetSocketIpv6RecvPktInfoIfPossible() {
|
567
|
+
#ifdef GRPC_HAVE_IPV6_RECVPKTINFO
|
568
|
+
int get_local_ip = 1;
|
569
|
+
if (0 != setsockopt(fd_, IPPROTO_IPV6, IPV6_RECVPKTINFO, &get_local_ip,
|
570
|
+
sizeof(get_local_ip))) {
|
571
|
+
return absl::Status(absl::StatusCode::kInternal,
|
572
|
+
absl::StrCat("setsockopt(IPV6_RECVPKTINFO): ",
|
573
|
+
grpc_core::StrError(errno)));
|
574
|
+
}
|
575
|
+
#endif
|
576
|
+
return absl::OkStatus();
|
577
|
+
}
|
578
|
+
|
579
|
+
absl::Status PosixSocketWrapper::SetSocketSndBuf(int buffer_size_bytes) {
|
580
|
+
return 0 == setsockopt(fd_, SOL_SOCKET, SO_SNDBUF, &buffer_size_bytes,
|
581
|
+
sizeof(buffer_size_bytes))
|
582
|
+
? absl::OkStatus()
|
583
|
+
: absl::Status(absl::StatusCode::kInternal,
|
584
|
+
absl::StrCat("setsockopt(SO_SNDBUF): ",
|
585
|
+
grpc_core::StrError(errno)));
|
586
|
+
}
|
587
|
+
|
588
|
+
absl::Status PosixSocketWrapper::SetSocketRcvBuf(int buffer_size_bytes) {
|
589
|
+
return 0 == setsockopt(fd_, SOL_SOCKET, SO_RCVBUF, &buffer_size_bytes,
|
590
|
+
sizeof(buffer_size_bytes))
|
591
|
+
? absl::OkStatus()
|
592
|
+
: absl::Status(absl::StatusCode::kInternal,
|
593
|
+
absl::StrCat("setsockopt(SO_RCVBUF): ",
|
594
|
+
grpc_core::StrError(errno)));
|
595
|
+
}
|
596
|
+
|
597
|
+
// Set a socket to close on exec
|
598
|
+
absl::Status PosixSocketWrapper::SetSocketCloexec(int close_on_exec) {
|
599
|
+
int oldflags = fcntl(fd_, F_GETFD, 0);
|
600
|
+
if (oldflags < 0) {
|
601
|
+
return absl::Status(absl::StatusCode::kInternal,
|
602
|
+
absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
|
603
|
+
}
|
604
|
+
|
605
|
+
if (close_on_exec) {
|
606
|
+
oldflags |= FD_CLOEXEC;
|
607
|
+
} else {
|
608
|
+
oldflags &= ~FD_CLOEXEC;
|
609
|
+
}
|
610
|
+
|
611
|
+
if (fcntl(fd_, F_SETFD, oldflags) != 0) {
|
612
|
+
return absl::Status(absl::StatusCode::kInternal,
|
613
|
+
absl::StrCat("fcntl: ", grpc_core::StrError(errno)));
|
614
|
+
}
|
615
|
+
|
616
|
+
return absl::OkStatus();
|
617
|
+
}
|
618
|
+
|
619
|
+
// set a socket to reuse old addresses
|
620
|
+
absl::Status PosixSocketWrapper::SetSocketReuseAddr(int reuse) {
|
621
|
+
int val = (reuse != 0);
|
622
|
+
int newval;
|
623
|
+
socklen_t intlen = sizeof(newval);
|
624
|
+
if (0 != setsockopt(fd_, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val))) {
|
625
|
+
return absl::Status(
|
626
|
+
absl::StatusCode::kInternal,
|
627
|
+
absl::StrCat("setsockopt(SO_REUSEADDR): ", grpc_core::StrError(errno)));
|
628
|
+
}
|
629
|
+
if (0 != getsockopt(fd_, SOL_SOCKET, SO_REUSEADDR, &newval, &intlen)) {
|
630
|
+
return absl::Status(
|
631
|
+
absl::StatusCode::kInternal,
|
632
|
+
absl::StrCat("getsockopt(SO_REUSEADDR): ", grpc_core::StrError(errno)));
|
633
|
+
}
|
634
|
+
if ((newval != 0) != val) {
|
635
|
+
return absl::Status(absl::StatusCode::kInternal,
|
636
|
+
"Failed to set SO_REUSEADDR");
|
637
|
+
}
|
638
|
+
|
639
|
+
return absl::OkStatus();
|
640
|
+
}
|
641
|
+
|
642
|
+
// set a socket to reuse old ports
|
643
|
+
absl::Status PosixSocketWrapper::SetSocketReusePort(int reuse) {
|
644
|
+
#ifndef SO_REUSEPORT
|
645
|
+
return absl::Status(absl::StatusCode::kInternal,
|
646
|
+
"SO_REUSEPORT unavailable on compiling system");
|
647
|
+
#else
|
648
|
+
int val = (reuse != 0);
|
649
|
+
int newval;
|
650
|
+
socklen_t intlen = sizeof(newval);
|
651
|
+
if (0 != setsockopt(fd_, SOL_SOCKET, SO_REUSEPORT, &val, sizeof(val))) {
|
652
|
+
return absl::Status(
|
653
|
+
absl::StatusCode::kInternal,
|
654
|
+
absl::StrCat("setsockopt(SO_REUSEPORT): ", grpc_core::StrError(errno)));
|
655
|
+
}
|
656
|
+
if (0 != getsockopt(fd_, SOL_SOCKET, SO_REUSEPORT, &newval, &intlen)) {
|
657
|
+
return absl::Status(
|
658
|
+
absl::StatusCode::kInternal,
|
659
|
+
absl::StrCat("getsockopt(SO_REUSEPORT): ", grpc_core::StrError(errno)));
|
660
|
+
}
|
661
|
+
if ((newval != 0) != val) {
|
662
|
+
return absl::Status(absl::StatusCode::kInternal,
|
663
|
+
"Failed to set SO_REUSEPORT");
|
664
|
+
}
|
665
|
+
|
666
|
+
return absl::OkStatus();
|
667
|
+
#endif
|
668
|
+
}
|
669
|
+
|
670
|
+
bool PosixSocketWrapper::IsSocketReusePortSupported() {
|
671
|
+
static bool kSupportSoReusePort = []() -> bool {
|
672
|
+
int s = socket(AF_INET, SOCK_STREAM, 0);
|
673
|
+
if (s < 0) {
|
674
|
+
// This might be an ipv6-only environment in which case
|
675
|
+
// 'socket(AF_INET,..)' call would fail. Try creating IPv6 socket in
|
676
|
+
// that case
|
677
|
+
s = socket(AF_INET6, SOCK_STREAM, 0);
|
678
|
+
}
|
679
|
+
if (s >= 0) {
|
680
|
+
PosixSocketWrapper sock(s);
|
681
|
+
return sock.SetSocketReusePort(1).ok();
|
682
|
+
} else {
|
683
|
+
return false;
|
684
|
+
}
|
685
|
+
}();
|
686
|
+
return kSupportSoReusePort;
|
687
|
+
}
|
688
|
+
|
689
|
+
// Disable nagle algorithm
|
690
|
+
absl::Status PosixSocketWrapper::SetSocketLowLatency(int low_latency) {
|
691
|
+
int val = (low_latency != 0);
|
692
|
+
int newval;
|
693
|
+
socklen_t intlen = sizeof(newval);
|
694
|
+
if (0 != setsockopt(fd_, IPPROTO_TCP, TCP_NODELAY, &val, sizeof(val))) {
|
695
|
+
return absl::Status(
|
696
|
+
absl::StatusCode::kInternal,
|
697
|
+
absl::StrCat("setsockopt(TCP_NODELAY): ", grpc_core::StrError(errno)));
|
698
|
+
}
|
699
|
+
if (0 != getsockopt(fd_, IPPROTO_TCP, TCP_NODELAY, &newval, &intlen)) {
|
700
|
+
return absl::Status(
|
701
|
+
absl::StatusCode::kInternal,
|
702
|
+
absl::StrCat("getsockopt(TCP_NODELAY): ", grpc_core::StrError(errno)));
|
703
|
+
}
|
704
|
+
if ((newval != 0) != val) {
|
705
|
+
return absl::Status(absl::StatusCode::kInternal,
|
706
|
+
"Failed to set TCP_NODELAY");
|
707
|
+
}
|
708
|
+
return absl::OkStatus();
|
709
|
+
}
|
710
|
+
|
711
|
+
#if GPR_LINUX == 1
|
712
|
+
// For Linux, it will be detected to support TCP_USER_TIMEOUT
|
713
|
+
#ifndef TCP_USER_TIMEOUT
|
714
|
+
#define TCP_USER_TIMEOUT 18
|
715
|
+
#endif
|
716
|
+
#define SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT 0
|
717
|
+
#else
|
718
|
+
// For non-Linux, TCP_USER_TIMEOUT will be used if TCP_USER_TIMEOUT is defined.
|
719
|
+
#ifdef TCP_USER_TIMEOUT
|
720
|
+
#define SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT 0
|
721
|
+
#else
|
722
|
+
#define TCP_USER_TIMEOUT 0
|
723
|
+
#define SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT -1
|
724
|
+
#endif // TCP_USER_TIMEOUT
|
725
|
+
#endif // GPR_LINUX == 1
|
726
|
+
|
727
|
+
// Whether the socket supports TCP_USER_TIMEOUT option.
|
728
|
+
// (0: don't know, 1: support, -1: not support)
|
729
|
+
static std::atomic<int> g_socket_supports_tcp_user_timeout(
|
730
|
+
SOCKET_SUPPORTS_TCP_USER_TIMEOUT_DEFAULT);
|
731
|
+
|
732
|
+
void PosixSocketWrapper::ConfigureDefaultTcpUserTimeout(bool enable,
|
733
|
+
int timeout,
|
734
|
+
bool is_client) {
|
735
|
+
if (is_client) {
|
736
|
+
kDefaultClientUserTimeoutEnabled = enable;
|
737
|
+
if (timeout > 0) {
|
738
|
+
kDefaultClientUserTimeoutMs = timeout;
|
739
|
+
}
|
740
|
+
} else {
|
741
|
+
kDefaultServerUserTimeoutEnabled = enable;
|
742
|
+
if (timeout > 0) {
|
743
|
+
kDefaultServerUserTimeoutMs = timeout;
|
744
|
+
}
|
745
|
+
}
|
746
|
+
}
|
747
|
+
|
748
|
+
// Set TCP_USER_TIMEOUT
|
749
|
+
void PosixSocketWrapper::TrySetSocketTcpUserTimeout(
|
750
|
+
const PosixTcpOptions& options, bool is_client) {
|
751
|
+
if (g_socket_supports_tcp_user_timeout.load() < 0) {
|
752
|
+
return;
|
753
|
+
}
|
754
|
+
bool enable = is_client ? kDefaultClientUserTimeoutEnabled
|
755
|
+
: kDefaultServerUserTimeoutEnabled;
|
756
|
+
int timeout =
|
757
|
+
is_client ? kDefaultClientUserTimeoutMs : kDefaultServerUserTimeoutMs;
|
758
|
+
if (options.keep_alive_time_ms > 0) {
|
759
|
+
enable = options.keep_alive_time_ms != INT_MAX;
|
760
|
+
}
|
761
|
+
if (options.keep_alive_timeout_ms > 0) {
|
762
|
+
timeout = options.keep_alive_timeout_ms;
|
763
|
+
}
|
764
|
+
if (enable) {
|
765
|
+
int newval;
|
766
|
+
socklen_t len = sizeof(newval);
|
767
|
+
// If this is the first time to use TCP_USER_TIMEOUT, try to check
|
768
|
+
// if it is available.
|
769
|
+
if (g_socket_supports_tcp_user_timeout.load() == 0) {
|
770
|
+
if (0 != getsockopt(fd_, IPPROTO_TCP, TCP_USER_TIMEOUT, &newval, &len)) {
|
771
|
+
gpr_log(GPR_INFO,
|
772
|
+
"TCP_USER_TIMEOUT is not available. TCP_USER_TIMEOUT won't "
|
773
|
+
"be used thereafter");
|
774
|
+
g_socket_supports_tcp_user_timeout.store(-1);
|
775
|
+
} else {
|
776
|
+
gpr_log(GPR_INFO,
|
777
|
+
"TCP_USER_TIMEOUT is available. TCP_USER_TIMEOUT will be "
|
778
|
+
"used thereafter");
|
779
|
+
g_socket_supports_tcp_user_timeout.store(1);
|
780
|
+
}
|
781
|
+
}
|
782
|
+
if (g_socket_supports_tcp_user_timeout.load() > 0) {
|
783
|
+
if (0 != setsockopt(fd_, IPPROTO_TCP, TCP_USER_TIMEOUT, &timeout,
|
784
|
+
sizeof(timeout))) {
|
785
|
+
gpr_log(GPR_ERROR, "setsockopt(TCP_USER_TIMEOUT) %s",
|
786
|
+
grpc_core::StrError(errno).c_str());
|
787
|
+
return;
|
788
|
+
}
|
789
|
+
if (0 != getsockopt(fd_, IPPROTO_TCP, TCP_USER_TIMEOUT, &newval, &len)) {
|
790
|
+
gpr_log(GPR_ERROR, "getsockopt(TCP_USER_TIMEOUT) %s",
|
791
|
+
grpc_core::StrError(errno).c_str());
|
792
|
+
return;
|
793
|
+
}
|
794
|
+
if (newval != timeout) {
|
795
|
+
// Do not fail on failing to set TCP_USER_TIMEOUT
|
796
|
+
gpr_log(GPR_ERROR, "Failed to set TCP_USER_TIMEOUT");
|
797
|
+
return;
|
798
|
+
}
|
799
|
+
}
|
800
|
+
}
|
801
|
+
}
|
802
|
+
|
803
|
+
// Set a socket using a grpc_socket_mutator
|
804
|
+
absl::Status PosixSocketWrapper::SetSocketMutator(
|
805
|
+
grpc_fd_usage usage, grpc_socket_mutator* mutator) {
|
806
|
+
GPR_ASSERT(mutator);
|
807
|
+
if (!grpc_socket_mutator_mutate_fd(mutator, fd_, usage)) {
|
808
|
+
return absl::Status(absl::StatusCode::kInternal,
|
809
|
+
"grpc_socket_mutator failed.");
|
810
|
+
}
|
811
|
+
return absl::OkStatus();
|
812
|
+
}
|
813
|
+
|
814
|
+
absl::Status PosixSocketWrapper::ApplySocketMutatorInOptions(
|
815
|
+
grpc_fd_usage usage, const PosixTcpOptions& options) {
|
816
|
+
if (options.socket_mutator == nullptr) {
|
817
|
+
return absl::OkStatus();
|
818
|
+
}
|
819
|
+
return SetSocketMutator(usage, options.socket_mutator);
|
820
|
+
}
|
821
|
+
|
822
|
+
bool PosixSocketWrapper::SetSocketDualStack() {
|
823
|
+
const int off = 0;
|
824
|
+
return 0 == setsockopt(fd_, IPPROTO_IPV6, IPV6_V6ONLY, &off, sizeof(off));
|
825
|
+
}
|
826
|
+
|
827
|
+
bool PosixSocketWrapper::IsIpv6LoopbackAvailable() {
|
828
|
+
static bool kIpv6LoopbackAvailable = []() -> bool {
|
829
|
+
int fd = socket(AF_INET6, SOCK_STREAM, 0);
|
830
|
+
bool loopback_available = false;
|
831
|
+
if (fd < 0) {
|
832
|
+
gpr_log(GPR_INFO, "Disabling AF_INET6 sockets because socket() failed.");
|
833
|
+
} else {
|
834
|
+
sockaddr_in6 addr;
|
835
|
+
memset(&addr, 0, sizeof(addr));
|
836
|
+
addr.sin6_family = AF_INET6;
|
837
|
+
addr.sin6_addr.s6_addr[15] = 1; /* [::1]:0 */
|
838
|
+
if (bind(fd, reinterpret_cast<sockaddr*>(&addr), sizeof(addr)) == 0) {
|
839
|
+
loopback_available = true;
|
840
|
+
} else {
|
841
|
+
gpr_log(GPR_INFO,
|
842
|
+
"Disabling AF_INET6 sockets because ::1 is not available.");
|
843
|
+
}
|
844
|
+
close(fd);
|
845
|
+
}
|
846
|
+
return loopback_available;
|
847
|
+
}();
|
848
|
+
return kIpv6LoopbackAvailable;
|
849
|
+
}
|
850
|
+
|
851
|
+
absl::StatusOr<EventEngine::ResolvedAddress>
|
852
|
+
PosixSocketWrapper::LocalAddress() {
|
853
|
+
EventEngine::ResolvedAddress addr;
|
854
|
+
socklen_t len = EventEngine::ResolvedAddress::MAX_SIZE_BYTES;
|
855
|
+
if (getsockname(fd_, const_cast<sockaddr*>(addr.address()), &len) < 0) {
|
856
|
+
return absl::InternalError(
|
857
|
+
absl::StrCat("getsockname:", grpc_core::StrError(errno)));
|
858
|
+
}
|
859
|
+
return addr;
|
860
|
+
}
|
861
|
+
|
862
|
+
absl::StatusOr<EventEngine::ResolvedAddress> PosixSocketWrapper::PeerAddress() {
|
863
|
+
EventEngine::ResolvedAddress addr;
|
864
|
+
socklen_t len = EventEngine::ResolvedAddress::MAX_SIZE_BYTES;
|
865
|
+
if (getpeername(fd_, const_cast<sockaddr*>(addr.address()), &len) < 0) {
|
866
|
+
return absl::InternalError(
|
867
|
+
absl::StrCat("getpeername:", grpc_core::StrError(errno)));
|
868
|
+
}
|
869
|
+
return addr;
|
870
|
+
}
|
871
|
+
|
872
|
+
absl::StatusOr<std::string> PosixSocketWrapper::LocalAddressString() {
|
873
|
+
auto status = LocalAddress();
|
874
|
+
if (!status.ok()) {
|
875
|
+
return status.status();
|
876
|
+
}
|
877
|
+
return SockaddrToString(&(*status), true);
|
878
|
+
}
|
879
|
+
|
880
|
+
absl::StatusOr<std::string> PosixSocketWrapper::PeerAddressString() {
|
881
|
+
auto status = PeerAddress();
|
882
|
+
if (!status.ok()) {
|
883
|
+
return status.status();
|
884
|
+
}
|
885
|
+
return SockaddrToString(&(*status), true);
|
886
|
+
}
|
887
|
+
|
888
|
+
absl::StatusOr<PosixSocketWrapper> PosixSocketWrapper::CreateDualStackSocket(
|
889
|
+
std::function<int(int, int, int)> socket_factory,
|
890
|
+
const experimental::EventEngine::ResolvedAddress& addr, int type,
|
891
|
+
int protocol, PosixSocketWrapper::DSMode& dsmode) {
|
892
|
+
const sockaddr* sock_addr = addr.address();
|
893
|
+
int family = sock_addr->sa_family;
|
894
|
+
int newfd;
|
895
|
+
if (family == AF_INET6) {
|
896
|
+
if (IsIpv6LoopbackAvailable()) {
|
897
|
+
newfd = CreateSocket(socket_factory, family, type, protocol);
|
898
|
+
} else {
|
899
|
+
newfd = -1;
|
900
|
+
errno = EAFNOSUPPORT;
|
901
|
+
}
|
902
|
+
if (newfd < 0) {
|
903
|
+
return ErrorForFd(newfd, addr);
|
904
|
+
}
|
905
|
+
PosixSocketWrapper sock(newfd);
|
906
|
+
// Check if we've got a valid dualstack socket.
|
907
|
+
if (sock.SetSocketDualStack()) {
|
908
|
+
dsmode = PosixSocketWrapper::DSMode::DSMODE_DUALSTACK;
|
909
|
+
return sock;
|
910
|
+
}
|
911
|
+
// If this isn't an IPv4 address, then return whatever we've got.
|
912
|
+
if (!SockaddrIsV4Mapped(&addr, nullptr)) {
|
913
|
+
dsmode = PosixSocketWrapper::DSMode::DSMODE_IPV6;
|
914
|
+
return sock;
|
915
|
+
}
|
916
|
+
// Fall back to AF_INET.
|
917
|
+
if (newfd >= 0) {
|
918
|
+
close(newfd);
|
919
|
+
}
|
920
|
+
family = AF_INET;
|
921
|
+
}
|
922
|
+
dsmode = family == AF_INET ? PosixSocketWrapper::DSMode::DSMODE_IPV4
|
923
|
+
: PosixSocketWrapper::DSMode::DSMODE_NONE;
|
924
|
+
newfd = CreateSocket(socket_factory, family, type, protocol);
|
925
|
+
if (newfd < 0) {
|
926
|
+
return ErrorForFd(newfd, addr);
|
927
|
+
}
|
928
|
+
return PosixSocketWrapper(newfd);
|
929
|
+
}
|
930
|
+
|
931
|
+
absl::StatusOr<PosixSocketWrapper::PosixSocketCreateResult>
|
932
|
+
PosixSocketWrapper::CreateAndPrepareTcpClientSocket(
|
933
|
+
const PosixTcpOptions& options,
|
934
|
+
const EventEngine::ResolvedAddress& target_addr) {
|
935
|
+
PosixSocketWrapper::DSMode dsmode;
|
936
|
+
EventEngine::ResolvedAddress mapped_target_addr;
|
937
|
+
|
938
|
+
// Use dualstack sockets where available. Set mapped to v6 or v4 mapped to
|
939
|
+
// v6.
|
940
|
+
if (!SockaddrToV4Mapped(&target_addr, &mapped_target_addr)) {
|
941
|
+
// addr is v4 mapped to v6 or just v6.
|
942
|
+
mapped_target_addr = target_addr;
|
943
|
+
}
|
944
|
+
absl::StatusOr<PosixSocketWrapper> posix_socket_wrapper =
|
945
|
+
PosixSocketWrapper::CreateDualStackSocket(nullptr, mapped_target_addr,
|
946
|
+
SOCK_STREAM, 0, dsmode);
|
947
|
+
if (!posix_socket_wrapper.ok()) {
|
948
|
+
return posix_socket_wrapper.status();
|
949
|
+
}
|
950
|
+
|
951
|
+
if (dsmode == PosixSocketWrapper::DSMode::DSMODE_IPV4) {
|
952
|
+
// Original addr is either v4 or v4 mapped to v6. Set mapped_addr to v4.
|
953
|
+
if (!SockaddrIsV4Mapped(&target_addr, &mapped_target_addr)) {
|
954
|
+
mapped_target_addr = target_addr;
|
955
|
+
}
|
956
|
+
}
|
957
|
+
|
958
|
+
auto error = PrepareTcpClientSocket(*posix_socket_wrapper, mapped_target_addr,
|
959
|
+
options);
|
960
|
+
if (!error.ok()) {
|
961
|
+
return error;
|
962
|
+
}
|
963
|
+
return PosixSocketWrapper::PosixSocketCreateResult{*posix_socket_wrapper,
|
964
|
+
mapped_target_addr};
|
965
|
+
}
|
966
|
+
|
967
|
+
#else /* GRPC_POSIX_SOCKET_UTILS_COMMON */
|
968
|
+
|
969
|
+
bool SockaddrIsV4Mapped(const EventEngine::ResolvedAddress* /*resolved_addr*/,
|
970
|
+
EventEngine::ResolvedAddress* /*resolved_addr4_out*/) {
|
971
|
+
GPR_ASSERT(false && "unimplemented");
|
972
|
+
}
|
973
|
+
|
974
|
+
bool SockaddrToV4Mapped(const EventEngine::ResolvedAddress* /*resolved_addr*/,
|
975
|
+
EventEngine::ResolvedAddress* /*resolved_addr6_out*/) {
|
976
|
+
GPR_ASSERT(false && "unimplemented");
|
977
|
+
}
|
978
|
+
|
979
|
+
absl::StatusOr<std::string> SockaddrToString(
|
980
|
+
const EventEngine::ResolvedAddress* /*resolved_addr*/, bool /*normalize*/) {
|
981
|
+
GPR_ASSERT(false && "unimplemented");
|
982
|
+
}
|
983
|
+
|
984
|
+
absl::StatusOr<int> PosixSocketWrapper::SetSocketRcvLowat(int /*bytes*/) {
|
985
|
+
GPR_ASSERT(false && "unimplemented");
|
986
|
+
}
|
987
|
+
|
988
|
+
absl::Status PosixSocketWrapper::SetSocketZeroCopy() {
|
989
|
+
GPR_ASSERT(false && "unimplemented");
|
990
|
+
}
|
991
|
+
|
992
|
+
absl::Status PosixSocketWrapper::SetSocketNonBlocking(int /*non_blocking*/) {
|
993
|
+
GPR_ASSERT(false && "unimplemented");
|
994
|
+
}
|
995
|
+
|
996
|
+
absl::Status PosixSocketWrapper::SetSocketCloexec(int /*close_on_exec*/) {
|
997
|
+
GPR_ASSERT(false && "unimplemented");
|
998
|
+
}
|
999
|
+
|
1000
|
+
absl::Status PosixSocketWrapper::SetSocketReuseAddr(int /*reuse*/) {
|
1001
|
+
GPR_ASSERT(false && "unimplemented");
|
1002
|
+
}
|
1003
|
+
|
1004
|
+
absl::Status PosixSocketWrapper::SetSocketLowLatency(int /*low_latency*/) {
|
1005
|
+
GPR_ASSERT(false && "unimplemented");
|
1006
|
+
}
|
1007
|
+
|
1008
|
+
absl::Status PosixSocketWrapper::SetSocketReusePort(int /*reuse*/) {
|
1009
|
+
GPR_ASSERT(false && "unimplemented");
|
1010
|
+
}
|
1011
|
+
|
1012
|
+
void PosixSocketWrapper::ConfigureDefaultTcpUserTimeout(bool /*enable*/,
|
1013
|
+
int /*timeout*/,
|
1014
|
+
bool /*is_client*/) {}
|
1015
|
+
|
1016
|
+
void PosixSocketWrapper::TrySetSocketTcpUserTimeout(
|
1017
|
+
const PosixTcpOptions& /*options*/, bool /*is_client*/) {
|
1018
|
+
GPR_ASSERT(false && "unimplemented");
|
1019
|
+
}
|
1020
|
+
|
1021
|
+
absl::Status PosixSocketWrapper::SetSocketNoSigpipeIfPossible() {
|
1022
|
+
GPR_ASSERT(false && "unimplemented");
|
1023
|
+
}
|
1024
|
+
|
1025
|
+
absl::Status PosixSocketWrapper::SetSocketIpPktInfoIfPossible() {
|
1026
|
+
GPR_ASSERT(false && "unimplemented");
|
1027
|
+
}
|
1028
|
+
|
1029
|
+
absl::Status PosixSocketWrapper::SetSocketIpv6RecvPktInfoIfPossible() {
|
1030
|
+
GPR_ASSERT(false && "unimplemented");
|
1031
|
+
}
|
1032
|
+
|
1033
|
+
absl::Status PosixSocketWrapper::SetSocketSndBuf(int /*buffer_size_bytes*/) {
|
1034
|
+
GPR_ASSERT(false && "unimplemented");
|
1035
|
+
}
|
1036
|
+
|
1037
|
+
absl::Status PosixSocketWrapper::SetSocketRcvBuf(int /*buffer_size_bytes*/) {
|
1038
|
+
GPR_ASSERT(false && "unimplemented");
|
1039
|
+
}
|
1040
|
+
|
1041
|
+
absl::Status PosixSocketWrapper::SetSocketMutator(
|
1042
|
+
grpc_fd_usage /*usage*/, grpc_socket_mutator* /*mutator*/) {
|
1043
|
+
GPR_ASSERT(false && "unimplemented");
|
1044
|
+
}
|
1045
|
+
|
1046
|
+
absl::Status PosixSocketWrapper::ApplySocketMutatorInOptions(
|
1047
|
+
grpc_fd_usage /*usage*/, const PosixTcpOptions& /*options*/) {
|
1048
|
+
GPR_ASSERT(false && "unimplemented");
|
1049
|
+
}
|
1050
|
+
|
1051
|
+
bool PosixSocketWrapper::SetSocketDualStack() {
|
1052
|
+
GPR_ASSERT(false && "unimplemented");
|
1053
|
+
}
|
1054
|
+
|
1055
|
+
bool PosixSocketWrapper::IsSocketReusePortSupported() {
|
1056
|
+
GPR_ASSERT(false && "unimplemented");
|
1057
|
+
}
|
1058
|
+
|
1059
|
+
bool PosixSocketWrapper::IsIpv6LoopbackAvailable() {
|
1060
|
+
GPR_ASSERT(false && "unimplemented");
|
1061
|
+
}
|
1062
|
+
|
1063
|
+
absl::StatusOr<PosixSocketWrapper> PosixSocketWrapper::CreateDualStackSocket(
|
1064
|
+
std::function<int(int /*domain*/, int /*type*/, int /*protocol*/)>
|
1065
|
+
/* socket_factory */,
|
1066
|
+
const experimental::EventEngine::ResolvedAddress& /*addr*/, int /*type*/,
|
1067
|
+
int /*protocol*/, DSMode& /*dsmode*/) {
|
1068
|
+
GPR_ASSERT(false && "unimplemented");
|
1069
|
+
}
|
1070
|
+
|
1071
|
+
absl::StatusOr<PosixSocketWrapper::PosixSocketCreateResult>
|
1072
|
+
PosixSocketWrapper::CreateAndPrepareTcpClientSocket(
|
1073
|
+
const PosixTcpOptions& /*options*/,
|
1074
|
+
const EventEngine::ResolvedAddress& /*target_addr*/) {
|
1075
|
+
GPR_ASSERT(false && "unimplemented");
|
1076
|
+
}
|
1077
|
+
|
1078
|
+
#endif /* GRPC_POSIX_SOCKET_UTILS_COMMON */
|
1079
|
+
|
1080
|
+
} // namespace posix_engine
|
1081
|
+
} // namespace grpc_event_engine
|