diff options
Diffstat (limited to 'daemon')
| -rw-r--r-- | daemon/daemon.c | 10 | ||||
| -rw-r--r-- | daemon/daemon.h | 3 | ||||
| -rw-r--r-- | daemon/remote.c | 14 | ||||
| -rw-r--r-- | daemon/stats.c | 14 | ||||
| -rw-r--r-- | daemon/worker.c | 38 |
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 |
