grpc 1.74.1 → 1.75.0.pre1
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 +83 -41
- data/include/grpc/credentials.h +7 -1
- data/src/core/call/client_call.cc +4 -4
- data/src/core/call/filter_fusion.h +1230 -0
- data/src/core/call/metadata.cc +22 -0
- data/src/core/call/metadata.h +24 -2
- data/src/core/channelz/channelz.cc +10 -17
- data/src/core/channelz/channelz.h +58 -19
- data/src/core/channelz/channelz_registry.cc +0 -162
- data/src/core/channelz/channelz_registry.h +14 -7
- data/src/core/channelz/property_list.cc +19 -23
- data/src/core/channelz/property_list.h +3 -1
- data/src/core/channelz/v2tov1/convert.cc +683 -0
- data/src/core/channelz/v2tov1/convert.h +58 -0
- data/src/core/channelz/v2tov1/legacy_api.cc +425 -0
- data/src/core/channelz/v2tov1/legacy_api.h +32 -0
- data/src/core/channelz/v2tov1/property_list.cc +118 -0
- data/src/core/channelz/v2tov1/property_list.h +52 -0
- data/src/core/client_channel/client_channel_filter.cc +5 -4
- data/src/core/client_channel/client_channel_filter.h +2 -2
- data/src/core/client_channel/client_channel_internal.h +2 -1
- data/src/core/client_channel/load_balanced_call_destination.cc +6 -5
- data/src/core/client_channel/subchannel.cc +14 -6
- data/src/core/client_channel/subchannel.h +2 -0
- data/src/core/config/core_configuration.cc +3 -1
- data/src/core/config/core_configuration.h +12 -0
- data/src/core/credentials/transport/alts/alts_credentials.cc +5 -0
- data/src/core/credentials/transport/alts/check_gcp_environment_windows.cc +2 -0
- data/src/core/credentials/transport/channel_creds_registry_init.cc +3 -1
- data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -1
- data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -3
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -24
- data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +19 -8
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +96 -54
- data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +15 -2
- data/src/core/credentials/transport/tls/spiffe_utils.cc +371 -0
- data/src/core/credentials/transport/tls/spiffe_utils.h +171 -0
- data/src/core/credentials/transport/tls/ssl_utils.cc +11 -10
- data/src/core/credentials/transport/tls/ssl_utils.h +4 -2
- data/src/core/credentials/transport/tls/tls_credentials.cc +2 -0
- data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -26
- data/src/core/credentials/transport/tls/tls_security_connector.h +12 -12
- data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -2
- data/src/core/ext/filters/http/client/http_client_filter.cc +3 -6
- data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
- data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
- data/src/core/ext/filters/http/server/http_server_filter.cc +3 -6
- data/src/core/ext/filters/message_size/message_size_filter.cc +4 -4
- data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
- data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -5
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +3 -2
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
- data/src/core/ext/transport/chttp2/transport/frame.cc +89 -6
- data/src/core/ext/transport/chttp2/transport/frame.h +38 -0
- data/src/core/ext/transport/chttp2/transport/header_assembler.h +5 -14
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -1
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +294 -78
- data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +128 -9
- data/src/core/ext/transport/chttp2/transport/http2_settings.cc +11 -38
- data/src/core/ext/transport/chttp2/transport/http2_settings.h +52 -35
- data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +61 -0
- data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +142 -0
- data/src/core/ext/transport/chttp2/transport/http2_transport.cc +81 -3
- data/src/core/ext/transport/chttp2/transport/http2_transport.h +12 -1
- data/src/core/ext/transport/chttp2/transport/message_assembler.h +2 -2
- data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/ping_promise.cc +2 -1
- data/src/core/ext/transport/chttp2/transport/ping_promise.h +22 -5
- data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +607 -0
- data/src/core/ext/transport/chttp2/transport/writable_streams.h +254 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +6 -4
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb.h +4959 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.c +1111 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.h +108 -0
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +142 -54
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +18 -14
- data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +2 -2
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +716 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.h +227 -0
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +86 -88
- data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +2 -2
- data/src/core/filter/auth/auth_filters.h +2 -2
- data/src/core/filter/fused_filters.cc +154 -0
- data/src/core/handshaker/security/legacy_secure_endpoint.cc +1 -1
- data/src/core/handshaker/security/pipelined_secure_endpoint.cc +965 -0
- data/src/core/handshaker/security/secure_endpoint.cc +28 -13
- data/src/core/handshaker/security/secure_endpoint.h +8 -0
- data/src/core/lib/channel/promise_based_filter.cc +15 -25
- data/src/core/lib/channel/promise_based_filter.h +6 -5
- data/src/core/lib/event_engine/ares_resolver.h +3 -1
- data/src/core/lib/event_engine/cf_engine/cf_engine.cc +9 -5
- data/src/core/lib/event_engine/cf_engine/cf_engine.h +2 -1
- data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +263 -0
- data/src/core/lib/event_engine/cf_engine/cfsocket_listener.h +107 -0
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +31 -3
- data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +12 -0
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -10
- data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +6 -4
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -14
- data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -5
- data/src/core/lib/event_engine/posix_engine/event_poller.h +0 -8
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +11 -5
- data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +3 -2
- data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +1 -0
- data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +4 -4
- data/src/core/lib/event_engine/posix_engine/lockfree_event.h +3 -4
- data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +2 -2
- data/src/core/lib/event_engine/posix_engine/posix_engine.cc +188 -199
- data/src/core/lib/event_engine/posix_engine/posix_engine.h +30 -45
- data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -1
- data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
- data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +2 -1
- data/src/core/lib/experiments/experiments.cc +120 -6
- data/src/core/lib/experiments/experiments.h +46 -3
- data/src/core/lib/iomgr/combiner.cc +1 -1
- data/src/core/lib/iomgr/exec_ctx.h +3 -9
- data/src/core/lib/iomgr/socket_mutator.cc +1 -1
- data/src/core/lib/iomgr/socket_utils_posix.cc +1 -1
- data/src/core/lib/iomgr/socket_utils_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
- data/src/core/lib/iomgr/tcp_posix.cc +3 -3
- data/src/core/lib/promise/activity.h +2 -2
- data/src/core/lib/promise/mpsc.cc +8 -8
- data/src/core/lib/promise/party.cc +7 -7
- data/src/core/lib/promise/party.h +4 -4
- data/src/core/lib/promise/poll.h +10 -0
- data/src/core/lib/resource_quota/memory_quota.cc +90 -3
- data/src/core/lib/resource_quota/memory_quota.h +20 -9
- data/src/core/lib/resource_quota/periodic_update.cc +14 -0
- data/src/core/lib/resource_quota/periodic_update.h +8 -0
- data/src/core/lib/resource_quota/resource_quota.cc +15 -4
- data/src/core/lib/resource_quota/resource_quota.h +3 -0
- data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
- data/src/core/lib/surface/call.cc +5 -5
- data/src/core/lib/surface/call.h +6 -5
- data/src/core/lib/surface/completion_queue.cc +2 -4
- data/src/core/lib/surface/filter_stack_call.cc +1 -1
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/promise_endpoint.cc +2 -2
- data/src/core/lib/transport/promise_endpoint.h +3 -3
- data/src/core/load_balancing/endpoint_list.cc +29 -2
- data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +3 -3
- data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -1
- data/src/core/load_balancing/pick_first/pick_first.cc +12 -5
- data/src/core/load_balancing/xds/xds_cluster_impl.cc +5 -3
- data/src/core/net/socket_mutator.cc +19 -0
- data/src/core/net/socket_mutator.h +25 -0
- data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +6 -1
- data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -1
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +8 -5
- data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -1
- data/src/core/resolver/xds/xds_dependency_manager.cc +1 -1
- data/src/core/server/server.cc +1 -1
- data/src/core/server/server_call_tracer_filter.cc +0 -66
- data/src/core/server/server_call_tracer_filter.h +64 -0
- data/src/core/server/server_config_selector_filter.cc +1 -1
- data/src/core/service_config/service_config_channel_arg_filter.cc +3 -60
- data/src/core/service_config/service_config_channel_arg_filter.h +82 -0
- data/src/core/telemetry/call_tracer.cc +20 -14
- data/src/core/telemetry/call_tracer.h +22 -17
- data/src/core/telemetry/metrics.h +8 -8
- data/src/core/telemetry/stats_data.cc +151 -151
- data/src/core/telemetry/stats_data.h +87 -87
- data/src/core/transport/auth_context.cc +20 -0
- data/src/core/transport/auth_context.h +4 -0
- data/src/core/transport/auth_context_comparator_registry.h +69 -0
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -3
- data/src/core/tsi/ssl_transport_security.cc +202 -32
- data/src/core/tsi/ssl_transport_security.h +19 -10
- data/src/core/tsi/ssl_transport_security_utils.cc +21 -0
- data/src/core/tsi/ssl_transport_security_utils.h +4 -0
- data/src/core/util/http_client/httpcli_security_connector.cc +3 -1
- data/src/core/util/latent_see.cc +178 -146
- data/src/core/util/latent_see.h +245 -188
- data/src/core/util/single_set_ptr.h +5 -2
- data/src/core/util/useful.h +91 -0
- data/src/core/util/windows/directory_reader.cc +1 -0
- data/src/core/util/windows/thd.cc +1 -3
- data/src/core/util/work_serializer.cc +1 -1
- data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +32 -5
- data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +5 -0
- data/src/core/xds/grpc/xds_certificate_provider.cc +5 -6
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/third_party/cares/cares/include/ares.h +925 -460
- data/third_party/cares/cares/include/ares_dns.h +86 -71
- data/third_party/cares/cares/include/ares_dns_record.h +1118 -0
- data/third_party/cares/cares/include/ares_nameser.h +215 -189
- data/third_party/cares/cares/include/ares_version.h +37 -14
- data/third_party/cares/cares/src/lib/ares_addrinfo2hostent.c +305 -0
- data/third_party/cares/cares/src/lib/ares_addrinfo_localhost.c +245 -0
- data/third_party/cares/cares/src/lib/ares_android.c +216 -164
- data/third_party/cares/cares/src/lib/ares_android.h +25 -14
- data/third_party/cares/cares/src/lib/ares_cancel.c +68 -44
- data/third_party/cares/cares/src/lib/ares_close_sockets.c +137 -0
- data/third_party/cares/cares/src/lib/ares_conn.c +511 -0
- data/third_party/cares/cares/src/lib/ares_conn.h +196 -0
- data/third_party/cares/cares/src/lib/ares_cookie.c +461 -0
- data/third_party/cares/cares/src/lib/ares_data.c +93 -181
- data/third_party/cares/cares/src/lib/ares_data.h +50 -39
- data/third_party/cares/cares/src/lib/ares_destroy.c +127 -89
- data/third_party/cares/cares/src/lib/ares_free_hostent.c +35 -24
- data/third_party/cares/cares/src/lib/ares_free_string.c +24 -16
- data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +45 -38
- data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +549 -663
- data/third_party/cares/cares/src/lib/ares_getenv.c +25 -15
- data/third_party/cares/cares/src/lib/ares_getenv.h +26 -18
- data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +163 -221
- data/third_party/cares/cares/src/lib/ares_gethostbyname.c +222 -223
- data/third_party/cares/cares/src/lib/ares_getnameinfo.c +328 -338
- data/third_party/cares/cares/src/lib/ares_hosts_file.c +952 -0
- data/third_party/cares/cares/src/lib/ares_inet_net_pton.h +25 -19
- data/third_party/cares/cares/src/lib/ares_init.c +425 -2091
- data/third_party/cares/cares/src/lib/ares_ipv6.h +63 -33
- data/third_party/cares/cares/src/lib/ares_library_init.c +110 -54
- data/third_party/cares/cares/src/lib/ares_metrics.c +261 -0
- data/third_party/cares/cares/src/lib/ares_options.c +418 -332
- data/third_party/cares/cares/src/lib/ares_parse_into_addrinfo.c +179 -0
- data/third_party/cares/cares/src/lib/ares_private.h +558 -356
- data/third_party/cares/cares/src/lib/ares_process.c +1224 -1369
- data/third_party/cares/cares/src/lib/ares_qcache.c +430 -0
- data/third_party/cares/cares/src/lib/ares_query.c +126 -121
- data/third_party/cares/cares/src/lib/ares_search.c +564 -262
- data/third_party/cares/cares/src/lib/ares_send.c +264 -93
- data/third_party/cares/cares/src/lib/ares_set_socket_functions.c +588 -0
- data/third_party/cares/cares/src/lib/ares_setup.h +115 -111
- data/third_party/cares/cares/src/lib/ares_socket.c +425 -0
- data/third_party/cares/cares/src/lib/ares_socket.h +163 -0
- data/third_party/cares/cares/src/lib/ares_sortaddrinfo.c +447 -0
- data/third_party/cares/cares/src/lib/ares_strerror.c +83 -48
- data/third_party/cares/cares/src/lib/ares_sysconfig.c +639 -0
- data/third_party/cares/cares/src/lib/ares_sysconfig_files.c +839 -0
- data/third_party/cares/cares/src/lib/ares_sysconfig_mac.c +373 -0
- data/third_party/cares/cares/src/lib/ares_sysconfig_win.c +621 -0
- data/third_party/cares/cares/src/lib/ares_timeout.c +136 -73
- data/third_party/cares/cares/src/lib/ares_update_servers.c +1362 -0
- data/third_party/cares/cares/src/lib/ares_version.c +29 -4
- data/third_party/cares/cares/src/lib/config-dos.h +88 -89
- data/third_party/cares/cares/src/lib/config-win32.h +122 -77
- data/third_party/cares/cares/src/lib/dsa/ares_array.c +394 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable.c +447 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable.h +174 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable_asvp.c +224 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable_dict.c +228 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable_strvp.c +210 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable_szvp.c +188 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable_vpstr.c +186 -0
- data/third_party/cares/cares/src/lib/dsa/ares_htable_vpvp.c +194 -0
- data/third_party/cares/cares/src/lib/dsa/ares_llist.c +382 -0
- data/third_party/cares/cares/src/lib/dsa/ares_slist.c +479 -0
- data/third_party/cares/cares/src/lib/dsa/ares_slist.h +207 -0
- data/third_party/cares/cares/src/lib/event/ares_event.h +191 -0
- data/third_party/cares/cares/src/lib/event/ares_event_configchg.c +743 -0
- data/third_party/cares/cares/src/lib/event/ares_event_epoll.c +192 -0
- data/third_party/cares/cares/src/lib/event/ares_event_kqueue.c +248 -0
- data/third_party/cares/cares/src/lib/event/ares_event_poll.c +140 -0
- data/third_party/cares/cares/src/lib/event/ares_event_select.c +159 -0
- data/third_party/cares/cares/src/lib/event/ares_event_thread.c +567 -0
- data/third_party/cares/cares/src/lib/event/ares_event_wake_pipe.c +166 -0
- data/third_party/cares/cares/src/lib/event/ares_event_win32.c +978 -0
- data/third_party/cares/cares/src/lib/event/ares_event_win32.h +161 -0
- data/third_party/cares/cares/src/lib/include/ares_array.h +276 -0
- data/third_party/cares/cares/src/lib/include/ares_buf.h +732 -0
- data/third_party/cares/cares/src/lib/include/ares_htable_asvp.h +130 -0
- data/third_party/cares/cares/src/lib/include/ares_htable_dict.h +123 -0
- data/third_party/cares/cares/src/lib/include/ares_htable_strvp.h +130 -0
- data/third_party/cares/cares/src/lib/include/ares_htable_szvp.h +118 -0
- data/third_party/cares/cares/src/lib/include/ares_htable_vpstr.h +111 -0
- data/third_party/cares/cares/src/lib/include/ares_htable_vpvp.h +128 -0
- data/third_party/cares/cares/src/lib/include/ares_llist.h +239 -0
- data/third_party/cares/cares/src/lib/include/ares_mem.h +38 -0
- data/third_party/cares/cares/src/lib/include/ares_str.h +244 -0
- data/third_party/cares/cares/src/lib/inet_net_pton.c +202 -157
- data/third_party/cares/cares/src/lib/inet_ntop.c +87 -69
- data/third_party/cares/cares/src/lib/legacy/ares_create_query.c +78 -0
- data/third_party/cares/cares/src/lib/legacy/ares_expand_name.c +99 -0
- data/third_party/cares/cares/src/lib/legacy/ares_expand_string.c +107 -0
- data/third_party/cares/cares/src/lib/legacy/ares_fds.c +80 -0
- data/third_party/cares/cares/src/lib/legacy/ares_getsock.c +85 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_a_reply.c +107 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
- data/third_party/cares/cares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_mapping.c +982 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_multistring.c +307 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_multistring.h +72 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_name.c +673 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_parse.c +1329 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_private.h +273 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_record.c +1661 -0
- data/third_party/cares/cares/src/lib/record/ares_dns_write.c +1229 -0
- data/third_party/cares/cares/src/lib/str/ares_buf.c +1498 -0
- data/third_party/cares/cares/src/lib/str/ares_str.c +508 -0
- data/third_party/cares/cares/src/lib/str/ares_strsplit.c +90 -0
- data/third_party/cares/cares/src/lib/str/ares_strsplit.h +51 -0
- data/third_party/cares/cares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
- data/third_party/cares/cares/src/lib/util/ares_iface_ips.c +628 -0
- data/third_party/cares/cares/src/lib/util/ares_iface_ips.h +139 -0
- data/third_party/cares/cares/src/lib/util/ares_math.c +158 -0
- data/third_party/cares/cares/src/lib/util/ares_math.h +45 -0
- data/third_party/cares/cares/src/lib/util/ares_rand.c +389 -0
- data/third_party/cares/cares/src/lib/util/ares_rand.h +36 -0
- data/third_party/cares/cares/src/lib/util/ares_threads.c +614 -0
- data/third_party/cares/cares/src/lib/util/ares_threads.h +60 -0
- data/third_party/cares/cares/src/lib/util/ares_time.h +48 -0
- data/third_party/cares/cares/src/lib/util/ares_timeval.c +95 -0
- data/third_party/cares/cares/src/lib/util/ares_uri.c +1626 -0
- data/third_party/cares/cares/src/lib/util/ares_uri.h +252 -0
- data/third_party/cares/cares/src/lib/windows_port.c +16 -9
- metadata +121 -49
- data/src/core/util/ring_buffer.h +0 -122
- data/third_party/cares/cares/include/ares_rules.h +0 -125
- data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +0 -266
- data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +0 -240
- data/third_party/cares/cares/src/lib/ares__close_sockets.c +0 -61
- data/third_party/cares/cares/src/lib/ares__get_hostent.c +0 -260
- data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +0 -229
- data/third_party/cares/cares/src/lib/ares__read_line.c +0 -73
- data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +0 -258
- data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +0 -507
- data/third_party/cares/cares/src/lib/ares__timeval.c +0 -111
- data/third_party/cares/cares/src/lib/ares_create_query.c +0 -197
- data/third_party/cares/cares/src/lib/ares_expand_name.c +0 -311
- data/third_party/cares/cares/src/lib/ares_expand_string.c +0 -67
- data/third_party/cares/cares/src/lib/ares_fds.c +0 -59
- data/third_party/cares/cares/src/lib/ares_getsock.c +0 -66
- data/third_party/cares/cares/src/lib/ares_iphlpapi.h +0 -221
- data/third_party/cares/cares/src/lib/ares_llist.c +0 -63
- data/third_party/cares/cares/src/lib/ares_llist.h +0 -39
- data/third_party/cares/cares/src/lib/ares_mkquery.c +0 -24
- data/third_party/cares/cares/src/lib/ares_nowarn.c +0 -260
- data/third_party/cares/cares/src/lib/ares_nowarn.h +0 -61
- data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +0 -90
- data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +0 -92
- data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +0 -199
- data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +0 -164
- data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +0 -183
- data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +0 -177
- data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +0 -228
- data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +0 -179
- data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +0 -168
- data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +0 -214
- data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +0 -184
- data/third_party/cares/cares/src/lib/ares_platform.c +0 -11042
- data/third_party/cares/cares/src/lib/ares_platform.h +0 -43
- data/third_party/cares/cares/src/lib/ares_rand.c +0 -279
- data/third_party/cares/cares/src/lib/ares_strcasecmp.c +0 -66
- data/third_party/cares/cares/src/lib/ares_strcasecmp.h +0 -30
- data/third_party/cares/cares/src/lib/ares_strdup.c +0 -42
- data/third_party/cares/cares/src/lib/ares_strdup.h +0 -24
- data/third_party/cares/cares/src/lib/ares_strsplit.c +0 -94
- data/third_party/cares/cares/src/lib/ares_strsplit.h +0 -42
- data/third_party/cares/cares/src/lib/ares_writev.c +0 -79
- data/third_party/cares/cares/src/lib/ares_writev.h +0 -36
- data/third_party/cares/cares/src/lib/bitncmp.c +0 -59
- data/third_party/cares/cares/src/lib/bitncmp.h +0 -26
- data/third_party/cares/cares/src/lib/setup_once.h +0 -554
- data/third_party/cares/cares/src/tools/ares_getopt.h +0 -53
@@ -0,0 +1,511 @@
|
|
1
|
+
/* MIT License
|
2
|
+
*
|
3
|
+
* Copyright (c) Massachusetts Institute of Technology
|
4
|
+
* Copyright (c) The c-ares project and its contributors
|
5
|
+
*
|
6
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
7
|
+
* of this software and associated documentation files (the "Software"), to deal
|
8
|
+
* in the Software without restriction, including without limitation the rights
|
9
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
10
|
+
* copies of the Software, and to permit persons to whom the Software is
|
11
|
+
* furnished to do so, subject to the following conditions:
|
12
|
+
*
|
13
|
+
* The above copyright notice and this permission notice (including the next
|
14
|
+
* paragraph) shall be included in all copies or substantial portions of the
|
15
|
+
* Software.
|
16
|
+
*
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
23
|
+
* SOFTWARE.
|
24
|
+
*
|
25
|
+
* SPDX-License-Identifier: MIT
|
26
|
+
*/
|
27
|
+
#include "ares_private.h"
|
28
|
+
|
29
|
+
void ares_conn_sock_state_cb_update(ares_conn_t *conn,
|
30
|
+
ares_conn_state_flags_t flags)
|
31
|
+
{
|
32
|
+
ares_channel_t *channel = conn->server->channel;
|
33
|
+
|
34
|
+
if ((conn->state_flags & ARES_CONN_STATE_CBFLAGS) != flags &&
|
35
|
+
channel->sock_state_cb) {
|
36
|
+
channel->sock_state_cb(channel->sock_state_cb_data, conn->fd,
|
37
|
+
flags & ARES_CONN_STATE_READ ? 1 : 0,
|
38
|
+
flags & ARES_CONN_STATE_WRITE ? 1 : 0);
|
39
|
+
}
|
40
|
+
|
41
|
+
conn->state_flags &= ~((unsigned int)ARES_CONN_STATE_CBFLAGS);
|
42
|
+
conn->state_flags |= flags;
|
43
|
+
}
|
44
|
+
|
45
|
+
ares_conn_err_t ares_conn_read(ares_conn_t *conn, void *data, size_t len,
|
46
|
+
size_t *read_bytes)
|
47
|
+
{
|
48
|
+
ares_channel_t *channel = conn->server->channel;
|
49
|
+
ares_conn_err_t err;
|
50
|
+
|
51
|
+
if (!(conn->flags & ARES_CONN_FLAG_TCP)) {
|
52
|
+
struct sockaddr_storage sa_storage;
|
53
|
+
ares_socklen_t salen = sizeof(sa_storage);
|
54
|
+
|
55
|
+
memset(&sa_storage, 0, sizeof(sa_storage));
|
56
|
+
|
57
|
+
err =
|
58
|
+
ares_socket_recvfrom(channel, conn->fd, ARES_FALSE, data, len, 0,
|
59
|
+
(struct sockaddr *)&sa_storage, &salen, read_bytes);
|
60
|
+
|
61
|
+
#ifdef HAVE_RECVFROM
|
62
|
+
if (err == ARES_CONN_ERR_SUCCESS &&
|
63
|
+
!ares_sockaddr_addr_eq((struct sockaddr *)&sa_storage,
|
64
|
+
&conn->server->addr)) {
|
65
|
+
err = ARES_CONN_ERR_WOULDBLOCK;
|
66
|
+
}
|
67
|
+
#endif
|
68
|
+
} else {
|
69
|
+
err = ares_socket_recv(channel, conn->fd, ARES_TRUE, data, len, read_bytes);
|
70
|
+
}
|
71
|
+
|
72
|
+
/* Toggle connected state if needed */
|
73
|
+
if (err == ARES_CONN_ERR_SUCCESS) {
|
74
|
+
conn->state_flags |= ARES_CONN_STATE_CONNECTED;
|
75
|
+
}
|
76
|
+
|
77
|
+
return err;
|
78
|
+
}
|
79
|
+
|
80
|
+
/* Use like:
|
81
|
+
* struct sockaddr_storage sa_storage;
|
82
|
+
* ares_socklen_t salen = sizeof(sa_storage);
|
83
|
+
* struct sockaddr *sa = (struct sockaddr *)&sa_storage;
|
84
|
+
* ares_conn_set_sockaddr(conn, sa, &salen);
|
85
|
+
*/
|
86
|
+
static ares_status_t ares_conn_set_sockaddr(const ares_conn_t *conn,
|
87
|
+
struct sockaddr *sa,
|
88
|
+
ares_socklen_t *salen)
|
89
|
+
{
|
90
|
+
const ares_server_t *server = conn->server;
|
91
|
+
unsigned short port =
|
92
|
+
conn->flags & ARES_CONN_FLAG_TCP ? server->tcp_port : server->udp_port;
|
93
|
+
struct sockaddr_in *sin;
|
94
|
+
struct sockaddr_in6 *sin6;
|
95
|
+
|
96
|
+
switch (server->addr.family) {
|
97
|
+
case AF_INET:
|
98
|
+
sin = (struct sockaddr_in *)(void *)sa;
|
99
|
+
if (*salen < (ares_socklen_t)sizeof(*sin)) {
|
100
|
+
return ARES_EFORMERR;
|
101
|
+
}
|
102
|
+
*salen = sizeof(*sin);
|
103
|
+
memset(sin, 0, sizeof(*sin));
|
104
|
+
sin->sin_family = AF_INET;
|
105
|
+
sin->sin_port = htons(port);
|
106
|
+
memcpy(&sin->sin_addr, &server->addr.addr.addr4, sizeof(sin->sin_addr));
|
107
|
+
return ARES_SUCCESS;
|
108
|
+
case AF_INET6:
|
109
|
+
sin6 = (struct sockaddr_in6 *)(void *)sa;
|
110
|
+
if (*salen < (ares_socklen_t)sizeof(*sin6)) {
|
111
|
+
return ARES_EFORMERR;
|
112
|
+
}
|
113
|
+
*salen = sizeof(*sin6);
|
114
|
+
memset(sin6, 0, sizeof(*sin6));
|
115
|
+
sin6->sin6_family = AF_INET6;
|
116
|
+
sin6->sin6_port = htons(port);
|
117
|
+
memcpy(&sin6->sin6_addr, &server->addr.addr.addr6,
|
118
|
+
sizeof(sin6->sin6_addr));
|
119
|
+
#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
|
120
|
+
sin6->sin6_scope_id = server->ll_scope;
|
121
|
+
#endif
|
122
|
+
return ARES_SUCCESS;
|
123
|
+
default:
|
124
|
+
break;
|
125
|
+
}
|
126
|
+
|
127
|
+
return ARES_EBADFAMILY;
|
128
|
+
}
|
129
|
+
|
130
|
+
static ares_status_t ares_conn_set_self_ip(ares_conn_t *conn, ares_bool_t early)
|
131
|
+
{
|
132
|
+
ares_channel_t *channel = conn->server->channel;
|
133
|
+
struct sockaddr_storage sa_storage;
|
134
|
+
int rv;
|
135
|
+
ares_socklen_t len = sizeof(sa_storage);
|
136
|
+
|
137
|
+
/* We call this twice on TFO, if we already have the IP we can go ahead and
|
138
|
+
* skip processing */
|
139
|
+
if (!early && conn->self_ip.family != AF_UNSPEC) {
|
140
|
+
return ARES_SUCCESS;
|
141
|
+
}
|
142
|
+
|
143
|
+
memset(&sa_storage, 0, sizeof(sa_storage));
|
144
|
+
|
145
|
+
if (channel->sock_funcs.agetsockname == NULL) {
|
146
|
+
/* Not specified, we can still use cookies cooked with an empty self_ip */
|
147
|
+
memset(&conn->self_ip, 0, sizeof(conn->self_ip));
|
148
|
+
return ARES_SUCCESS;
|
149
|
+
}
|
150
|
+
rv = channel->sock_funcs.agetsockname(conn->fd,
|
151
|
+
(struct sockaddr *)(void *)&sa_storage,
|
152
|
+
&len, channel->sock_func_cb_data);
|
153
|
+
if (rv != 0) {
|
154
|
+
/* During TCP FastOpen, we can't get the IP this early since connect()
|
155
|
+
* may not be called. That's ok, we'll try again later */
|
156
|
+
if (early && conn->flags & ARES_CONN_FLAG_TCP &&
|
157
|
+
conn->flags & ARES_CONN_FLAG_TFO) {
|
158
|
+
memset(&conn->self_ip, 0, sizeof(conn->self_ip));
|
159
|
+
return ARES_SUCCESS;
|
160
|
+
}
|
161
|
+
return ARES_ECONNREFUSED;
|
162
|
+
}
|
163
|
+
|
164
|
+
if (!ares_sockaddr_to_ares_addr(&conn->self_ip, NULL,
|
165
|
+
(struct sockaddr *)(void *)&sa_storage)) {
|
166
|
+
return ARES_ECONNREFUSED;
|
167
|
+
}
|
168
|
+
|
169
|
+
return ARES_SUCCESS;
|
170
|
+
}
|
171
|
+
|
172
|
+
ares_conn_err_t ares_conn_write(ares_conn_t *conn, const void *data, size_t len,
|
173
|
+
size_t *written)
|
174
|
+
{
|
175
|
+
ares_channel_t *channel = conn->server->channel;
|
176
|
+
ares_bool_t is_tfo = ARES_FALSE;
|
177
|
+
ares_conn_err_t err = ARES_CONN_ERR_SUCCESS;
|
178
|
+
struct sockaddr_storage sa_storage;
|
179
|
+
ares_socklen_t salen = 0;
|
180
|
+
struct sockaddr *sa = NULL;
|
181
|
+
|
182
|
+
*written = 0;
|
183
|
+
|
184
|
+
/* Don't try to write if not doing initial TFO and not connected */
|
185
|
+
if (conn->flags & ARES_CONN_FLAG_TCP &&
|
186
|
+
!(conn->state_flags & ARES_CONN_STATE_CONNECTED) &&
|
187
|
+
!(conn->flags & ARES_CONN_FLAG_TFO_INITIAL)) {
|
188
|
+
return ARES_CONN_ERR_WOULDBLOCK;
|
189
|
+
}
|
190
|
+
|
191
|
+
/* On initial write during TFO we need to send an address */
|
192
|
+
if (conn->flags & ARES_CONN_FLAG_TFO_INITIAL) {
|
193
|
+
salen = sizeof(sa_storage);
|
194
|
+
sa = (struct sockaddr *)&sa_storage;
|
195
|
+
|
196
|
+
conn->flags &= ~((unsigned int)ARES_CONN_FLAG_TFO_INITIAL);
|
197
|
+
is_tfo = ARES_TRUE;
|
198
|
+
|
199
|
+
if (ares_conn_set_sockaddr(conn, sa, &salen) != ARES_SUCCESS) {
|
200
|
+
return ARES_CONN_ERR_FAILURE;
|
201
|
+
}
|
202
|
+
}
|
203
|
+
|
204
|
+
err = ares_socket_write(channel, conn->fd, data, len, written, sa, salen);
|
205
|
+
if (err != ARES_CONN_ERR_SUCCESS) {
|
206
|
+
goto done;
|
207
|
+
}
|
208
|
+
|
209
|
+
if (is_tfo) {
|
210
|
+
/* If using TFO, we might not have been able to get an IP earlier, since
|
211
|
+
* we hadn't informed the OS of the destination. When using sendto()
|
212
|
+
* now we have so we should be able to fetch it */
|
213
|
+
ares_conn_set_self_ip(conn, ARES_FALSE);
|
214
|
+
goto done;
|
215
|
+
}
|
216
|
+
|
217
|
+
done:
|
218
|
+
if (err == ARES_CONN_ERR_SUCCESS && len == *written) {
|
219
|
+
/* Wrote all data, make sure we're not listening for write events unless
|
220
|
+
* using TFO, in which case we'll need a write event to know when
|
221
|
+
* we're connected. */
|
222
|
+
ares_conn_sock_state_cb_update(
|
223
|
+
conn, ARES_CONN_STATE_READ |
|
224
|
+
(is_tfo ? ARES_CONN_STATE_WRITE : ARES_CONN_STATE_NONE));
|
225
|
+
} else if (err == ARES_CONN_ERR_WOULDBLOCK) {
|
226
|
+
/* Need to wait on more buffer space to write */
|
227
|
+
ares_conn_sock_state_cb_update(conn, ARES_CONN_STATE_READ |
|
228
|
+
ARES_CONN_STATE_WRITE);
|
229
|
+
}
|
230
|
+
|
231
|
+
return err;
|
232
|
+
}
|
233
|
+
|
234
|
+
ares_status_t ares_conn_flush(ares_conn_t *conn)
|
235
|
+
{
|
236
|
+
const unsigned char *data;
|
237
|
+
size_t data_len;
|
238
|
+
size_t count;
|
239
|
+
ares_conn_err_t err;
|
240
|
+
ares_status_t status;
|
241
|
+
ares_bool_t tfo = ARES_FALSE;
|
242
|
+
|
243
|
+
if (conn == NULL) {
|
244
|
+
return ARES_EFORMERR;
|
245
|
+
}
|
246
|
+
|
247
|
+
if (conn->flags & ARES_CONN_FLAG_TFO_INITIAL) {
|
248
|
+
tfo = ARES_TRUE;
|
249
|
+
}
|
250
|
+
|
251
|
+
do {
|
252
|
+
if (ares_buf_len(conn->out_buf) == 0) {
|
253
|
+
status = ARES_SUCCESS;
|
254
|
+
goto done;
|
255
|
+
}
|
256
|
+
|
257
|
+
if (conn->flags & ARES_CONN_FLAG_TCP) {
|
258
|
+
data = ares_buf_peek(conn->out_buf, &data_len);
|
259
|
+
} else {
|
260
|
+
unsigned short msg_len;
|
261
|
+
|
262
|
+
/* Read length, then provide buffer without length */
|
263
|
+
ares_buf_tag(conn->out_buf);
|
264
|
+
status = ares_buf_fetch_be16(conn->out_buf, &msg_len);
|
265
|
+
if (status != ARES_SUCCESS) {
|
266
|
+
return status;
|
267
|
+
}
|
268
|
+
ares_buf_tag_rollback(conn->out_buf);
|
269
|
+
|
270
|
+
data = ares_buf_peek(conn->out_buf, &data_len);
|
271
|
+
if (data_len < (size_t)(msg_len + 2)) {
|
272
|
+
status = ARES_EFORMERR;
|
273
|
+
goto done;
|
274
|
+
}
|
275
|
+
data += 2;
|
276
|
+
data_len = msg_len;
|
277
|
+
}
|
278
|
+
|
279
|
+
err = ares_conn_write(conn, data, data_len, &count);
|
280
|
+
if (err != ARES_CONN_ERR_SUCCESS) {
|
281
|
+
if (err != ARES_CONN_ERR_WOULDBLOCK) {
|
282
|
+
status = ARES_ECONNREFUSED;
|
283
|
+
goto done;
|
284
|
+
}
|
285
|
+
status = ARES_SUCCESS;
|
286
|
+
goto done;
|
287
|
+
}
|
288
|
+
|
289
|
+
/* UDP didn't send the length prefix so augment that here */
|
290
|
+
if (!(conn->flags & ARES_CONN_FLAG_TCP)) {
|
291
|
+
count += 2;
|
292
|
+
}
|
293
|
+
|
294
|
+
/* Strip data written from the buffer */
|
295
|
+
ares_buf_consume(conn->out_buf, count);
|
296
|
+
status = ARES_SUCCESS;
|
297
|
+
|
298
|
+
/* Loop only for UDP since we have to send per-packet. We already
|
299
|
+
* sent everything we could if using tcp */
|
300
|
+
} while (!(conn->flags & ARES_CONN_FLAG_TCP));
|
301
|
+
|
302
|
+
done:
|
303
|
+
if (status == ARES_SUCCESS) {
|
304
|
+
ares_conn_state_flags_t flags = ARES_CONN_STATE_READ;
|
305
|
+
|
306
|
+
/* When using TFO, the we need to enabling waiting on a write event to
|
307
|
+
* be notified of when a connection is actually established */
|
308
|
+
if (tfo) {
|
309
|
+
flags |= ARES_CONN_STATE_WRITE;
|
310
|
+
}
|
311
|
+
|
312
|
+
/* If using TCP and not all data was written (partial write), that means
|
313
|
+
* we need to also wait on a write event */
|
314
|
+
if (conn->flags & ARES_CONN_FLAG_TCP && ares_buf_len(conn->out_buf)) {
|
315
|
+
flags |= ARES_CONN_STATE_WRITE;
|
316
|
+
}
|
317
|
+
|
318
|
+
ares_conn_sock_state_cb_update(conn, flags);
|
319
|
+
}
|
320
|
+
|
321
|
+
return status;
|
322
|
+
}
|
323
|
+
|
324
|
+
static ares_status_t ares_conn_connect(ares_conn_t *conn,
|
325
|
+
const struct sockaddr *sa,
|
326
|
+
ares_socklen_t salen)
|
327
|
+
{
|
328
|
+
ares_conn_err_t err;
|
329
|
+
|
330
|
+
err = ares_socket_connect(
|
331
|
+
conn->server->channel, conn->fd,
|
332
|
+
(conn->flags & ARES_CONN_FLAG_TFO) ? ARES_TRUE : ARES_FALSE, sa, salen);
|
333
|
+
|
334
|
+
if (err != ARES_CONN_ERR_WOULDBLOCK && err != ARES_CONN_ERR_SUCCESS) {
|
335
|
+
return ARES_ECONNREFUSED;
|
336
|
+
}
|
337
|
+
return ARES_SUCCESS;
|
338
|
+
}
|
339
|
+
|
340
|
+
ares_status_t ares_open_connection(ares_conn_t **conn_out,
|
341
|
+
ares_channel_t *channel,
|
342
|
+
ares_server_t *server, ares_bool_t is_tcp)
|
343
|
+
{
|
344
|
+
ares_status_t status;
|
345
|
+
struct sockaddr_storage sa_storage;
|
346
|
+
ares_socklen_t salen = sizeof(sa_storage);
|
347
|
+
struct sockaddr *sa = (struct sockaddr *)&sa_storage;
|
348
|
+
ares_conn_t *conn;
|
349
|
+
ares_llist_node_t *node = NULL;
|
350
|
+
int stype = is_tcp ? SOCK_STREAM : SOCK_DGRAM;
|
351
|
+
ares_conn_state_flags_t state_flags;
|
352
|
+
|
353
|
+
*conn_out = NULL;
|
354
|
+
|
355
|
+
conn = ares_malloc(sizeof(*conn));
|
356
|
+
if (conn == NULL) {
|
357
|
+
return ARES_ENOMEM; /* LCOV_EXCL_LINE: OutOfMemory */
|
358
|
+
}
|
359
|
+
|
360
|
+
memset(conn, 0, sizeof(*conn));
|
361
|
+
conn->fd = ARES_SOCKET_BAD;
|
362
|
+
conn->server = server;
|
363
|
+
conn->queries_to_conn = ares_llist_create(NULL);
|
364
|
+
conn->flags = is_tcp ? ARES_CONN_FLAG_TCP : ARES_CONN_FLAG_NONE;
|
365
|
+
conn->out_buf = ares_buf_create();
|
366
|
+
conn->in_buf = ares_buf_create();
|
367
|
+
|
368
|
+
if (conn->queries_to_conn == NULL || conn->out_buf == NULL ||
|
369
|
+
conn->in_buf == NULL) {
|
370
|
+
/* LCOV_EXCL_START: OutOfMemory */
|
371
|
+
status = ARES_ENOMEM;
|
372
|
+
goto done;
|
373
|
+
/* LCOV_EXCL_STOP */
|
374
|
+
}
|
375
|
+
|
376
|
+
/* Try to enable TFO always if using TCP. it will fail later on if its
|
377
|
+
* really not supported when we try to enable it on the socket. */
|
378
|
+
if (conn->flags & ARES_CONN_FLAG_TCP) {
|
379
|
+
conn->flags |= ARES_CONN_FLAG_TFO;
|
380
|
+
}
|
381
|
+
|
382
|
+
/* Convert into the struct sockaddr structure needed by the OS */
|
383
|
+
status = ares_conn_set_sockaddr(conn, sa, &salen);
|
384
|
+
if (status != ARES_SUCCESS) {
|
385
|
+
goto done;
|
386
|
+
}
|
387
|
+
|
388
|
+
/* Acquire a socket. */
|
389
|
+
if (ares_socket_open(&conn->fd, channel, server->addr.family, stype, 0) !=
|
390
|
+
ARES_CONN_ERR_SUCCESS) {
|
391
|
+
status = ARES_ECONNREFUSED;
|
392
|
+
goto done;
|
393
|
+
}
|
394
|
+
|
395
|
+
/* Configure channel configured options */
|
396
|
+
status = ares_socket_configure(
|
397
|
+
channel, server->addr.family,
|
398
|
+
(conn->flags & ARES_CONN_FLAG_TCP) ? ARES_TRUE : ARES_FALSE, conn->fd);
|
399
|
+
if (status != ARES_SUCCESS) {
|
400
|
+
goto done;
|
401
|
+
}
|
402
|
+
|
403
|
+
/* Enable TFO if possible */
|
404
|
+
if (conn->flags & ARES_CONN_FLAG_TFO &&
|
405
|
+
ares_socket_enable_tfo(channel, conn->fd) != ARES_CONN_ERR_SUCCESS) {
|
406
|
+
conn->flags &= ~((unsigned int)ARES_CONN_FLAG_TFO);
|
407
|
+
}
|
408
|
+
|
409
|
+
if (channel->sock_config_cb) {
|
410
|
+
int err =
|
411
|
+
channel->sock_config_cb(conn->fd, stype, channel->sock_config_cb_data);
|
412
|
+
if (err < 0) {
|
413
|
+
status = ARES_ECONNREFUSED;
|
414
|
+
goto done;
|
415
|
+
}
|
416
|
+
}
|
417
|
+
|
418
|
+
/* Connect */
|
419
|
+
status = ares_conn_connect(conn, sa, salen);
|
420
|
+
if (status != ARES_SUCCESS) {
|
421
|
+
goto done;
|
422
|
+
}
|
423
|
+
|
424
|
+
if (channel->sock_create_cb) {
|
425
|
+
int err =
|
426
|
+
channel->sock_create_cb(conn->fd, stype, channel->sock_create_cb_data);
|
427
|
+
if (err < 0) {
|
428
|
+
status = ARES_ECONNREFUSED;
|
429
|
+
goto done;
|
430
|
+
}
|
431
|
+
}
|
432
|
+
|
433
|
+
/* Let the connection know we haven't written our first packet yet for TFO */
|
434
|
+
if (conn->flags & ARES_CONN_FLAG_TFO) {
|
435
|
+
conn->flags |= ARES_CONN_FLAG_TFO_INITIAL;
|
436
|
+
}
|
437
|
+
|
438
|
+
/* Need to store our own ip for DNS cookie support */
|
439
|
+
status = ares_conn_set_self_ip(conn, ARES_TRUE);
|
440
|
+
if (status != ARES_SUCCESS) {
|
441
|
+
goto done; /* LCOV_EXCL_LINE: UntestablePath */
|
442
|
+
}
|
443
|
+
|
444
|
+
/* TCP connections are thrown to the end as we don't spawn multiple TCP
|
445
|
+
* connections. UDP connections are put on front where the newest connection
|
446
|
+
* can be quickly pulled */
|
447
|
+
if (is_tcp) {
|
448
|
+
node = ares_llist_insert_last(server->connections, conn);
|
449
|
+
} else {
|
450
|
+
node = ares_llist_insert_first(server->connections, conn);
|
451
|
+
}
|
452
|
+
if (node == NULL) {
|
453
|
+
/* LCOV_EXCL_START: OutOfMemory */
|
454
|
+
status = ARES_ENOMEM;
|
455
|
+
goto done;
|
456
|
+
/* LCOV_EXCL_STOP */
|
457
|
+
}
|
458
|
+
|
459
|
+
/* Register globally to quickly map event on file descriptor to connection
|
460
|
+
* node object */
|
461
|
+
if (!ares_htable_asvp_insert(channel->connnode_by_socket, conn->fd, node)) {
|
462
|
+
/* LCOV_EXCL_START: OutOfMemory */
|
463
|
+
status = ARES_ENOMEM;
|
464
|
+
goto done;
|
465
|
+
/* LCOV_EXCL_STOP */
|
466
|
+
}
|
467
|
+
|
468
|
+
state_flags = ARES_CONN_STATE_READ;
|
469
|
+
|
470
|
+
/* Get notified on connect if using TCP */
|
471
|
+
if (conn->flags & ARES_CONN_FLAG_TCP) {
|
472
|
+
state_flags |= ARES_CONN_STATE_WRITE;
|
473
|
+
}
|
474
|
+
|
475
|
+
/* Dot no attempt to update sock state callbacks on TFO until *after* the
|
476
|
+
* initial write is performed. Due to the notification event, its possible
|
477
|
+
* an erroneous read can come in before the attempt to write the data which
|
478
|
+
* might be used to set the ip address */
|
479
|
+
if (!(conn->flags & ARES_CONN_FLAG_TFO_INITIAL)) {
|
480
|
+
ares_conn_sock_state_cb_update(conn, state_flags);
|
481
|
+
}
|
482
|
+
|
483
|
+
if (is_tcp) {
|
484
|
+
server->tcp_conn = conn;
|
485
|
+
}
|
486
|
+
|
487
|
+
done:
|
488
|
+
if (status != ARES_SUCCESS) {
|
489
|
+
ares_llist_node_claim(node);
|
490
|
+
ares_llist_destroy(conn->queries_to_conn);
|
491
|
+
ares_socket_close(channel, conn->fd);
|
492
|
+
ares_buf_destroy(conn->out_buf);
|
493
|
+
ares_buf_destroy(conn->in_buf);
|
494
|
+
ares_free(conn);
|
495
|
+
} else {
|
496
|
+
*conn_out = conn;
|
497
|
+
}
|
498
|
+
return status;
|
499
|
+
}
|
500
|
+
|
501
|
+
ares_conn_t *ares_conn_from_fd(const ares_channel_t *channel, ares_socket_t fd)
|
502
|
+
{
|
503
|
+
ares_llist_node_t *node;
|
504
|
+
|
505
|
+
node = ares_htable_asvp_get_direct(channel->connnode_by_socket, fd);
|
506
|
+
if (node == NULL) {
|
507
|
+
return NULL;
|
508
|
+
}
|
509
|
+
|
510
|
+
return ares_llist_node_val(node);
|
511
|
+
}
|
@@ -0,0 +1,196 @@
|
|
1
|
+
/* MIT License
|
2
|
+
*
|
3
|
+
* Copyright (c) 2024 Brad House
|
4
|
+
*
|
5
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
* of this software and associated documentation files (the "Software"), to deal
|
7
|
+
* in the Software without restriction, including without limitation the rights
|
8
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
* copies of the Software, and to permit persons to whom the Software is
|
10
|
+
* furnished to do so, subject to the following conditions:
|
11
|
+
*
|
12
|
+
* The above copyright notice and this permission notice (including the next
|
13
|
+
* paragraph) shall be included in all copies or substantial portions of the
|
14
|
+
* Software.
|
15
|
+
*
|
16
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
17
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
18
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
19
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
20
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
21
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
22
|
+
* SOFTWARE.
|
23
|
+
*
|
24
|
+
* SPDX-License-Identifier: MIT
|
25
|
+
*/
|
26
|
+
#ifndef __ARES_CONN_H
|
27
|
+
#define __ARES_CONN_H
|
28
|
+
|
29
|
+
#include "ares_socket.h"
|
30
|
+
|
31
|
+
struct ares_conn;
|
32
|
+
typedef struct ares_conn ares_conn_t;
|
33
|
+
|
34
|
+
struct ares_server;
|
35
|
+
typedef struct ares_server ares_server_t;
|
36
|
+
|
37
|
+
typedef enum {
|
38
|
+
/*! No flags */
|
39
|
+
ARES_CONN_FLAG_NONE = 0,
|
40
|
+
/*! TCP connection, not UDP */
|
41
|
+
ARES_CONN_FLAG_TCP = 1 << 0,
|
42
|
+
/*! TCP Fast Open is enabled and being used if supported by the OS */
|
43
|
+
ARES_CONN_FLAG_TFO = 1 << 1,
|
44
|
+
/*! TCP Fast Open has not yet sent its first packet. Gets unset on first
|
45
|
+
* write to a connection */
|
46
|
+
ARES_CONN_FLAG_TFO_INITIAL = 1 << 2
|
47
|
+
} ares_conn_flags_t;
|
48
|
+
|
49
|
+
typedef enum {
|
50
|
+
ARES_CONN_STATE_NONE = 0,
|
51
|
+
ARES_CONN_STATE_READ = 1 << 0,
|
52
|
+
ARES_CONN_STATE_WRITE = 1 << 1,
|
53
|
+
ARES_CONN_STATE_CONNECTED = 1 << 2, /* This doesn't get a callback */
|
54
|
+
ARES_CONN_STATE_CBFLAGS = ARES_CONN_STATE_READ | ARES_CONN_STATE_WRITE
|
55
|
+
} ares_conn_state_flags_t;
|
56
|
+
|
57
|
+
struct ares_conn {
|
58
|
+
ares_server_t *server;
|
59
|
+
ares_socket_t fd;
|
60
|
+
struct ares_addr self_ip;
|
61
|
+
ares_conn_flags_t flags;
|
62
|
+
ares_conn_state_flags_t state_flags;
|
63
|
+
|
64
|
+
/*! Outbound buffered data that is not yet sent. Exists as one contiguous
|
65
|
+
* stream in TCP format (big endian 16bit length prefix followed by DNS
|
66
|
+
* wire-format message). For TCP this can be sent as-is, UDP this must
|
67
|
+
* be sent per-packet (stripping the length prefix) */
|
68
|
+
ares_buf_t *out_buf;
|
69
|
+
|
70
|
+
/*! Inbound buffered data that is not yet parsed. Exists as one contiguous
|
71
|
+
* stream in TCP format (big endian 16bit length prefix followed by DNS
|
72
|
+
* wire-format message). TCP may have partial data and this needs to be
|
73
|
+
* handled gracefully, but UDP will always have a full message */
|
74
|
+
ares_buf_t *in_buf;
|
75
|
+
|
76
|
+
/* total number of queries run on this connection since it was established */
|
77
|
+
size_t total_queries;
|
78
|
+
|
79
|
+
/* list of outstanding queries to this connection */
|
80
|
+
ares_llist_t *queries_to_conn;
|
81
|
+
};
|
82
|
+
|
83
|
+
/*! Various buckets for grouping history */
|
84
|
+
typedef enum {
|
85
|
+
ARES_METRIC_1MINUTE = 0, /*!< Bucket for tracking over the last minute */
|
86
|
+
ARES_METRIC_15MINUTES, /*!< Bucket for tracking over the last 15 minutes */
|
87
|
+
ARES_METRIC_1HOUR, /*!< Bucket for tracking over the last hour */
|
88
|
+
ARES_METRIC_1DAY, /*!< Bucket for tracking over the last day */
|
89
|
+
ARES_METRIC_INCEPTION, /*!< Bucket for tracking since inception */
|
90
|
+
ARES_METRIC_COUNT /*!< Count of buckets, not a real bucket */
|
91
|
+
} ares_server_bucket_t;
|
92
|
+
|
93
|
+
/*! Data metrics collected for each bucket */
|
94
|
+
typedef struct {
|
95
|
+
time_t ts; /*!< Timestamp divided by bucket divisor */
|
96
|
+
unsigned int latency_min_ms; /*!< Minimum latency for queries */
|
97
|
+
unsigned int latency_max_ms; /*!< Maximum latency for queries */
|
98
|
+
ares_uint64_t total_ms; /*!< Cumulative query time for bucket */
|
99
|
+
ares_uint64_t total_count; /*!< Number of queries for bucket */
|
100
|
+
|
101
|
+
time_t prev_ts; /*!< Previous period bucket timestamp */
|
102
|
+
ares_uint64_t
|
103
|
+
prev_total_ms; /*!< Previous period bucket cumulative query time */
|
104
|
+
ares_uint64_t prev_total_count; /*!< Previous period bucket query count */
|
105
|
+
} ares_server_metrics_t;
|
106
|
+
|
107
|
+
typedef enum {
|
108
|
+
ARES_COOKIE_INITIAL = 0,
|
109
|
+
ARES_COOKIE_GENERATED = 1,
|
110
|
+
ARES_COOKIE_SUPPORTED = 2,
|
111
|
+
ARES_COOKIE_UNSUPPORTED = 3
|
112
|
+
} ares_cookie_state_t;
|
113
|
+
|
114
|
+
/*! Structure holding tracking data for RFC 7873/9018 DNS cookies.
|
115
|
+
* Implementation plan for this feature is here:
|
116
|
+
* https://github.com/c-ares/c-ares/issues/620
|
117
|
+
*/
|
118
|
+
typedef struct {
|
119
|
+
/*! starts at INITIAL, transitions as needed. */
|
120
|
+
ares_cookie_state_t state;
|
121
|
+
/*! randomly-generate client cookie */
|
122
|
+
unsigned char client[8];
|
123
|
+
/*! timestamp client cookie was generated, used for rotation purposes */
|
124
|
+
ares_timeval_t client_ts;
|
125
|
+
/*! IP address last used for client to connect to server. If this changes
|
126
|
+
* The client cookie gets invalidated */
|
127
|
+
struct ares_addr client_ip;
|
128
|
+
/*! Server Cookie last received, 8-32 bytes in length */
|
129
|
+
unsigned char server[32];
|
130
|
+
/*! Length of server cookie on file. */
|
131
|
+
size_t server_len;
|
132
|
+
/*! Timestamp of last attempt to use cookies, but it was determined that the
|
133
|
+
* server didn't support them */
|
134
|
+
ares_timeval_t unsupported_ts;
|
135
|
+
} ares_cookie_t;
|
136
|
+
|
137
|
+
struct ares_server {
|
138
|
+
/* Configuration */
|
139
|
+
size_t idx; /* index for server in system configuration */
|
140
|
+
struct ares_addr addr;
|
141
|
+
unsigned short udp_port; /* host byte order */
|
142
|
+
unsigned short tcp_port; /* host byte order */
|
143
|
+
char ll_iface[64]; /* IPv6 Link Local Interface */
|
144
|
+
unsigned int ll_scope; /* IPv6 Link Local Scope */
|
145
|
+
|
146
|
+
size_t consec_failures; /* Consecutive query failure count
|
147
|
+
* can be hard errors or timeouts
|
148
|
+
*/
|
149
|
+
ares_bool_t probe_pending; /* Whether a probe is pending for this
|
150
|
+
* server due to prior failures */
|
151
|
+
ares_llist_t *connections;
|
152
|
+
ares_conn_t *tcp_conn;
|
153
|
+
|
154
|
+
/* The next time when we will retry this server if it has hit failures */
|
155
|
+
ares_timeval_t next_retry_time;
|
156
|
+
|
157
|
+
/*! Buckets for collecting metrics about the server */
|
158
|
+
ares_server_metrics_t metrics[ARES_METRIC_COUNT];
|
159
|
+
|
160
|
+
/*! RFC 7873/9018 DNS Cookies */
|
161
|
+
ares_cookie_t cookie;
|
162
|
+
|
163
|
+
/* Link back to owning channel */
|
164
|
+
ares_channel_t *channel;
|
165
|
+
};
|
166
|
+
|
167
|
+
void ares_close_connection(ares_conn_t *conn, ares_status_t requeue_status);
|
168
|
+
void ares_close_sockets(ares_server_t *server);
|
169
|
+
void ares_check_cleanup_conns(const ares_channel_t *channel);
|
170
|
+
|
171
|
+
void ares_destroy_servers_state(ares_channel_t *channel);
|
172
|
+
ares_status_t ares_open_connection(ares_conn_t **conn_out,
|
173
|
+
ares_channel_t *channel,
|
174
|
+
ares_server_t *server, ares_bool_t is_tcp);
|
175
|
+
|
176
|
+
ares_conn_err_t ares_conn_write(ares_conn_t *conn, const void *data, size_t len,
|
177
|
+
size_t *written);
|
178
|
+
ares_status_t ares_conn_flush(ares_conn_t *conn);
|
179
|
+
ares_conn_err_t ares_conn_read(ares_conn_t *conn, void *data, size_t len,
|
180
|
+
size_t *read_bytes);
|
181
|
+
ares_conn_t *ares_conn_from_fd(const ares_channel_t *channel, ares_socket_t fd);
|
182
|
+
void ares_conn_sock_state_cb_update(ares_conn_t *conn,
|
183
|
+
ares_conn_state_flags_t flags);
|
184
|
+
ares_conn_err_t ares_socket_recv(ares_channel_t *channel, ares_socket_t s,
|
185
|
+
ares_bool_t is_tcp, void *data,
|
186
|
+
size_t data_len, size_t *read_bytes);
|
187
|
+
ares_conn_err_t ares_socket_recvfrom(ares_channel_t *channel, ares_socket_t s,
|
188
|
+
ares_bool_t is_tcp, void *data,
|
189
|
+
size_t data_len, int flags,
|
190
|
+
struct sockaddr *from,
|
191
|
+
ares_socklen_t *from_len,
|
192
|
+
size_t *read_bytes);
|
193
|
+
|
194
|
+
void ares_destroy_server(ares_server_t *server);
|
195
|
+
|
196
|
+
#endif
|