]> git.ipfire.org Git - thirdparty/knot-resolver.git/commitdiff
Reuse packet_source address when retrying over TCP. This prevents
authorOndřej Surý <ondrej@sury.org>
Wed, 24 Aug 2016 12:03:29 +0000 (14:03 +0200)
committerOndřej Surý <ondrej@sury.org>
Wed, 24 Aug 2016 12:03:29 +0000 (14:03 +0200)
timeouts over TCP when <n> first nameservers timeout over UDP as
previously the TCP would connect again to the first and only the
first nameserver in task->addrlist.

This would need to be ultimately fixed in TCP Fast Retransmit.

daemon/worker.c

index 90427f6937b5747c53f2ceb249e0bffafd746809..0210ce6f6fec9e78fea397615ab5d58d52a895f0 100644 (file)
@@ -524,7 +524,10 @@ static void on_connect(uv_connect_t *req, int status)
        uv_stream_t *handle = req->handle;
        if (qr_valid_handle(task, (uv_handle_t *)req->handle)) {
                if (status == 0) {
-                       qr_task_send(task, (uv_handle_t *)handle, task->addrlist, task->pktbuf);
+                       struct sockaddr_storage addr;
+                       int addr_len = sizeof(addr);
+                       uv_tcp_getpeername((uv_tcp_t *)handle, (struct sockaddr *)&addr, &addr_len);
+                       qr_task_send(task, (uv_handle_t *)handle, (struct sockaddr *)&addr, task->pktbuf);
                } else {
                        qr_task_step(task, task->addrlist, NULL);
                }
@@ -763,7 +766,7 @@ static int qr_task_step(struct qr_task *task, const struct sockaddr *packet_sour
                        return qr_task_step(task, NULL, NULL);
                }
                conn->data = task;
-               if (uv_tcp_connect(conn, (uv_tcp_t *)client, task->addrlist, on_connect) != 0) {
+               if (uv_tcp_connect(conn, (uv_tcp_t *)client, packet_source?packet_source:task->addrlist, on_connect) != 0) {
                        req_release(task->worker, (struct req *)conn);
                        return qr_task_step(task, NULL, NULL);
                }