36 #include <sys/types.h>
44 #include "absl/container/inlined_vector.h"
45 #include "absl/memory/memory.h"
46 #include "absl/status/status.h"
47 #include "absl/status/statusor.h"
48 #include "absl/strings/str_cat.h"
49 #include "absl/strings/str_format.h"
76 "cares_address_sorting");
80 typedef struct fd_node {
82 fd_node() : ev_driver(nullptr) {}
125 std::unique_ptr<grpc_core::GrpcPolledFdFactory> polled_fd_factory
142 typedef struct grpc_ares_hostbyname_request {
155 } grpc_ares_hostbyname_request;
166 class GrpcAresQuery {
170 grpc_ares_request_ref_locked(r_);
173 ~GrpcAresQuery() { grpc_ares_request_unref_locked(r_); }
207 grpc_ares_complete_request_locked(ev_driver->request);
212 static void fd_node_destroy_locked(fd_node* fdn)
215 fdn->grpc_polled_fd->GetName());
219 delete fdn->grpc_polled_fd;
223 static void fd_node_shutdown_locked(fd_node* fdn,
const char* reason)
225 if (!fdn->already_shutdown) {
226 fdn->already_shutdown =
true;
227 fdn->grpc_polled_fd->ShutdownLocked(
232 void grpc_ares_ev_driver_on_queries_complete_locked(
238 ev_driver->shutting_down =
true;
241 grpc_ares_ev_driver_unref(ev_driver);
246 ev_driver->shutting_down =
true;
247 fd_node*
fn = ev_driver->fds;
248 while (
fn !=
nullptr) {
249 fd_node_shutdown_locked(
fn,
"grpc_ares_ev_driver_shutdown");
256 static fd_node* pop_fd_node_locked(fd_node** head,
ares_socket_t as)
259 phony_head.next = *head;
260 fd_node* node = &phony_head;
261 while (node->next !=
nullptr) {
262 if (node->next->grpc_polled_fd->GetWrappedAresSocketLocked() == as) {
263 fd_node*
ret = node->next;
264 node->next = node->next->next;
265 *head = phony_head.next;
283 "request:%p ev_driver=%p. next ares process poll time in "
285 driver->request, driver, until_next_ares_backup_poll_alarm.
millis());
293 "request:%p ev_driver=%p on_timeout_locked. driver->shutting_down=%d. "
295 driver->request, driver, driver->shutting_down,
298 grpc_ares_ev_driver_shutdown_locked(driver);
300 grpc_ares_ev_driver_unref(driver);
318 "request:%p ev_driver=%p on_ares_backup_poll_alarm_locked. "
319 "driver->shutting_down=%d. "
321 driver->request, driver, driver->shutting_down,
324 fd_node* fdn = driver->fds;
325 while (fdn !=
nullptr) {
326 if (!fdn->already_shutdown) {
328 "request:%p ev_driver=%p on_ares_backup_poll_alarm_locked; "
329 "ares_process_fd. fd=%s",
330 driver->request, driver, fdn->grpc_polled_fd->GetName());
331 ares_socket_t as = fdn->grpc_polled_fd->GetWrappedAresSocketLocked();
336 if (!driver->shutting_down) {
342 calculate_next_ares_backup_poll_alarm(driver);
343 grpc_ares_ev_driver_ref(driver);
345 on_ares_backup_poll_alarm, driver,
346 grpc_schedule_on_exec_ctx);
348 next_ares_backup_poll_alarm,
349 &driver->on_ares_backup_poll_alarm_locked);
351 grpc_ares_notify_on_event_locked(driver);
353 grpc_ares_ev_driver_unref(driver);
357 fd_node* fdn =
static_cast<fd_node*
>(
arg);
361 const ares_socket_t as = fdn->grpc_polled_fd->GetWrappedAresSocketLocked();
362 fdn->readable_registered =
false;
364 fdn->grpc_polled_fd->GetName());
368 }
while (fdn->grpc_polled_fd->IsFdStillReadableLocked());
378 grpc_ares_notify_on_event_locked(ev_driver);
379 grpc_ares_ev_driver_unref(ev_driver);
383 fd_node* fdn =
static_cast<fd_node*
>(
arg);
387 const ares_socket_t as = fdn->grpc_polled_fd->GetWrappedAresSocketLocked();
388 fdn->writable_registered =
false;
390 fdn->grpc_polled_fd->GetName());
402 grpc_ares_notify_on_event_locked(ev_driver);
403 grpc_ares_ev_driver_unref(ev_driver);
410 fd_node* new_list =
nullptr;
411 if (!ev_driver->shutting_down) {
418 fd_node* fdn = pop_fd_node_locked(&ev_driver->fds, socks[
i]);
420 if (fdn ==
nullptr) {
421 fdn =
new fd_node(ev_driver);
422 fdn->grpc_polled_fd =
423 ev_driver->polled_fd_factory->NewGrpcPolledFdLocked(
424 socks[
i], ev_driver->pollset_set);
426 fdn->grpc_polled_fd->GetName());
427 fdn->readable_registered =
false;
428 fdn->writable_registered =
false;
429 fdn->already_shutdown =
false;
431 fdn->next = new_list;
436 !fdn->readable_registered) {
437 grpc_ares_ev_driver_ref(ev_driver);
440 fdn->grpc_polled_fd->GetName());
442 grpc_schedule_on_exec_ctx);
443 fdn->grpc_polled_fd->RegisterForOnReadableLocked(&fdn->read_closure);
444 fdn->readable_registered =
true;
449 !fdn->writable_registered) {
452 fdn->grpc_polled_fd->GetName());
453 grpc_ares_ev_driver_ref(ev_driver);
455 grpc_schedule_on_exec_ctx);
457 grpc_schedule_on_exec_ctx);
458 fdn->grpc_polled_fd->RegisterForOnWriteableLocked(
459 &fdn->write_closure);
460 fdn->writable_registered =
true;
468 while (ev_driver->fds !=
nullptr) {
469 fd_node*
cur = ev_driver->fds;
470 ev_driver->fds = ev_driver->fds->next;
471 fd_node_shutdown_locked(
cur,
"c-ares fd shutdown");
472 if (!
cur->readable_registered && !
cur->writable_registered) {
473 fd_node_destroy_locked(
cur);
475 cur->next = new_list;
479 ev_driver->fds = new_list;
484 grpc_ares_notify_on_event_locked(ev_driver);
487 ev_driver->query_timeout_ms == 0
491 "request:%p ev_driver=%p grpc_ares_ev_driver_start_locked. timeout in "
493 ev_driver->request, ev_driver,
timeout.millis());
494 grpc_ares_ev_driver_ref(ev_driver);
496 grpc_schedule_on_exec_ctx);
499 &ev_driver->on_timeout_locked);
502 calculate_next_ares_backup_poll_alarm(ev_driver);
503 grpc_ares_ev_driver_ref(ev_driver);
505 on_ares_backup_poll_alarm, ev_driver,
506 grpc_schedule_on_exec_ctx);
508 next_ares_backup_poll_alarm,
509 &ev_driver->on_ares_backup_poll_alarm_locked);
512 static void noop_inject_channel_config(
ares_channel ) {}
515 noop_inject_channel_config;
535 (*ev_driver)->pollset_set = pollset_set;
536 (*ev_driver)->fds =
nullptr;
537 (*ev_driver)->shutting_down =
false;
538 (*ev_driver)->polled_fd_factory =
541 ->polled_fd_factory->ConfigureAresChannelLocked((*ev_driver)->channel);
542 (*ev_driver)->query_timeout_ms = query_timeout_ms;
548 const char* input_output_str) {
549 for (
size_t i = 0;
i < addresses.size();
i++) {
552 "(c-ares resolver) request:%p c-ares address sorting: %s[%" PRIuPTR
554 r, input_output_str,
i,
555 addr_str.ok() ? addr_str->c_str()
556 : addr_str.status().ToString().c_str());
563 log_address_sorting_list(
r, *addresses,
"input");
567 for (
size_t i = 0;
i < addresses->size(); ++
i) {
569 memcpy(&sortables[
i].dest_addr.addr, &(*addresses)[
i].address().addr,
570 (*addresses)[
i].address().len);
575 sorted.reserve(addresses->size());
576 for (
size_t i = 0;
i < addresses->size(); ++
i) {
577 sorted.emplace_back(*
static_cast<ServerAddress*
>(sortables[
i].user_data));
582 log_address_sorting_list(
r, *addresses,
"output");
588 r->pending_queries++;
593 r->pending_queries--;
594 if (
r->pending_queries == 0
u) {
595 grpc_ares_ev_driver_on_queries_complete_locked(
r->ev_driver);
603 r->ev_driver =
nullptr;
605 if (addresses !=
nullptr) {
612 if (
r->balancer_addresses_out !=
nullptr) {
614 if (balancer_addresses !=
nullptr) {
623 static grpc_ares_hostbyname_request* create_hostbyname_request_locked(
625 bool is_balancer,
const char* qtype)
628 "request:%p create_hostbyname_request_locked host:%s port:%d "
629 "is_balancer:%d qtype:%s",
630 parent_request, host,
port, is_balancer, qtype);
631 grpc_ares_hostbyname_request* hr =
new grpc_ares_hostbyname_request();
632 hr->parent_request = parent_request;
635 hr->is_balancer = is_balancer;
637 grpc_ares_request_ref_locked(parent_request);
641 static void destroy_hostbyname_request_locked(grpc_ares_hostbyname_request* hr)
643 grpc_ares_request_unref_locked(hr->parent_request);
648 static void on_hostbyname_done_locked(
void*
arg,
int status,
int ,
649 struct hostent* hostent)
653 grpc_ares_hostbyname_request* hr =
654 static_cast<grpc_ares_hostbyname_request*
>(
arg);
658 "request:%p on_hostbyname_done_locked qtype=%s host=%s ARES_SUCCESS",
r,
659 hr->qtype, hr->host);
660 std::unique_ptr<ServerAddressList>* address_list_ptr =
661 hr->is_balancer ?
r->balancer_addresses_out :
r->addresses_out;
662 if (*address_list_ptr ==
nullptr) {
663 *address_list_ptr = absl::make_unique<ServerAddressList>();
666 for (
size_t i = 0; hostent->h_addr_list[
i] !=
nullptr; ++
i) {
668 if (hr->is_balancer) {
673 nullptr, args_to_add.
data(), args_to_add.
size());
674 switch (hostent->h_addrtype) {
680 sizeof(
struct in6_addr));
681 addr.sin6_family =
static_cast<unsigned char>(hostent->h_addrtype);
682 addr.sin6_port = hr->port;
683 addresses.emplace_back(&
addr, addr_len,
args);
684 char output[INET6_ADDRSTRLEN];
687 "request:%p c-ares resolver gets a AF_INET6 result: \n"
688 " addr: %s\n port: %d\n sin6_scope_id: %d\n",
693 size_t addr_len =
sizeof(
struct sockaddr_in);
694 struct sockaddr_in
addr;
697 sizeof(
struct in_addr));
698 addr.sin_family =
static_cast<unsigned char>(hostent->h_addrtype);
699 addr.sin_port = hr->port;
700 addresses.emplace_back(&
addr, addr_len,
args);
701 char output[INET_ADDRSTRLEN];
704 "request:%p c-ares resolver gets a AF_INET result: \n"
705 " addr: %s\n port: %d\n",
713 "C-ares status is not ARES_SUCCESS qtype=%s name=%s is_balancer=%d: %s",
720 destroy_hostbyname_request_locked(hr);
723 static void on_srv_query_done_locked(
void*
arg,
int status,
int ,
728 GrpcAresQuery*
q =
static_cast<GrpcAresQuery*
>(
arg);
732 "request:%p on_srv_query_done_locked name=%s ARES_SUCCESS",
r,
740 srv_it = srv_it->
next) {
742 grpc_ares_hostbyname_request* hr = create_hostbyname_request_locked(
743 r, srv_it->host, htons(srv_it->port),
true ,
746 on_hostbyname_done_locked, hr);
748 grpc_ares_hostbyname_request* hr = create_hostbyname_request_locked(
749 r, srv_it->host, htons(srv_it->port),
true ,
"A");
751 on_hostbyname_done_locked, hr);
752 grpc_ares_notify_on_event_locked(
r->ev_driver);
755 if (reply !=
nullptr) {
760 "C-ares status is not ARES_SUCCESS qtype=SRV name=%s: %s",
q->name(),
770 static const char g_service_config_attribute_prefix[] =
"grpc_config=";
772 static void on_txt_done_locked(
void*
arg,
int status,
int ,
777 GrpcAresQuery*
q =
static_cast<GrpcAresQuery*
>(
arg);
778 std::unique_ptr<GrpcAresQuery> query_deleter(q);
780 const size_t prefix_len =
sizeof(g_service_config_attribute_prefix) - 1;
791 if (
result->record_start &&
792 memcmp(
result->txt, g_service_config_attribute_prefix, prefix_len) ==
799 size_t service_config_len =
result->length - prefix_len;
800 *
r->service_config_json_out =
801 static_cast<char*
>(
gpr_malloc(service_config_len + 1));
802 memcpy(*
r->service_config_json_out,
result->txt + prefix_len,
806 *
r->service_config_json_out =
static_cast<char*
>(
808 service_config_len +
result->length + 1));
809 memcpy(*
r->service_config_json_out + service_config_len,
result->txt,
811 service_config_len +=
result->length;
813 (*
r->service_config_json_out)[service_config_len] =
'\0';
815 *
r->service_config_json_out);
822 absl::StrFormat(
"C-ares status is not ARES_SUCCESS qtype=TXT name=%s: %s",
830 void grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
835 grpc_ares_hostbyname_request* hr =
nullptr;
845 }
else if (
port.empty()) {
846 if (default_port ==
nullptr || strlen(default_port) == 0) {
854 error = grpc_ares_ev_driver_create_locked(&
r->ev_driver, interested_parties,
855 query_timeout_ms,
r);
862 r->dns_server_addr.family = AF_INET;
863 struct sockaddr_in*
in =
reinterpret_cast<struct sockaddr_in*
>(
addr.addr);
864 memcpy(&
r->dns_server_addr.addr.addr4, &
in->sin_addr,
865 sizeof(
struct in_addr));
874 sizeof(
struct in6_addr));
891 r->pending_queries = 1;
893 hr = create_hostbyname_request_locked(
r, host.c_str(),
897 on_hostbyname_done_locked, hr);
899 hr = create_hostbyname_request_locked(
r, host.c_str(),
903 on_hostbyname_done_locked, hr);
904 if (
r->balancer_addresses_out !=
nullptr) {
907 GrpcAresQuery* srv_query =
new GrpcAresQuery(
r, service_name);
909 on_srv_query_done_locked, srv_query);
911 if (
r->service_config_json_out !=
nullptr) {
913 GrpcAresQuery* txt_query =
new GrpcAresQuery(
r, config_name);
915 on_txt_done_locked, txt_query);
917 grpc_ares_ev_driver_start_locked(
r->ev_driver);
918 grpc_ares_request_unref_locked(
r);
925 static bool inner_resolve_as_ip_literal_locked(
926 const char*
name,
const char* default_port,
927 std::unique_ptr<grpc_core::ServerAddressList>* addrs,
std::string* host,
931 "Failed to parse %s to host:port while attempting to resolve as ip "
937 if (default_port ==
nullptr || strlen(default_port) == 0) {
939 "No port or default port for %s while attempting to resolve as "
944 *
port = default_port;
953 *addrs = absl::make_unique<ServerAddressList>();
954 (*addrs)->emplace_back(
addr.addr,
addr.len,
nullptr );
960 static bool resolve_as_ip_literal_locked(
961 const char*
name,
const char* default_port,
962 std::unique_ptr<grpc_core::ServerAddressList>* addrs) {
966 bool out = inner_resolve_as_ip_literal_locked(
name, default_port, addrs,
967 &host, &
port, &hostport);
971 static bool target_matches_localhost_inner(
const char*
name,
std::string* host,
977 return gpr_stricmp(host->c_str(),
"localhost") == 0;
980 static bool target_matches_localhost(
const char*
name) {
983 return target_matches_localhost_inner(
name, &host, &
port);
986 #ifdef GRPC_ARES_RESOLVE_LOCALHOST_MANUALLY
987 static bool inner_maybe_resolve_localhost_manually_locked(
989 std::unique_ptr<grpc_core::ServerAddressList>* addrs,
std::string* host,
994 "Failed to parse %s into host:port during manual localhost "
1000 if (default_port ==
nullptr || strlen(default_port) == 0) {
1002 "No port or default port for %s during manual localhost "
1003 "resolution check.",
1007 *
port = default_port;
1009 if (
gpr_stricmp(host->c_str(),
"localhost") == 0) {
1011 *addrs = absl::make_unique<grpc_core::ServerAddressList>();
1015 memset(&ipv6_loopback_addr, 0,
sizeof(ipv6_loopback_addr));
1016 ((
char*)&ipv6_loopback_addr.sin6_addr)[15] = 1;
1017 ipv6_loopback_addr.sin6_family =
AF_INET6;
1018 ipv6_loopback_addr.sin6_port = numeric_port;
1019 (*addrs)->emplace_back(&ipv6_loopback_addr,
sizeof(ipv6_loopback_addr),
1022 struct sockaddr_in ipv4_loopback_addr;
1023 memset(&ipv4_loopback_addr, 0,
sizeof(ipv4_loopback_addr));
1024 ((
char*)&ipv4_loopback_addr.sin_addr)[0] = 0x7f;
1025 ((
char*)&ipv4_loopback_addr.sin_addr)[3] = 0x01;
1026 ipv4_loopback_addr.sin_family = AF_INET;
1027 ipv4_loopback_addr.sin_port = numeric_port;
1028 (*addrs)->emplace_back(&ipv4_loopback_addr,
sizeof(ipv4_loopback_addr),
1037 static bool grpc_ares_maybe_resolve_localhost_manually_locked(
1039 std::unique_ptr<grpc_core::ServerAddressList>* addrs) {
1042 return inner_maybe_resolve_localhost_manually_locked(
r,
name, default_port,
1043 addrs, &host, &
port);
1046 static bool grpc_ares_maybe_resolve_localhost_manually_locked(
1049 std::unique_ptr<grpc_core::ServerAddressList>* ) {
1055 const char*
dns_server,
const char*
name,
const char* default_port,
1057 std::unique_ptr<grpc_core::ServerAddressList>* addrs,
1058 std::unique_ptr<grpc_core::ServerAddressList>* balancer_addrs,
1059 char** service_config_json,
int query_timeout_ms) {
1062 r->ev_driver =
nullptr;
1063 r->on_done = on_done;
1064 r->addresses_out = addrs;
1065 r->balancer_addresses_out = balancer_addrs;
1066 r->service_config_json_out = service_config_json;
1068 "request:%p c-ares grpc_dns_lookup_ares_impl name=%s, "
1070 r,
name, default_port);
1072 if (resolve_as_ip_literal_locked(
name, default_port, addrs)) {
1073 grpc_ares_complete_request_locked(
r);
1077 if (grpc_ares_maybe_resolve_localhost_manually_locked(
r,
name, default_port,
1079 grpc_ares_complete_request_locked(
r);
1085 if (target_matches_localhost(
name)) {
1086 r->balancer_addresses_out =
nullptr;
1087 r->service_config_json_out =
nullptr;
1090 grpc_dns_lookup_ares_continue_after_check_localhost_and_ip_literals_locked(
1091 r,
dns_server,
name, default_port, interested_parties, query_timeout_ms);
1096 const char*
dns_server,
const char*
name,
const char* default_port,
1098 std::unique_ptr<grpc_core::ServerAddressList>* addrs,
1099 std::unique_ptr<grpc_core::ServerAddressList>* balancer_addrs,
1100 char** service_config_json,
1101 int query_timeout_ms) = grpc_dns_lookup_ares_impl;
1108 if (
r->ev_driver !=
nullptr) {
1109 grpc_ares_ev_driver_shutdown_locked(
r->ev_driver);
1114 grpc_cancel_ares_request_impl;
1133 #endif // GPR_WINDOWS