unbound
0.1
|
This file implements the worker that handles callbacks on events, for pending requests. More...
#include "config.h"
#include <ldns/wire2host.h>
#include "util/log.h"
#include "util/net_help.h"
#include "util/random.h"
#include "daemon/worker.h"
#include "daemon/daemon.h"
#include "daemon/remote.h"
#include "daemon/acl_list.h"
#include "util/netevent.h"
#include "util/config_file.h"
#include "util/module.h"
#include "util/regional.h"
#include "util/storage/slabhash.h"
#include "services/listen_dnsport.h"
#include "services/outside_network.h"
#include "services/outbound_list.h"
#include "services/cache/rrset.h"
#include "services/cache/infra.h"
#include "services/cache/dns.h"
#include "services/mesh.h"
#include "services/localzone.h"
#include "util/data/msgparse.h"
#include "util/data/msgencode.h"
#include "util/data/dname.h"
#include "util/fptr_wlist.h"
#include "util/tube.h"
#include "iterator/iter_fwd.h"
#include "validator/autotrust.h"
#include <signal.h>
Defines | |
#define | NORMAL_UDP_SIZE 512 /* bytes */ |
Size of an UDP datagram. | |
#define | PREFETCH_EXPIRY_ADD 60 |
seconds to add to prefetch leeway. | |
Functions | |
static void | worker_mem_report (struct worker *ATTR_UNUSED(worker), struct serviced_query *ATTR_UNUSED(cur_serv)) |
Report on memory usage by this thread and global. | |
void | worker_send_cmd (struct worker *worker, enum worker_commands cmd) |
Send a command to a worker. | |
int | worker_handle_reply (struct comm_point *c, void *arg, int error, struct comm_reply *reply_info) |
process incoming replies from the network | |
int | worker_handle_service_reply (struct comm_point *c, void *arg, int error, struct comm_reply *reply_info) |
process incoming serviced query replies from the network | |
static int | worker_check_request (ldns_buffer *pkt, struct worker *worker) |
check request sanity. | |
void | worker_handle_control_cmd (struct tube *ATTR_UNUSED(tube), uint8_t *msg, size_t len, int error, void *arg) |
static enum sec_status | check_delegation_secure (struct reply_info *rep) |
check if a delegation is secure | |
static void | deleg_remove_nonsecure_additional (struct reply_info *rep) |
remove nonsecure from a delegation referral additional section | |
static int | answer_norec_from_cache (struct worker *worker, struct query_info *qinfo, uint16_t id, uint16_t flags, struct comm_reply *repinfo, struct edns_data *edns) |
answer nonrecursive query from the cache | |
static int | answer_from_cache (struct worker *worker, struct query_info *qinfo, struct reply_info *rep, uint16_t id, uint16_t flags, struct comm_reply *repinfo, struct edns_data *edns) |
answer query from the cache | |
static void | reply_and_prefetch (struct worker *worker, struct query_info *qinfo, uint16_t flags, struct comm_reply *repinfo, uint32_t leeway) |
Reply to client and perform prefetch to keep cache up to date. | |
static void | chaos_replystr (ldns_buffer *pkt, const char *str, struct edns_data *edns) |
Fill CH class answer into buffer. | |
static int | answer_chaos (struct worker *w, struct query_info *qinfo, struct edns_data *edns, ldns_buffer *pkt) |
Answer CH class queries. | |
int | worker_handle_request (struct comm_point *c, void *arg, int error, struct comm_reply *repinfo) |
handles callbacks from listening event interface | |
void | worker_sighandler (int sig, void *arg) |
Worker signal handler function. | |
static void | worker_restart_timer (struct worker *worker) |
restart statistics timer for worker, if enabled | |
void | worker_stat_timer_cb (void *arg) |
statistics timer callback handler | |
void | worker_probe_timer_cb (void *arg) |
probe timer callback handler | |
struct worker * | worker_create (struct daemon *daemon, int id, int *ports, int n) |
Create the worker structure. | |
int | worker_init (struct worker *worker, struct config_file *cfg, struct listen_port *ports, int do_sigs) |
Initialize worker. | |
void | worker_work (struct worker *worker) |
Make worker work. | |
void | worker_delete (struct worker *worker) |
Delete worker. | |
static int | outbound_entry_compare (void *a, void *b) |
compare outbound entry qstates | |
struct outbound_entry * | worker_send_query (uint8_t *qname, size_t qnamelen, uint16_t qtype, uint16_t qclass, uint16_t flags, int dnssec, int want_dnssec, struct sockaddr_storage *addr, socklen_t addrlen, uint8_t *zone, size_t zonelen, struct module_qstate *q) |
Worker service routine to send serviced queries to authoritative servers. | |
void | worker_alloc_cleanup (void *arg) |
cleanup the cache to remove all rrset IDs from it, arg is worker | |
void | worker_stats_clear (struct worker *worker) |
Init worker stats - includes server_stats_init, outside network and mesh. | |
struct outbound_entry * | libworker_send_query (uint8_t *ATTR_UNUSED(qname), size_t ATTR_UNUSED(qnamelen), uint16_t ATTR_UNUSED(qtype), uint16_t ATTR_UNUSED(qclass), uint16_t ATTR_UNUSED(flags), int ATTR_UNUSED(dnssec), int ATTR_UNUSED(want_dnssec), struct sockaddr_storage *ATTR_UNUSED(addr), socklen_t ATTR_UNUSED(addrlen), struct module_qstate *ATTR_UNUSED(q)) |
int | libworker_handle_reply (struct comm_point *ATTR_UNUSED(c), void *ATTR_UNUSED(arg), int ATTR_UNUSED(error), struct comm_reply *ATTR_UNUSED(reply_info)) |
int | libworker_handle_service_reply (struct comm_point *ATTR_UNUSED(c), void *ATTR_UNUSED(arg), int ATTR_UNUSED(error), struct comm_reply *ATTR_UNUSED(reply_info)) |
void | libworker_handle_control_cmd (struct tube *ATTR_UNUSED(tube), uint8_t *ATTR_UNUSED(buffer), size_t ATTR_UNUSED(len), int ATTR_UNUSED(error), void *ATTR_UNUSED(arg)) |
void | libworker_fg_done_cb (void *ATTR_UNUSED(arg), int ATTR_UNUSED(rcode), ldns_buffer *ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s), char *ATTR_UNUSED(why_bogus)) |
void | libworker_bg_done_cb (void *ATTR_UNUSED(arg), int ATTR_UNUSED(rcode), ldns_buffer *ATTR_UNUSED(buf), enum sec_status ATTR_UNUSED(s), char *ATTR_UNUSED(why_bogus)) |
int | context_query_cmp (const void *ATTR_UNUSED(a), const void *ATTR_UNUSED(b)) |
int | order_lock_cmp (const void *ATTR_UNUSED(e1), const void *ATTR_UNUSED(e2)) |
int | codeline_cmp (const void *ATTR_UNUSED(a), const void *ATTR_UNUSED(b)) |
This file implements the worker that handles callbacks on events, for pending requests.
#define PREFETCH_EXPIRY_ADD 60 |
seconds to add to prefetch leeway.
This is a TTL that expires old rrsets earlier than they should in order to put the new update into the cache. This additional value is to make sure that if not all TTLs are equal in the message to be updated(and replaced), that rrsets with up to this much extra TTL are also replaced. This means that the resulting new message will have (most likely) this TTL at least, avoiding very small 'split second' TTLs due to operators choosing relative primes for TTLs (or so). Also has to be at least one to break ties (and overwrite cached entry).
Referenced by reply_and_prefetch().
void worker_send_cmd | ( | struct worker * | worker, |
enum worker_commands | cmd | ||
) |
Send a command to a worker.
Uses blocking writes.
worker,: | worker to send command to. |
cmd,: | command to send. |
References worker::cmd, log_err(), and tube_write_msg().
Referenced by daemon_stop_others(), distribute_cmd(), and server_stats_obtain().
static int worker_check_request | ( | ldns_buffer * | pkt, |
struct worker * | worker | ||
) | [static] |
check request sanity.
pkt,: | the wire packet to examine for sanity. |
worker,: | parameters for checking. |
References daemon::cfg, worker::daemon, config_file::harden_large_queries, NORMAL_UDP_SIZE, VERB_QUERY, and verbose().
Referenced by worker_handle_request().
static void chaos_replystr | ( | ldns_buffer * | pkt, |
const char * | str, | ||
struct edns_data * | edns | ||
) | [static] |
Fill CH class answer into buffer.
Keeps query.
pkt,: | buffer |
str,: | string to put into text record (<255). |
edns,: | edns reply information. |
References attach_edns_record(), BIT_QR, BIT_RA, edns_data::bits, EDNS_ADVERTISED_SIZE, EDNS_ADVERTISED_VERSION, EDNS_DO, edns_data::edns_version, query_dname_len(), and edns_data::udp_size.
Referenced by answer_chaos().
static int answer_chaos | ( | struct worker * | w, |
struct query_info * | qinfo, | ||
struct edns_data * | edns, | ||
ldns_buffer * | pkt | ||
) | [static] |
Answer CH class queries.
w,: | worker |
qinfo,: | query info. Pointer into packet buffer. |
edns,: | edns info from query. |
pkt,: | packet buffer. |
References module_env::cfg, chaos_replystr(), worker::env, config_file::hide_identity, config_file::hide_version, config_file::identity, log_err(), query_info::qname, query_info::qtype, query_dname_compare(), and config_file::version.
Referenced by worker_handle_request().
void worker_sighandler | ( | int | sig, |
void * | arg | ||
) |
Worker signal handler function.
User argument is the worker itself.
sig,: | signal number. |
arg,: | the worker (main worker) that handles signals. |
References worker::base, comm_base_exit(), log_err(), worker::need_to_exit, VERB_QUERY, and verbose().
Referenced by fptr_whitelist_comm_signal(), signal_handling_playback(), and worker_init().
struct worker* worker_create | ( | struct daemon * | daemon, |
int | id, | ||
int * | ports, | ||
int | n | ||
) | [read] |
Create the worker structure.
Bare bones version, zeroed struct, with backpointers only. Use worker_init on it later.
daemon,: | the daemon that this worker thread is part of. |
id,: | the thread number from 0.. numthreads-1. |
ports,: | the ports it is allowed to use, array. |
n,: | the number of ports. |
References worker::cmd, worker::daemon, log_err(), memdup(), worker::numports, worker::ports, daemon::rand, worker::rndstate, worker::thread_num, tube_create(), tube_delete(), and ub_initstate().
Referenced by daemon_create_workers().
int worker_init | ( | struct worker * | worker, |
struct config_file * | cfg, | ||
struct listen_port * | ports, | ||
int | do_sigs | ||
) |
Initialize worker.
Allocates event base, listens to ports
worker,: | worker to initialize, created with worker_create. |
cfg,: | configuration settings. |
ports,: | list of shared query ports. |
do_sigs,: | if true, worker installs signal handlers. |
References worker::alloc, module_env::alloc, alloc_init(), alloc_set_id_cleanup(), module_env::anchors, module_env::attach_sub, autr_get_num_anchors(), worker::back, worker::base, module_env::cfg, worker::cmd, comm_base_timept(), comm_signal_create(), comm_timer_create(), comm_timer_set(), worker::comsig, worker::daemon, daemon_remote_open_accept(), module_env::detach_subs, module_env::detect_cycle, config_file::do_ip4, config_file::do_ip6, config_file::do_tcp, config_file::do_udp, daemon::env, worker::env, forwards_apply_cfg(), forwards_create(), worker::front, module_env::fwds, config_file::incoming_num_tcp, module_env::infra_cache, module_env::kill_sub, listen_create(), daemon::listen_sslctx, log_err(), log_set_time(), module_env::mesh, mesh_attach_sub(), mesh_create(), mesh_detach_subs(), mesh_detect_cycle(), mesh_state_delete(), daemon::mods, config_file::msg_buffer_size, worker::need_to_exit, module_env::now, module_env::now_tv, config_file::num_out_ifs, worker::numports, config_file::out_ifs, config_file::outgoing_num_ports, config_file::outgoing_num_tcp, outside_network_create(), worker::ports, module_env::probe_timer, daemon::rc, daemon::rc_ports, regional_create_custom(), module_env::rnd, worker::rndstate, module_env::scratch, module_env::scratch_buffer, worker::scratchpad, module_env::send_query, server_stats_init(), config_file::stat_interval, worker::stat_timer, worker::stats, daemon::superalloc, worker::thread_num, tube_setup_bg_listen(), ub_thread_sig_unblock(), config_file::unwanted_threshold, config_file::use_caps_bits_for_id, VERB_ALGO, verbose(), module_env::worker, worker_alloc_cleanup(), worker_delete(), worker_handle_control_cmd(), worker_handle_request(), worker_mem_report(), worker_probe_timer_cb(), worker_restart_timer(), worker_send_query(), worker_sighandler(), and worker_stat_timer_cb().
Referenced by daemon_fork(), and thread_start().
struct outbound_entry* worker_send_query | ( | uint8_t * | qname, |
size_t | qnamelen, | ||
uint16_t | qtype, | ||
uint16_t | qclass, | ||
uint16_t | flags, | ||
int | dnssec, | ||
int | want_dnssec, | ||
struct sockaddr_storage * | addr, | ||
socklen_t | addrlen, | ||
uint8_t * | zone, | ||
size_t | zonelen, | ||
struct module_qstate * | q | ||
) | [read] |
Worker service routine to send serviced queries to authoritative servers.
qname,: | query name. (host order) |
qnamelen,: | length in bytes of qname, including trailing 0. |
qtype,: | query type. (host order) |
qclass,: | query class. (host order) |
flags,: | host order flags word, with opcode and CD bit. |
dnssec,: | if set, EDNS record will have DO bit set. |
want_dnssec,: | signatures needed. |
addr,: | where to. |
addrlen,: | length of addr. |
zone,: | wireformat dname of the zone. |
zonelen,: | length of zone name. |
q,: | wich query state to reactivate upon return. |
References worker::back, module_env::cfg, module_qstate::env, outbound_entry_compare(), outnet_serviced_query(), outbound_entry::qsent, outbound_entry::qstate, module_qstate::region, regional_alloc(), config_file::ssl_upstream, config_file::tcp_upstream, outside_network::udp_buff, module_env::worker, and worker_handle_service_reply().
Referenced by fptr_whitelist_modenv_send_query(), and worker_init().
void worker_stats_clear | ( | struct worker * | worker | ) |
Init worker stats - includes server_stats_init, outside network and mesh.
worker,: | the worker to init |
References worker::back, module_env::cfg, worker::env, module_env::mesh, mesh_stats_clear(), server_stats_init(), worker::stats, and outside_network::unwanted_replies.
Referenced by do_flush_stats(), server_stats_compile(), and worker_stat_timer_cb().