summaryrefslogtreecommitdiff
path: root/daemon
diff options
context:
space:
mode:
Diffstat (limited to 'daemon')
-rw-r--r--daemon/daemon.c10
-rw-r--r--daemon/daemon.h3
-rw-r--r--daemon/remote.c14
-rw-r--r--daemon/stats.c14
-rw-r--r--daemon/worker.c38
5 files changed, 65 insertions, 14 deletions
diff --git a/daemon/daemon.c b/daemon/daemon.c
index 72b4a43be1ad..1c8272b14e81 100644
--- a/daemon/daemon.c
+++ b/daemon/daemon.c
@@ -557,6 +557,12 @@ daemon_create_workers(struct daemon* daemon)
fatal_exit("out of memory during daemon init");
numport = daemon_get_shufport(daemon, shufport);
verbose(VERB_ALGO, "total of %d outgoing ports available", numport);
+
+#ifdef HAVE_NGTCP2
+ daemon->doq_table = doq_table_create(daemon->cfg, daemon->rand);
+ if(!daemon->doq_table)
+ fatal_exit("could not create doq_table: out of memory");
+#endif
daemon->num = (daemon->cfg->num_threads?daemon->cfg->num_threads:1);
if(daemon->reuseport && (int)daemon->num < (int)daemon->num_ports) {
@@ -907,6 +913,10 @@ daemon_cleanup(struct daemon* daemon)
dnsc_delete(daemon->dnscenv);
daemon->dnscenv = NULL;
#endif
+#ifdef HAVE_NGTCP2
+ doq_table_delete(daemon->doq_table);
+ daemon->doq_table = NULL;
+#endif
daemon->cfg = NULL;
}
diff --git a/daemon/daemon.h b/daemon/daemon.h
index 5c3a114cc7e6..fc1bde713cae 100644
--- a/daemon/daemon.h
+++ b/daemon/daemon.h
@@ -58,6 +58,7 @@ struct ub_randstate;
struct daemon_remote;
struct respip_set;
struct shm_main_info;
+struct doq_table;
struct cookie_secrets;
#include "dnstap/dnstap_config.h"
@@ -147,6 +148,8 @@ struct daemon {
/** the dnscrypt environment */
struct dnsc_env* dnscenv;
#endif
+ /** the doq connection table */
+ struct doq_table* doq_table;
/** reuse existing cache on reload if other conditions allow it. */
int reuse_cache;
/** the EDNS cookie secrets from the cookie-secret-file */
diff --git a/daemon/remote.c b/daemon/remote.c
index 855b1f963b23..8877cd19402b 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -302,7 +302,7 @@ add_open(const char* ip, int nr, struct listen_port** list, int noproto_is_err,
/* open fd */
fd = create_tcp_accept_sock(res, 1, &noproto, 0,
cfg->ip_transparent, 0, 0, cfg->ip_freebind,
- cfg->use_systemd, cfg->ip_dscp);
+ cfg->use_systemd, cfg->ip_dscp, "unbound-control");
freeaddrinfo(res);
}
@@ -866,6 +866,10 @@ print_mem(RES* ssl, struct worker* worker, struct daemon* daemon,
if(!print_longnum(ssl, "mem.http.response_buffer"SQ,
(size_t)s->svr.mem_http2_response_buffer))
return 0;
+#ifdef HAVE_NGTCP2
+ if(!print_longnum(ssl, "mem.quic"SQ, (size_t)s->svr.mem_quic))
+ return 0;
+#endif /* HAVE_NGTCP2 */
return 1;
}
@@ -996,6 +1000,10 @@ print_ext(RES* ssl, struct ub_stats_info* s, int inhibit_zero)
(unsigned long)s->svr.qipv6)) return 0;
if(!ssl_printf(ssl, "num.query.https"SQ"%lu\n",
(unsigned long)s->svr.qhttps)) return 0;
+#ifdef HAVE_NGTCP2
+ if(!ssl_printf(ssl, "num.query.quic"SQ"%lu\n",
+ (unsigned long)s->svr.qquic)) return 0;
+#endif /* HAVE_NGTCP2 */
/* flags */
if(!ssl_printf(ssl, "num.query.flags.QR"SQ"%lu\n",
(unsigned long)s->svr.qbit_QR)) return 0;
@@ -1953,6 +1961,8 @@ bogus_del_msg(struct lruhash_entry* e, void* arg)
struct reply_info* d = (struct reply_info*)e->data;
if(d->security == sec_status_bogus) {
d->ttl = inf->expired;
+ d->prefetch_ttl = inf->expired;
+ d->serve_expired_ttl = inf->expired;
inf->num_msgs++;
#ifdef USE_CACHEDB
if(inf->remcachedb && inf->worker->env.cachedb_enabled)
@@ -2035,6 +2045,8 @@ negative_del_msg(struct lruhash_entry* e, void* arg)
* or NOERROR rcode with ANCOUNT==0: a NODATA answer */
if(FLAGS_GET_RCODE(d->flags) != 0 || d->an_numrrsets == 0) {
d->ttl = inf->expired;
+ d->prefetch_ttl = inf->expired;
+ d->serve_expired_ttl = inf->expired;
inf->num_msgs++;
#ifdef USE_CACHEDB
if(inf->remcachedb && inf->worker->env.cachedb_enabled)
diff --git a/daemon/stats.c b/daemon/stats.c
index 827110698970..0e17300a150e 100644
--- a/daemon/stats.c
+++ b/daemon/stats.c
@@ -346,6 +346,12 @@ server_stats_compile(struct worker* worker, struct ub_stats_info* s, int reset)
(long long)http2_get_query_buffer_size();
s->svr.mem_http2_response_buffer =
(long long)http2_get_response_buffer_size();
+#ifdef HAVE_NGTCP2
+ s->svr.mem_quic = (long long)doq_table_quic_size_get(
+ worker->daemon->doq_table);
+#else
+ s->svr.mem_quic = 0;
+#endif /* HAVE_NGTCP2 */
/* Set neg cache usage numbers */
set_neg_cache_stats(worker, &s->svr, reset);
@@ -474,6 +480,7 @@ void server_stats_add(struct ub_stats_info* total, struct ub_stats_info* a)
total->svr.qtls += a->svr.qtls;
total->svr.qtls_resume += a->svr.qtls_resume;
total->svr.qhttps += a->svr.qhttps;
+ total->svr.qquic += a->svr.qquic;
total->svr.qipv6 += a->svr.qipv6;
total->svr.qbit_QR += a->svr.qbit_QR;
total->svr.qbit_AA += a->svr.qbit_AA;
@@ -533,7 +540,8 @@ void server_stats_insquery(struct ub_server_stats* stats, struct comm_point* c,
else stats->qclass_big++;
stats->qopcode[ LDNS_OPCODE_WIRE(sldns_buffer_begin(c->buffer)) ]++;
if(c->type != comm_udp) {
- stats->qtcp++;
+ if(c->type != comm_doq)
+ stats->qtcp++;
if(c->ssl != NULL) {
stats->qtls++;
#ifdef HAVE_SSL
@@ -542,6 +550,10 @@ void server_stats_insquery(struct ub_server_stats* stats, struct comm_point* c,
#endif
if(c->type == comm_http)
stats->qhttps++;
+#ifdef HAVE_NGTCP2
+ else if(c->type == comm_doq)
+ stats->qquic++;
+#endif
}
}
if(repinfo && addr_is_ip6(&repinfo->remote_addr, repinfo->remote_addrlen))
diff --git a/daemon/worker.c b/daemon/worker.c
index 5e6b2a656e2c..713de316373a 100644
--- a/daemon/worker.c
+++ b/daemon/worker.c
@@ -661,22 +661,18 @@ answer_from_cache(struct worker* worker, struct query_info* qinfo,
if(rep->ttl < timenow) {
/* Check if we need to serve expired now */
if(worker->env.cfg->serve_expired &&
- !worker->env.cfg->serve_expired_client_timeout
+ /* if serve-expired-client-timeout is set, serve
+ * an expired record without attempting recursion
+ * if the serve_expired_norec_ttl is set for the record
+ * as we know that recursion is currently failing. */
+ (!worker->env.cfg->serve_expired_client_timeout ||
+ timenow < rep->serve_expired_norec_ttl)
#ifdef USE_CACHEDB
&& !(worker->env.cachedb_enabled &&
worker->env.cfg->cachedb_check_when_serve_expired)
#endif
) {
- if(worker->env.cfg->serve_expired_ttl &&
- rep->serve_expired_ttl < timenow)
- return 0;
- /* Ignore expired failure answers */
- if(FLAGS_GET_RCODE(rep->flags) !=
- LDNS_RCODE_NOERROR &&
- FLAGS_GET_RCODE(rep->flags) !=
- LDNS_RCODE_NXDOMAIN &&
- FLAGS_GET_RCODE(rep->flags) !=
- LDNS_RCODE_YXDOMAIN)
+ if(!reply_info_can_answer_expired(rep, timenow))
return 0;
if(!rrset_array_lock(rep->ref, rep->rrset_count, 0))
return 0;
@@ -2178,7 +2174,9 @@ worker_init(struct worker* worker, struct config_file *cfg,
cfg->harden_large_queries, cfg->http_max_streams,
cfg->http_endpoint, cfg->http_notls_downstream,
worker->daemon->tcl, worker->daemon->listen_sslctx,
- dtenv, worker_handle_request, worker);
+ dtenv, worker->daemon->doq_table, worker->env.rnd,
+ cfg->ssl_service_key, cfg->ssl_service_pem, cfg,
+ worker_handle_request, worker);
if(!worker->front) {
log_err("could not create listening sockets");
worker_delete(worker);
@@ -2512,3 +2510,19 @@ void dtio_mainfdcallback(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
log_assert(0);
}
#endif
+
+#ifdef HAVE_NGTCP2
+void doq_client_event_cb(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
+ void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+#endif
+
+#ifdef HAVE_NGTCP2
+void doq_client_timer_cb(int ATTR_UNUSED(fd), short ATTR_UNUSED(ev),
+ void* ATTR_UNUSED(arg))
+{
+ log_assert(0);
+}
+#endif