]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
lib/resolve: fixed TCP retransmit
authorMarek Vavruša <marek.vavrusa@nic.cz>
Fri, 17 Jul 2015 14:57:20 +0000 (16:57 +0200)
committerMarek Vavruša <marek.vavrusa@nic.cz>
Fri, 17 Jul 2015 14:57:32 +0000 (16:57 +0200)
lib/resolve.c

index c81afd9f15c4684b10279f13903b0d5c4e5c1829..bc51b17846893629959a47b454d4f1b7e7d10c59 100644 (file)
@@ -400,10 +400,9 @@ int kr_resolve_consume(struct kr_request *request, knot_pkt_t *packet)
        if (!packet || packet->size == 0) {
                /* Network error, retry over TCP. */
                if (!(qry->flags & QUERY_TCP)) {
-                       /** @todo This should just penalize UDP and elect next best. */
                        DEBUG_MSG("=> NS unreachable, retrying over TCP\n");
                        qry->flags |= QUERY_TCP;
-                       return KNOT_STATE_CONSUME; /* Try again */
+                       return KNOT_STATE_PRODUCE;
                }
        } else {
                /* Packet cleared, derandomize QNAME. */
@@ -501,7 +500,7 @@ ns_election:
        assert(++ns_election_iter < KR_ITER_LIMIT);
        if (qry->flags & (QUERY_AWAIT_IPV4|QUERY_AWAIT_IPV6)) {
                kr_nsrep_elect_addr(qry, request->ctx);
-       } else {
+       } else if (!(qry->flags & QUERY_TCP)) { /* Keep address when TCP retransmit. */
                kr_nsrep_elect(qry, request->ctx);
                if (qry->ns.score > KR_NS_MAX_SCORE) {
                        DEBUG_MSG("=> no valid NS left\n");