From: W.C.A. Wijngaards Date: Tue, 9 Jun 2020 14:15:03 +0000 (+0200) Subject: set timeout to wait for reuse X-Git-Tag: release-1.13.0rc1~5^2~74 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a695ba447c6d57f982a5133533067bd822886323;p=thirdparty%2Funbound.git set timeout to wait for reuse add comm_point indicator for write events for reuse stream writes. --- diff --git a/services/outside_network.c b/services/outside_network.c index f11999d7c..b885c3a1a 100644 --- a/services/outside_network.c +++ b/services/outside_network.c @@ -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; diff --git a/services/outside_network.h b/services/outside_network.h index 7328283c6..40501da18 100644 --- a/services/outside_network.h +++ b/services/outside_network.h @@ -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. diff --git a/util/netevent.h b/util/netevent.h index bb2cd1e53..019855468 100644 --- a/util/netevent.h +++ b/util/netevent.h @@ -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.