resolution->qid.key = query_id;
resolution->step = RSLV_STEP_RUNNING;
resolution->query_type = DNS_RTYPE_ANY;
- resolution->try = 0;
+ 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);
+ resolution->try -= 1;
/* update wakeup date if this resolution is the only one in the FIFO list */
if (dns_check_resolution_queue(resolvers) == 1) {
}
/* update resolution */
- resolution->try += 1;
resolution->nb_responses = 0;
resolution->last_sent_packet = now_ms;
* if current resolution has been tried too many times and finishes in timeout
* we update its status and remove it from the list
*/
- if (resolution->try >= resolvers->resolve_retries) {
+ if (resolution->try <= 0) {
/* clean up resolution information and remove from the list */
dns_reset_resolution(resolution);
resolution->requester_error_cb(resolution, DNS_RESP_TIMEOUT);
}
+ resolution->try -= 1;
+
/* check current resolution status */
if (resolution->step == RSLV_STEP_RUNNING) {
/* resend the DNS query */
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 ((qtype_any || res_preferred_afinet || res_preferred_afinet6)
+ || (resolution->try > 0)) {
/* let's change the query type */
if (qtype_any) {
/* fallback from ANY to resolution preference */
/* fallback from A to AAAA */
resolution->query_type = DNS_RTYPE_AAAA;
}
+ else {
+ resolution->try -= 1;
+ resolution->query_type = DNS_RTYPE_ANY;
+ }
dns_send_query(resolution);