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.
Files changed (368) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +83 -41
  3. data/include/grpc/credentials.h +7 -1
  4. data/src/core/call/client_call.cc +4 -4
  5. data/src/core/call/filter_fusion.h +1230 -0
  6. data/src/core/call/metadata.cc +22 -0
  7. data/src/core/call/metadata.h +24 -2
  8. data/src/core/channelz/channelz.cc +10 -17
  9. data/src/core/channelz/channelz.h +58 -19
  10. data/src/core/channelz/channelz_registry.cc +0 -162
  11. data/src/core/channelz/channelz_registry.h +14 -7
  12. data/src/core/channelz/property_list.cc +19 -23
  13. data/src/core/channelz/property_list.h +3 -1
  14. data/src/core/channelz/v2tov1/convert.cc +683 -0
  15. data/src/core/channelz/v2tov1/convert.h +58 -0
  16. data/src/core/channelz/v2tov1/legacy_api.cc +425 -0
  17. data/src/core/channelz/v2tov1/legacy_api.h +32 -0
  18. data/src/core/channelz/v2tov1/property_list.cc +118 -0
  19. data/src/core/channelz/v2tov1/property_list.h +52 -0
  20. data/src/core/client_channel/client_channel_filter.cc +5 -4
  21. data/src/core/client_channel/client_channel_filter.h +2 -2
  22. data/src/core/client_channel/client_channel_internal.h +2 -1
  23. data/src/core/client_channel/load_balanced_call_destination.cc +6 -5
  24. data/src/core/client_channel/subchannel.cc +14 -6
  25. data/src/core/client_channel/subchannel.h +2 -0
  26. data/src/core/config/core_configuration.cc +3 -1
  27. data/src/core/config/core_configuration.h +12 -0
  28. data/src/core/credentials/transport/alts/alts_credentials.cc +5 -0
  29. data/src/core/credentials/transport/alts/check_gcp_environment_windows.cc +2 -0
  30. data/src/core/credentials/transport/channel_creds_registry_init.cc +3 -1
  31. data/src/core/credentials/transport/ssl/ssl_credentials.cc +1 -1
  32. data/src/core/credentials/transport/ssl/ssl_security_connector.cc +8 -3
  33. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.cc +29 -24
  34. data/src/core/credentials/transport/tls/grpc_tls_certificate_distributor.h +19 -8
  35. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.cc +96 -54
  36. data/src/core/credentials/transport/tls/grpc_tls_certificate_provider.h +15 -2
  37. data/src/core/credentials/transport/tls/spiffe_utils.cc +371 -0
  38. data/src/core/credentials/transport/tls/spiffe_utils.h +171 -0
  39. data/src/core/credentials/transport/tls/ssl_utils.cc +11 -10
  40. data/src/core/credentials/transport/tls/ssl_utils.h +4 -2
  41. data/src/core/credentials/transport/tls/tls_credentials.cc +2 -0
  42. data/src/core/credentials/transport/tls/tls_security_connector.cc +11 -26
  43. data/src/core/credentials/transport/tls/tls_security_connector.h +12 -12
  44. data/src/core/ext/filters/backend_metrics/backend_metric_filter.cc +1 -2
  45. data/src/core/ext/filters/http/client/http_client_filter.cc +3 -6
  46. data/src/core/ext/filters/http/client_authority_filter.cc +1 -2
  47. data/src/core/ext/filters/http/message_compress/compression_filter.cc +8 -8
  48. data/src/core/ext/filters/http/server/http_server_filter.cc +3 -6
  49. data/src/core/ext/filters/message_size/message_size_filter.cc +4 -4
  50. data/src/core/ext/filters/rbac/rbac_filter.cc +1 -1
  51. data/src/core/ext/filters/stateful_session/stateful_session_filter.cc +3 -5
  52. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +3 -2
  53. data/src/core/ext/transport/chttp2/transport/flow_control.cc +1 -0
  54. data/src/core/ext/transport/chttp2/transport/flow_control.h +1 -0
  55. data/src/core/ext/transport/chttp2/transport/frame.cc +89 -6
  56. data/src/core/ext/transport/chttp2/transport/frame.h +38 -0
  57. data/src/core/ext/transport/chttp2/transport/header_assembler.h +5 -14
  58. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +4 -1
  59. data/src/core/ext/transport/chttp2/transport/http2_client_transport.cc +294 -78
  60. data/src/core/ext/transport/chttp2/transport/http2_client_transport.h +128 -9
  61. data/src/core/ext/transport/chttp2/transport/http2_settings.cc +11 -38
  62. data/src/core/ext/transport/chttp2/transport/http2_settings.h +52 -35
  63. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.cc +61 -0
  64. data/src/core/ext/transport/chttp2/transport/http2_settings_manager.h +142 -0
  65. data/src/core/ext/transport/chttp2/transport/http2_transport.cc +81 -3
  66. data/src/core/ext/transport/chttp2/transport/http2_transport.h +12 -1
  67. data/src/core/ext/transport/chttp2/transport/message_assembler.h +2 -2
  68. data/src/core/ext/transport/chttp2/transport/parsing.cc +2 -1
  69. data/src/core/ext/transport/chttp2/transport/ping_promise.cc +2 -1
  70. data/src/core/ext/transport/chttp2/transport/ping_promise.h +22 -5
  71. data/src/core/ext/transport/chttp2/transport/stream_data_queue.h +607 -0
  72. data/src/core/ext/transport/chttp2/transport/writable_streams.h +254 -0
  73. data/src/core/ext/transport/chttp2/transport/writing.cc +6 -4
  74. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb.h +4959 -0
  75. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.c +1111 -0
  76. data/src/core/ext/upb-gen/src/proto/grpc/channelz/channelz.upb_minitable.h +108 -0
  77. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb.h +142 -54
  78. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.c +18 -14
  79. data/src/core/ext/upb-gen/src/proto/grpc/channelz/v2/property_list.upb_minitable.h +2 -2
  80. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.c +716 -0
  81. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/channelz.upbdefs.h +227 -0
  82. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.c +86 -88
  83. data/src/core/ext/upbdefs-gen/src/proto/grpc/channelz/v2/property_list.upbdefs.h +2 -2
  84. data/src/core/filter/auth/auth_filters.h +2 -2
  85. data/src/core/filter/fused_filters.cc +154 -0
  86. data/src/core/handshaker/security/legacy_secure_endpoint.cc +1 -1
  87. data/src/core/handshaker/security/pipelined_secure_endpoint.cc +965 -0
  88. data/src/core/handshaker/security/secure_endpoint.cc +28 -13
  89. data/src/core/handshaker/security/secure_endpoint.h +8 -0
  90. data/src/core/lib/channel/promise_based_filter.cc +15 -25
  91. data/src/core/lib/channel/promise_based_filter.h +6 -5
  92. data/src/core/lib/event_engine/ares_resolver.h +3 -1
  93. data/src/core/lib/event_engine/cf_engine/cf_engine.cc +9 -5
  94. data/src/core/lib/event_engine/cf_engine/cf_engine.h +2 -1
  95. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.cc +263 -0
  96. data/src/core/lib/event_engine/cf_engine/cfsocket_listener.h +107 -0
  97. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.cc +31 -3
  98. data/src/core/lib/event_engine/cf_engine/cfstream_endpoint.h +12 -0
  99. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.cc +12 -10
  100. data/src/core/lib/event_engine/posix_engine/ev_epoll1_linux.h +6 -4
  101. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.cc +15 -14
  102. data/src/core/lib/event_engine/posix_engine/ev_poll_posix.h +7 -5
  103. data/src/core/lib/event_engine/posix_engine/event_poller.h +0 -8
  104. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.cc +11 -5
  105. data/src/core/lib/event_engine/posix_engine/event_poller_posix_default.h +3 -2
  106. data/src/core/lib/event_engine/posix_engine/grpc_polled_fd_posix.h +1 -0
  107. data/src/core/lib/event_engine/posix_engine/lockfree_event.cc +4 -4
  108. data/src/core/lib/event_engine/posix_engine/lockfree_event.h +3 -4
  109. data/src/core/lib/event_engine/posix_engine/posix_endpoint.cc +2 -2
  110. data/src/core/lib/event_engine/posix_engine/posix_engine.cc +188 -199
  111. data/src/core/lib/event_engine/posix_engine/posix_engine.h +30 -45
  112. data/src/core/lib/event_engine/posix_engine/posix_engine_listener.cc +1 -1
  113. data/src/core/lib/event_engine/posix_engine/tcp_socket_utils.h +1 -1
  114. data/src/core/lib/event_engine/windows/grpc_polled_fd_windows.cc +2 -1
  115. data/src/core/lib/experiments/experiments.cc +120 -6
  116. data/src/core/lib/experiments/experiments.h +46 -3
  117. data/src/core/lib/iomgr/combiner.cc +1 -1
  118. data/src/core/lib/iomgr/exec_ctx.h +3 -9
  119. data/src/core/lib/iomgr/socket_mutator.cc +1 -1
  120. data/src/core/lib/iomgr/socket_utils_posix.cc +1 -1
  121. data/src/core/lib/iomgr/socket_utils_posix.h +1 -1
  122. data/src/core/lib/iomgr/tcp_client_posix.cc +1 -1
  123. data/src/core/lib/iomgr/tcp_posix.cc +3 -3
  124. data/src/core/lib/promise/activity.h +2 -2
  125. data/src/core/lib/promise/mpsc.cc +8 -8
  126. data/src/core/lib/promise/party.cc +7 -7
  127. data/src/core/lib/promise/party.h +4 -4
  128. data/src/core/lib/promise/poll.h +10 -0
  129. data/src/core/lib/resource_quota/memory_quota.cc +90 -3
  130. data/src/core/lib/resource_quota/memory_quota.h +20 -9
  131. data/src/core/lib/resource_quota/periodic_update.cc +14 -0
  132. data/src/core/lib/resource_quota/periodic_update.h +8 -0
  133. data/src/core/lib/resource_quota/resource_quota.cc +15 -4
  134. data/src/core/lib/resource_quota/resource_quota.h +3 -0
  135. data/src/core/lib/security/authorization/grpc_server_authz_filter.cc +1 -2
  136. data/src/core/lib/surface/call.cc +5 -5
  137. data/src/core/lib/surface/call.h +6 -5
  138. data/src/core/lib/surface/completion_queue.cc +2 -4
  139. data/src/core/lib/surface/filter_stack_call.cc +1 -1
  140. data/src/core/lib/surface/version.cc +2 -2
  141. data/src/core/lib/transport/promise_endpoint.cc +2 -2
  142. data/src/core/lib/transport/promise_endpoint.h +3 -3
  143. data/src/core/load_balancing/endpoint_list.cc +29 -2
  144. data/src/core/load_balancing/grpclb/client_load_reporting_filter.cc +3 -3
  145. data/src/core/load_balancing/grpclb/client_load_reporting_filter.h +1 -1
  146. data/src/core/load_balancing/pick_first/pick_first.cc +12 -5
  147. data/src/core/load_balancing/xds/xds_cluster_impl.cc +5 -3
  148. data/src/core/net/socket_mutator.cc +19 -0
  149. data/src/core/net/socket_mutator.h +25 -0
  150. data/src/core/plugin_registry/grpc_plugin_registry.cc +6 -0
  151. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver.h +6 -1
  152. data/src/core/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +2 -1
  153. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.cc +8 -5
  154. data/src/core/resolver/dns/c_ares/grpc_ares_wrapper.h +2 -1
  155. data/src/core/resolver/xds/xds_dependency_manager.cc +1 -1
  156. data/src/core/server/server.cc +1 -1
  157. data/src/core/server/server_call_tracer_filter.cc +0 -66
  158. data/src/core/server/server_call_tracer_filter.h +64 -0
  159. data/src/core/server/server_config_selector_filter.cc +1 -1
  160. data/src/core/service_config/service_config_channel_arg_filter.cc +3 -60
  161. data/src/core/service_config/service_config_channel_arg_filter.h +82 -0
  162. data/src/core/telemetry/call_tracer.cc +20 -14
  163. data/src/core/telemetry/call_tracer.h +22 -17
  164. data/src/core/telemetry/metrics.h +8 -8
  165. data/src/core/telemetry/stats_data.cc +151 -151
  166. data/src/core/telemetry/stats_data.h +87 -87
  167. data/src/core/transport/auth_context.cc +20 -0
  168. data/src/core/transport/auth_context.h +4 -0
  169. data/src/core/transport/auth_context_comparator_registry.h +69 -0
  170. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +2 -3
  171. data/src/core/tsi/ssl_transport_security.cc +202 -32
  172. data/src/core/tsi/ssl_transport_security.h +19 -10
  173. data/src/core/tsi/ssl_transport_security_utils.cc +21 -0
  174. data/src/core/tsi/ssl_transport_security_utils.h +4 -0
  175. data/src/core/util/http_client/httpcli_security_connector.cc +3 -1
  176. data/src/core/util/latent_see.cc +178 -146
  177. data/src/core/util/latent_see.h +245 -188
  178. data/src/core/util/single_set_ptr.h +5 -2
  179. data/src/core/util/useful.h +91 -0
  180. data/src/core/util/windows/directory_reader.cc +1 -0
  181. data/src/core/util/windows/thd.cc +1 -3
  182. data/src/core/util/work_serializer.cc +1 -1
  183. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.cc +32 -5
  184. data/src/core/xds/grpc/file_watcher_certificate_provider_factory.h +5 -0
  185. data/src/core/xds/grpc/xds_certificate_provider.cc +5 -6
  186. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +1 -1
  187. data/src/ruby/lib/grpc/version.rb +1 -1
  188. data/third_party/cares/cares/include/ares.h +925 -460
  189. data/third_party/cares/cares/include/ares_dns.h +86 -71
  190. data/third_party/cares/cares/include/ares_dns_record.h +1118 -0
  191. data/third_party/cares/cares/include/ares_nameser.h +215 -189
  192. data/third_party/cares/cares/include/ares_version.h +37 -14
  193. data/third_party/cares/cares/src/lib/ares_addrinfo2hostent.c +305 -0
  194. data/third_party/cares/cares/src/lib/ares_addrinfo_localhost.c +245 -0
  195. data/third_party/cares/cares/src/lib/ares_android.c +216 -164
  196. data/third_party/cares/cares/src/lib/ares_android.h +25 -14
  197. data/third_party/cares/cares/src/lib/ares_cancel.c +68 -44
  198. data/third_party/cares/cares/src/lib/ares_close_sockets.c +137 -0
  199. data/third_party/cares/cares/src/lib/ares_conn.c +511 -0
  200. data/third_party/cares/cares/src/lib/ares_conn.h +196 -0
  201. data/third_party/cares/cares/src/lib/ares_cookie.c +461 -0
  202. data/third_party/cares/cares/src/lib/ares_data.c +93 -181
  203. data/third_party/cares/cares/src/lib/ares_data.h +50 -39
  204. data/third_party/cares/cares/src/lib/ares_destroy.c +127 -89
  205. data/third_party/cares/cares/src/lib/ares_free_hostent.c +35 -24
  206. data/third_party/cares/cares/src/lib/ares_free_string.c +24 -16
  207. data/third_party/cares/cares/src/lib/ares_freeaddrinfo.c +45 -38
  208. data/third_party/cares/cares/src/lib/ares_getaddrinfo.c +549 -663
  209. data/third_party/cares/cares/src/lib/ares_getenv.c +25 -15
  210. data/third_party/cares/cares/src/lib/ares_getenv.h +26 -18
  211. data/third_party/cares/cares/src/lib/ares_gethostbyaddr.c +163 -221
  212. data/third_party/cares/cares/src/lib/ares_gethostbyname.c +222 -223
  213. data/third_party/cares/cares/src/lib/ares_getnameinfo.c +328 -338
  214. data/third_party/cares/cares/src/lib/ares_hosts_file.c +952 -0
  215. data/third_party/cares/cares/src/lib/ares_inet_net_pton.h +25 -19
  216. data/third_party/cares/cares/src/lib/ares_init.c +425 -2091
  217. data/third_party/cares/cares/src/lib/ares_ipv6.h +63 -33
  218. data/third_party/cares/cares/src/lib/ares_library_init.c +110 -54
  219. data/third_party/cares/cares/src/lib/ares_metrics.c +261 -0
  220. data/third_party/cares/cares/src/lib/ares_options.c +418 -332
  221. data/third_party/cares/cares/src/lib/ares_parse_into_addrinfo.c +179 -0
  222. data/third_party/cares/cares/src/lib/ares_private.h +558 -356
  223. data/third_party/cares/cares/src/lib/ares_process.c +1224 -1369
  224. data/third_party/cares/cares/src/lib/ares_qcache.c +430 -0
  225. data/third_party/cares/cares/src/lib/ares_query.c +126 -121
  226. data/third_party/cares/cares/src/lib/ares_search.c +564 -262
  227. data/third_party/cares/cares/src/lib/ares_send.c +264 -93
  228. data/third_party/cares/cares/src/lib/ares_set_socket_functions.c +588 -0
  229. data/third_party/cares/cares/src/lib/ares_setup.h +115 -111
  230. data/third_party/cares/cares/src/lib/ares_socket.c +425 -0
  231. data/third_party/cares/cares/src/lib/ares_socket.h +163 -0
  232. data/third_party/cares/cares/src/lib/ares_sortaddrinfo.c +447 -0
  233. data/third_party/cares/cares/src/lib/ares_strerror.c +83 -48
  234. data/third_party/cares/cares/src/lib/ares_sysconfig.c +639 -0
  235. data/third_party/cares/cares/src/lib/ares_sysconfig_files.c +839 -0
  236. data/third_party/cares/cares/src/lib/ares_sysconfig_mac.c +373 -0
  237. data/third_party/cares/cares/src/lib/ares_sysconfig_win.c +621 -0
  238. data/third_party/cares/cares/src/lib/ares_timeout.c +136 -73
  239. data/third_party/cares/cares/src/lib/ares_update_servers.c +1362 -0
  240. data/third_party/cares/cares/src/lib/ares_version.c +29 -4
  241. data/third_party/cares/cares/src/lib/config-dos.h +88 -89
  242. data/third_party/cares/cares/src/lib/config-win32.h +122 -77
  243. data/third_party/cares/cares/src/lib/dsa/ares_array.c +394 -0
  244. data/third_party/cares/cares/src/lib/dsa/ares_htable.c +447 -0
  245. data/third_party/cares/cares/src/lib/dsa/ares_htable.h +174 -0
  246. data/third_party/cares/cares/src/lib/dsa/ares_htable_asvp.c +224 -0
  247. data/third_party/cares/cares/src/lib/dsa/ares_htable_dict.c +228 -0
  248. data/third_party/cares/cares/src/lib/dsa/ares_htable_strvp.c +210 -0
  249. data/third_party/cares/cares/src/lib/dsa/ares_htable_szvp.c +188 -0
  250. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpstr.c +186 -0
  251. data/third_party/cares/cares/src/lib/dsa/ares_htable_vpvp.c +194 -0
  252. data/third_party/cares/cares/src/lib/dsa/ares_llist.c +382 -0
  253. data/third_party/cares/cares/src/lib/dsa/ares_slist.c +479 -0
  254. data/third_party/cares/cares/src/lib/dsa/ares_slist.h +207 -0
  255. data/third_party/cares/cares/src/lib/event/ares_event.h +191 -0
  256. data/third_party/cares/cares/src/lib/event/ares_event_configchg.c +743 -0
  257. data/third_party/cares/cares/src/lib/event/ares_event_epoll.c +192 -0
  258. data/third_party/cares/cares/src/lib/event/ares_event_kqueue.c +248 -0
  259. data/third_party/cares/cares/src/lib/event/ares_event_poll.c +140 -0
  260. data/third_party/cares/cares/src/lib/event/ares_event_select.c +159 -0
  261. data/third_party/cares/cares/src/lib/event/ares_event_thread.c +567 -0
  262. data/third_party/cares/cares/src/lib/event/ares_event_wake_pipe.c +166 -0
  263. data/third_party/cares/cares/src/lib/event/ares_event_win32.c +978 -0
  264. data/third_party/cares/cares/src/lib/event/ares_event_win32.h +161 -0
  265. data/third_party/cares/cares/src/lib/include/ares_array.h +276 -0
  266. data/third_party/cares/cares/src/lib/include/ares_buf.h +732 -0
  267. data/third_party/cares/cares/src/lib/include/ares_htable_asvp.h +130 -0
  268. data/third_party/cares/cares/src/lib/include/ares_htable_dict.h +123 -0
  269. data/third_party/cares/cares/src/lib/include/ares_htable_strvp.h +130 -0
  270. data/third_party/cares/cares/src/lib/include/ares_htable_szvp.h +118 -0
  271. data/third_party/cares/cares/src/lib/include/ares_htable_vpstr.h +111 -0
  272. data/third_party/cares/cares/src/lib/include/ares_htable_vpvp.h +128 -0
  273. data/third_party/cares/cares/src/lib/include/ares_llist.h +239 -0
  274. data/third_party/cares/cares/src/lib/include/ares_mem.h +38 -0
  275. data/third_party/cares/cares/src/lib/include/ares_str.h +244 -0
  276. data/third_party/cares/cares/src/lib/inet_net_pton.c +202 -157
  277. data/third_party/cares/cares/src/lib/inet_ntop.c +87 -69
  278. data/third_party/cares/cares/src/lib/legacy/ares_create_query.c +78 -0
  279. data/third_party/cares/cares/src/lib/legacy/ares_expand_name.c +99 -0
  280. data/third_party/cares/cares/src/lib/legacy/ares_expand_string.c +107 -0
  281. data/third_party/cares/cares/src/lib/legacy/ares_fds.c +80 -0
  282. data/third_party/cares/cares/src/lib/legacy/ares_getsock.c +85 -0
  283. data/third_party/cares/cares/src/lib/legacy/ares_parse_a_reply.c +107 -0
  284. data/third_party/cares/cares/src/lib/legacy/ares_parse_aaaa_reply.c +109 -0
  285. data/third_party/cares/cares/src/lib/legacy/ares_parse_caa_reply.c +137 -0
  286. data/third_party/cares/cares/src/lib/legacy/ares_parse_mx_reply.c +110 -0
  287. data/third_party/cares/cares/src/lib/legacy/ares_parse_naptr_reply.c +132 -0
  288. data/third_party/cares/cares/src/lib/legacy/ares_parse_ns_reply.c +154 -0
  289. data/third_party/cares/cares/src/lib/legacy/ares_parse_ptr_reply.c +213 -0
  290. data/third_party/cares/cares/src/lib/legacy/ares_parse_soa_reply.c +115 -0
  291. data/third_party/cares/cares/src/lib/legacy/ares_parse_srv_reply.c +114 -0
  292. data/third_party/cares/cares/src/lib/legacy/ares_parse_txt_reply.c +144 -0
  293. data/third_party/cares/cares/src/lib/legacy/ares_parse_uri_reply.c +113 -0
  294. data/third_party/cares/cares/src/lib/record/ares_dns_mapping.c +982 -0
  295. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.c +307 -0
  296. data/third_party/cares/cares/src/lib/record/ares_dns_multistring.h +72 -0
  297. data/third_party/cares/cares/src/lib/record/ares_dns_name.c +673 -0
  298. data/third_party/cares/cares/src/lib/record/ares_dns_parse.c +1329 -0
  299. data/third_party/cares/cares/src/lib/record/ares_dns_private.h +273 -0
  300. data/third_party/cares/cares/src/lib/record/ares_dns_record.c +1661 -0
  301. data/third_party/cares/cares/src/lib/record/ares_dns_write.c +1229 -0
  302. data/third_party/cares/cares/src/lib/str/ares_buf.c +1498 -0
  303. data/third_party/cares/cares/src/lib/str/ares_str.c +508 -0
  304. data/third_party/cares/cares/src/lib/str/ares_strsplit.c +90 -0
  305. data/third_party/cares/cares/src/lib/str/ares_strsplit.h +51 -0
  306. data/third_party/cares/cares/src/lib/thirdparty/apple/dnsinfo.h +122 -0
  307. data/third_party/cares/cares/src/lib/util/ares_iface_ips.c +628 -0
  308. data/third_party/cares/cares/src/lib/util/ares_iface_ips.h +139 -0
  309. data/third_party/cares/cares/src/lib/util/ares_math.c +158 -0
  310. data/third_party/cares/cares/src/lib/util/ares_math.h +45 -0
  311. data/third_party/cares/cares/src/lib/util/ares_rand.c +389 -0
  312. data/third_party/cares/cares/src/lib/util/ares_rand.h +36 -0
  313. data/third_party/cares/cares/src/lib/util/ares_threads.c +614 -0
  314. data/third_party/cares/cares/src/lib/util/ares_threads.h +60 -0
  315. data/third_party/cares/cares/src/lib/util/ares_time.h +48 -0
  316. data/third_party/cares/cares/src/lib/util/ares_timeval.c +95 -0
  317. data/third_party/cares/cares/src/lib/util/ares_uri.c +1626 -0
  318. data/third_party/cares/cares/src/lib/util/ares_uri.h +252 -0
  319. data/third_party/cares/cares/src/lib/windows_port.c +16 -9
  320. metadata +121 -49
  321. data/src/core/util/ring_buffer.h +0 -122
  322. data/third_party/cares/cares/include/ares_rules.h +0 -125
  323. data/third_party/cares/cares/src/lib/ares__addrinfo2hostent.c +0 -266
  324. data/third_party/cares/cares/src/lib/ares__addrinfo_localhost.c +0 -240
  325. data/third_party/cares/cares/src/lib/ares__close_sockets.c +0 -61
  326. data/third_party/cares/cares/src/lib/ares__get_hostent.c +0 -260
  327. data/third_party/cares/cares/src/lib/ares__parse_into_addrinfo.c +0 -229
  328. data/third_party/cares/cares/src/lib/ares__read_line.c +0 -73
  329. data/third_party/cares/cares/src/lib/ares__readaddrinfo.c +0 -258
  330. data/third_party/cares/cares/src/lib/ares__sortaddrinfo.c +0 -507
  331. data/third_party/cares/cares/src/lib/ares__timeval.c +0 -111
  332. data/third_party/cares/cares/src/lib/ares_create_query.c +0 -197
  333. data/third_party/cares/cares/src/lib/ares_expand_name.c +0 -311
  334. data/third_party/cares/cares/src/lib/ares_expand_string.c +0 -67
  335. data/third_party/cares/cares/src/lib/ares_fds.c +0 -59
  336. data/third_party/cares/cares/src/lib/ares_getsock.c +0 -66
  337. data/third_party/cares/cares/src/lib/ares_iphlpapi.h +0 -221
  338. data/third_party/cares/cares/src/lib/ares_llist.c +0 -63
  339. data/third_party/cares/cares/src/lib/ares_llist.h +0 -39
  340. data/third_party/cares/cares/src/lib/ares_mkquery.c +0 -24
  341. data/third_party/cares/cares/src/lib/ares_nowarn.c +0 -260
  342. data/third_party/cares/cares/src/lib/ares_nowarn.h +0 -61
  343. data/third_party/cares/cares/src/lib/ares_parse_a_reply.c +0 -90
  344. data/third_party/cares/cares/src/lib/ares_parse_aaaa_reply.c +0 -92
  345. data/third_party/cares/cares/src/lib/ares_parse_caa_reply.c +0 -199
  346. data/third_party/cares/cares/src/lib/ares_parse_mx_reply.c +0 -164
  347. data/third_party/cares/cares/src/lib/ares_parse_naptr_reply.c +0 -183
  348. data/third_party/cares/cares/src/lib/ares_parse_ns_reply.c +0 -177
  349. data/third_party/cares/cares/src/lib/ares_parse_ptr_reply.c +0 -228
  350. data/third_party/cares/cares/src/lib/ares_parse_soa_reply.c +0 -179
  351. data/third_party/cares/cares/src/lib/ares_parse_srv_reply.c +0 -168
  352. data/third_party/cares/cares/src/lib/ares_parse_txt_reply.c +0 -214
  353. data/third_party/cares/cares/src/lib/ares_parse_uri_reply.c +0 -184
  354. data/third_party/cares/cares/src/lib/ares_platform.c +0 -11042
  355. data/third_party/cares/cares/src/lib/ares_platform.h +0 -43
  356. data/third_party/cares/cares/src/lib/ares_rand.c +0 -279
  357. data/third_party/cares/cares/src/lib/ares_strcasecmp.c +0 -66
  358. data/third_party/cares/cares/src/lib/ares_strcasecmp.h +0 -30
  359. data/third_party/cares/cares/src/lib/ares_strdup.c +0 -42
  360. data/third_party/cares/cares/src/lib/ares_strdup.h +0 -24
  361. data/third_party/cares/cares/src/lib/ares_strsplit.c +0 -94
  362. data/third_party/cares/cares/src/lib/ares_strsplit.h +0 -42
  363. data/third_party/cares/cares/src/lib/ares_writev.c +0 -79
  364. data/third_party/cares/cares/src/lib/ares_writev.h +0 -36
  365. data/third_party/cares/cares/src/lib/bitncmp.c +0 -59
  366. data/third_party/cares/cares/src/lib/bitncmp.h +0 -26
  367. data/third_party/cares/cares/src/lib/setup_once.h +0 -554
  368. 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