diff --git a/include/types/dns.h b/include/types/dns.h index f8edb734c..ea1a9f901 100644 --- a/include/types/dns.h +++ b/include/types/dns.h @@ -161,7 +161,8 @@ struct dns_resolution { unsigned int last_status_change; /* time of the latest DNS resolution status change */ int query_id; /* DNS query ID dedicated for this resolution */ struct eb32_node qid; /* ebtree query id */ - int query_type; /* query type to send. By default DNS_RTYPE_ANY */ + int query_type; + /* query type to send. By default DNS_RTYPE_A or DNS_RTYPE_AAAA depending on resolver_family_priority */ int status; /* status of the resolution being processed RSLV_STATUS_* */ int step; /* */ int try; /* current resolution try */ diff --git a/src/checks.c b/src/checks.c index ade2428a8..997cf8120 100644 --- a/src/checks.c +++ b/src/checks.c @@ -2214,11 +2214,15 @@ int trigger_resolution(struct server *s) resolution->query_id = query_id; resolution->qid.key = query_id; resolution->step = RSLV_STEP_RUNNING; - resolution->query_type = DNS_RTYPE_ANY; + resolution->resolver_family_priority = s->resolver_family_priority; + if (resolution->resolver_family_priority == AF_INET) { + resolution->query_type = DNS_RTYPE_A; + } else { + resolution->query_type = DNS_RTYPE_AAAA; + } resolution->try = resolvers->resolve_retries; resolution->try_cname = 0; resolution->nb_responses = 0; - resolution->resolver_family_priority = s->resolver_family_priority; eb32_insert(&resolvers->query_ids, &resolution->qid); dns_send_query(resolution); diff --git a/src/dns.c b/src/dns.c index 7f71ac7e9..53b65ab8d 100644 --- a/src/dns.c +++ b/src/dns.c @@ -102,7 +102,11 @@ void dns_reset_resolution(struct dns_resolution *resolution) resolution->qid.key = 0; /* default values */ - resolution->query_type = DNS_RTYPE_ANY; + if (resolution->resolver_family_priority == AF_INET) { + resolution->query_type = DNS_RTYPE_A; + } else { + resolution->query_type = DNS_RTYPE_AAAA; + } /* the second resolution in the queue becomes the first one */ LIST_DEL(&resolution->list); diff --git a/src/server.c b/src/server.c index 8ddff00b7..dcc596105 100644 --- a/src/server.c +++ b/src/server.c @@ -2668,7 +2668,7 @@ int snr_resolution_error_cb(struct dns_resolution *resolution, int error_code) { struct server *s; struct dns_resolvers *resolvers; - int qtype_any, res_preferred_afinet, res_preferred_afinet6; + int res_preferred_afinet, res_preferred_afinet6; /* shortcut to the server whose name is being resolved */ s = (struct server *)resolution->requester; @@ -2692,21 +2692,13 @@ int snr_resolution_error_cb(struct dns_resolution *resolution, int error_code) case DNS_RESP_TRUNCATED: case DNS_RESP_ERROR: case DNS_RESP_NO_EXPECTED_RECORD: - qtype_any = resolution->query_type == DNS_RTYPE_ANY; res_preferred_afinet = resolution->resolver_family_priority == AF_INET && resolution->query_type == DNS_RTYPE_A; res_preferred_afinet6 = resolution->resolver_family_priority == AF_INET6 && resolution->query_type == DNS_RTYPE_AAAA; - if ((qtype_any || res_preferred_afinet || res_preferred_afinet6) + if ((res_preferred_afinet || res_preferred_afinet6) || (resolution->try > 0)) { /* let's change the query type */ - if (qtype_any) { - /* fallback from ANY to resolution preference */ - if (resolution->resolver_family_priority == AF_INET6) - resolution->query_type = DNS_RTYPE_AAAA; - else - resolution->query_type = DNS_RTYPE_A; - } - else if (res_preferred_afinet6) { + if (res_preferred_afinet6) { /* fallback from AAAA to A */ resolution->query_type = DNS_RTYPE_A; } @@ -2716,7 +2708,11 @@ int snr_resolution_error_cb(struct dns_resolution *resolution, int error_code) } else { resolution->try -= 1; - resolution->query_type = DNS_RTYPE_ANY; + if (resolution->resolver_family_priority == AF_INET) { + resolution->query_type = DNS_RTYPE_A; + } else { + resolution->query_type = DNS_RTYPE_AAAA; + } } dns_send_query(resolution);