diff --git a/src/stub.c b/src/stub.c index 2514cf7f..8e045388 100644 --- a/src/stub.c +++ b/src/stub.c @@ -565,7 +565,6 @@ upstream_failed(getdns_upstream *upstream, int during_setup) } else { upstream->conn_shutdowns++; /* [TLS1]TODO: Re-try these queries if possible.*/ - /* getdns_network_req *netreq; while (upstream->netreq_by_query_id.count) { netreq = (getdns_network_req *) @@ -574,7 +573,6 @@ upstream_failed(getdns_upstream *upstream, int during_setup) _getdns_netreq_change_state(netreq, NET_REQ_ERRORED); _getdns_check_dns_req_complete(netreq->owner); } - */ } upstream->conn_state = GETDNS_CONN_TEARDOWN; @@ -781,8 +779,8 @@ stub_tcp_write(int fd, getdns_tcp_state *tcp, getdns_network_req *netreq) &netreq->upstream->netreq_by_query_id, &netreq->node)); netreq->query_id = query_id; - GLDNS_ID_SET(netreq->query, query_id); + if (netreq->opt) { _getdns_network_req_clear_upstream_options(netreq); /* no limits on the max udp payload size with tcp */ @@ -1282,7 +1280,9 @@ stub_tls_write(getdns_upstream *upstream, getdns_tcp_state *tcp, } while (!_getdns_rbtree_insert( &netreq->upstream->netreq_by_query_id, &netreq->node)); + netreq->query_id = query_id; GLDNS_ID_SET(netreq->query, query_id); + /* TODO: Review if more EDNS0 handling can be centralised.*/ if (netreq->opt) { _getdns_network_req_clear_upstream_options(netreq); @@ -1741,7 +1741,8 @@ upstream_write_cb(void *userarg) STUB_DEBUG_DAEMON, upstream->addr_str, (upstream->transport == GETDNS_TRANSPORT_TLS ? "TLS" : "TCP")); #endif - if (fallback_on_write(netreq) == STUB_TCP_ERROR) { + if (q != STUB_TCP_ERROR && + fallback_on_write(netreq) == STUB_TCP_ERROR) { /* TODO: Need new state to report transport unavailable*/ _getdns_netreq_change_state(netreq, NET_REQ_ERRORED); _getdns_check_dns_req_complete(netreq->owner); @@ -1760,7 +1761,7 @@ upstream_write_cb(void *userarg) /* Need this because auth status is reset on connection close */ netreq->debug_tls_auth_status = netreq->upstream->tls_auth_state; upstream->queries_sent++; - netreq->query_id = (uint16_t) q; + /* Unqueue the netreq from the write_queue */ if (!(upstream->write_queue = netreq->write_queue_tail)) { upstream->write_queue_last = NULL; @@ -2090,6 +2091,8 @@ upstream_find_for_netreq(getdns_network_req *netreq) netreq->transport_current = i; netreq->upstream = upstream; netreq->keepalive_sent = 0; + + DEBUG_STUB("%s %-35s: MSG: %p found upstream %p with transport %d, fd: %d\n", STUB_DEBUG_SCHEDULE, __FUNC__, (void*)netreq, (void *)upstream, (int)netreq->transports[i], fd); return fd; } /* Handle better, will give generic error*/