]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
set timeout to wait for reuse
authorW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Tue, 9 Jun 2020 14:15:03 +0000 (16:15 +0200)
committerW.C.A. Wijngaards <wouter@nlnetlabs.nl>
Tue, 9 Jun 2020 14:15:03 +0000 (16:15 +0200)
add comm_point indicator for write events for reuse stream writes.

services/outside_network.c
services/outside_network.h
util/netevent.h

index f11999d7c863a7eead23c49f02f1b94d0ccfed77..b885c3a1a9373f2f86d572083af5af13e43534b8 100644 (file)
@@ -341,8 +341,8 @@ outnet_tcp_take_query_setup(int s, struct pending_tcp* pend, uint8_t* pkt,
        sldns_buffer_clear(pend->c->buffer);
        sldns_buffer_write(pend->c->buffer, pkt, pkt_len);
        sldns_buffer_flip(pend->c->buffer);
-       pend->c->tcp_is_reading = 0;
-       pend->c->tcp_byte_count = 0;
+       pend->c->tcp_write_and_read = 1;
+       pend->c->tcp_write_byte_count = 0;
        comm_point_start_listening(pend->c, s, -1);
 }
 
@@ -584,6 +584,17 @@ reuse_tcp_insert(struct outside_network* outnet, struct pending_tcp* pend_tcp)
        return 1;
 }
 
+/** set timeout on tcp fd and setup read event to catch incoming dns msgs */
+static void
+reuse_tcp_setup_readtimeout(struct pending_tcp* pend_tcp)
+{
+       log_reuse_tcp(5, "reuse_tcp_setup_readtimeout", &pend_tcp->reuse);
+       sldns_buffer_clear(pend_tcp->c->buffer);
+       pend_tcp->c->tcp_is_reading = 1;
+       pend_tcp->c->tcp_byte_count = 0;
+       comm_point_start_listening(pend_tcp->c, -1, REUSE_TIMEOUT);
+}
+
 int 
 outnet_tcp_cb(struct comm_point* c, void* arg, int error,
        struct comm_reply *reply_info)
@@ -610,6 +621,7 @@ outnet_tcp_cb(struct comm_point* c, void* arg, int error,
                 * query again to the same destination. */
                if(outnet->tcp_reuse.count < outnet->tcp_reuse_max) {
                        (void)reuse_tcp_insert(outnet, pend);
+                       reuse_tcp_setup_readtimeout(pend);
                }
        }
        fptr_ok(fptr_whitelist_pending_tcp(pend->query->cb));
@@ -1931,6 +1943,7 @@ reuse_tcp_remove_serviced_keep(struct waiting_tcp* w,
                if(!reuse_tcp_insert(sq->outnet, pend_tcp)) {
                        return 0;
                }
+               reuse_tcp_setup_readtimeout(pend_tcp);
                return 1;
        }
        return 0;
index 7328283c632b2474b96095e4ae1b558056252d87..40501da185a19a7b67d395070703b28ce8d6fc18 100644 (file)
@@ -275,6 +275,8 @@ struct reuse_tcp {
 
 /** max number of queries on a reuse connection */
 #define MAX_REUSE_TCP_QUERIES 65000
+/** timeout for REUSE entries in milliseconds. */
+#define REUSE_TIMEOUT 30000
 
 /**
  * A query that has an answer pending for it.
index bb2cd1e53732bed6aa75262cd01239f073f506fe..0198554685b20280bd7194d326099c10db87123a 100644 (file)
@@ -247,6 +247,13 @@ struct comm_point {
            and after read/write completes. No callback is done. */
        int tcp_do_close;
 
+       /** flag that indicates the stream is both written and read from. */
+       int tcp_write_and_read;
+
+       /** byte count for written length over write channel, for when
+        * tcp_write_and_read is enabled */
+       size_t tcp_write_byte_count;
+
        /** if set, read/write completes:
                read/write state of tcp is toggled.
                buffer reset/bytecount reset.