xref: /freebsd/contrib/unbound/daemon/daemon.h (revision 1838dec3)
1b7579f77SDag-Erling Smørgrav /*
2b7579f77SDag-Erling Smørgrav  * daemon/daemon.h - collection of workers that handles requests.
3b7579f77SDag-Erling Smørgrav  *
4b7579f77SDag-Erling Smørgrav  * Copyright (c) 2007, NLnet Labs. All rights reserved.
5b7579f77SDag-Erling Smørgrav  *
6b7579f77SDag-Erling Smørgrav  * This software is open source.
7b7579f77SDag-Erling Smørgrav  *
8b7579f77SDag-Erling Smørgrav  * Redistribution and use in source and binary forms, with or without
9b7579f77SDag-Erling Smørgrav  * modification, are permitted provided that the following conditions
10b7579f77SDag-Erling Smørgrav  * are met:
11b7579f77SDag-Erling Smørgrav  *
12b7579f77SDag-Erling Smørgrav  * Redistributions of source code must retain the above copyright notice,
13b7579f77SDag-Erling Smørgrav  * this list of conditions and the following disclaimer.
14b7579f77SDag-Erling Smørgrav  *
15b7579f77SDag-Erling Smørgrav  * Redistributions in binary form must reproduce the above copyright notice,
16b7579f77SDag-Erling Smørgrav  * this list of conditions and the following disclaimer in the documentation
17b7579f77SDag-Erling Smørgrav  * and/or other materials provided with the distribution.
18b7579f77SDag-Erling Smørgrav  *
19b7579f77SDag-Erling Smørgrav  * Neither the name of the NLNET LABS nor the names of its contributors may
20b7579f77SDag-Erling Smørgrav  * be used to endorse or promote products derived from this software without
21b7579f77SDag-Erling Smørgrav  * specific prior written permission.
22b7579f77SDag-Erling Smørgrav  *
23b7579f77SDag-Erling Smørgrav  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2417d15b25SDag-Erling Smørgrav  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2517d15b25SDag-Erling Smørgrav  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2617d15b25SDag-Erling Smørgrav  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2717d15b25SDag-Erling Smørgrav  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2817d15b25SDag-Erling Smørgrav  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
2917d15b25SDag-Erling Smørgrav  * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
3017d15b25SDag-Erling Smørgrav  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3117d15b25SDag-Erling Smørgrav  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3217d15b25SDag-Erling Smørgrav  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3317d15b25SDag-Erling Smørgrav  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34b7579f77SDag-Erling Smørgrav  */
35b7579f77SDag-Erling Smørgrav 
36b7579f77SDag-Erling Smørgrav /**
37b7579f77SDag-Erling Smørgrav  * \file
38b7579f77SDag-Erling Smørgrav  *
39b7579f77SDag-Erling Smørgrav  * The daemon consists of global settings and a number of workers.
40b7579f77SDag-Erling Smørgrav  */
41b7579f77SDag-Erling Smørgrav 
42b7579f77SDag-Erling Smørgrav #ifndef DAEMON_H
43b7579f77SDag-Erling Smørgrav #define DAEMON_H
44b7579f77SDag-Erling Smørgrav 
45b7579f77SDag-Erling Smørgrav #include "util/locks.h"
46b7579f77SDag-Erling Smørgrav #include "util/alloc.h"
47b7579f77SDag-Erling Smørgrav #include "services/modstack.h"
48b7579f77SDag-Erling Smørgrav struct config_file;
49b7579f77SDag-Erling Smørgrav struct worker;
50b7579f77SDag-Erling Smørgrav struct listen_port;
51b7579f77SDag-Erling Smørgrav struct slabhash;
52b7579f77SDag-Erling Smørgrav struct module_env;
53b7579f77SDag-Erling Smørgrav struct rrset_cache;
54b7579f77SDag-Erling Smørgrav struct acl_list;
55b7579f77SDag-Erling Smørgrav struct local_zones;
56bc892140SDag-Erling Smørgrav struct views;
57b7579f77SDag-Erling Smørgrav struct ub_randstate;
58b7579f77SDag-Erling Smørgrav struct daemon_remote;
5965b390aaSDag-Erling Smørgrav struct respip_set;
6065b390aaSDag-Erling Smørgrav struct shm_main_info;
61b7579f77SDag-Erling Smørgrav 
62ff825849SDag-Erling Smørgrav #include "dnstap/dnstap_config.h"
63ff825849SDag-Erling Smørgrav #ifdef USE_DNSTAP
64ff825849SDag-Erling Smørgrav struct dt_env;
65ff825849SDag-Erling Smørgrav #endif
66ff825849SDag-Erling Smørgrav 
6765b390aaSDag-Erling Smørgrav #include "dnscrypt/dnscrypt_config.h"
6865b390aaSDag-Erling Smørgrav #ifdef USE_DNSCRYPT
6965b390aaSDag-Erling Smørgrav struct dnsc_env;
7065b390aaSDag-Erling Smørgrav #endif
7165b390aaSDag-Erling Smørgrav 
72b7579f77SDag-Erling Smørgrav /**
73b7579f77SDag-Erling Smørgrav  * Structure holding worker list.
74b7579f77SDag-Erling Smørgrav  * Holds globally visible information.
75b7579f77SDag-Erling Smørgrav  */
76b7579f77SDag-Erling Smørgrav struct daemon {
77b7579f77SDag-Erling Smørgrav 	/** The config settings */
78b7579f77SDag-Erling Smørgrav 	struct config_file* cfg;
79b7579f77SDag-Erling Smørgrav 	/** the chroot dir in use, NULL if none */
80b7579f77SDag-Erling Smørgrav 	char* chroot;
81b7579f77SDag-Erling Smørgrav 	/** pidfile that is used */
82b7579f77SDag-Erling Smørgrav 	char* pidfile;
83b7579f77SDag-Erling Smørgrav 	/** port number that has ports opened. */
84b7579f77SDag-Erling Smørgrav 	int listening_port;
8517d15b25SDag-Erling Smørgrav 	/** array of listening ports, opened.  Listening ports per worker,
8617d15b25SDag-Erling Smørgrav 	 * or just one element[0] shared by the worker threads. */
8717d15b25SDag-Erling Smørgrav 	struct listen_port** ports;
8817d15b25SDag-Erling Smørgrav 	/** size of ports array */
8917d15b25SDag-Erling Smørgrav 	size_t num_ports;
90ff825849SDag-Erling Smørgrav 	/** reuseport is enabled if true */
91ff825849SDag-Erling Smørgrav 	int reuseport;
92b7579f77SDag-Erling Smørgrav 	/** port number for remote that has ports opened. */
93b7579f77SDag-Erling Smørgrav 	int rc_port;
94b7579f77SDag-Erling Smørgrav 	/** listening ports for remote control */
95b7579f77SDag-Erling Smørgrav 	struct listen_port* rc_ports;
96b7579f77SDag-Erling Smørgrav 	/** remote control connections management (for first worker) */
97b7579f77SDag-Erling Smørgrav 	struct daemon_remote* rc;
98b7579f77SDag-Erling Smørgrav 	/** ssl context for listening to dnstcp over ssl, and connecting ssl */
99b7579f77SDag-Erling Smørgrav 	void* listen_sslctx, *connect_sslctx;
100b7579f77SDag-Erling Smørgrav 	/** num threads allocated */
101b7579f77SDag-Erling Smørgrav 	int num;
1021838dec3SCy Schubert 	/** num threads allocated in the previous config or 0 at first */
1031838dec3SCy Schubert 	int old_num;
104b7579f77SDag-Erling Smørgrav 	/** the worker entries */
105b7579f77SDag-Erling Smørgrav 	struct worker** workers;
1061838dec3SCy Schubert 	/** per-worker allocation cache */
1071838dec3SCy Schubert 	struct alloc_cache **worker_allocs;
108b7579f77SDag-Erling Smørgrav 	/** do we need to exit unbound (or is it only a reload?) */
109b7579f77SDag-Erling Smørgrav 	int need_to_exit;
110b7579f77SDag-Erling Smørgrav 	/** master random table ; used for port div between threads on reload*/
111b7579f77SDag-Erling Smørgrav 	struct ub_randstate* rand;
112b7579f77SDag-Erling Smørgrav 	/** master allocation cache */
113b7579f77SDag-Erling Smørgrav 	struct alloc_cache superalloc;
114b7579f77SDag-Erling Smørgrav 	/** the module environment master value, copied and changed by threads*/
115b7579f77SDag-Erling Smørgrav 	struct module_env* env;
116b7579f77SDag-Erling Smørgrav 	/** stack of module callbacks */
117b7579f77SDag-Erling Smørgrav 	struct module_stack mods;
118b7579f77SDag-Erling Smørgrav 	/** access control, which client IPs are allowed to connect */
119b7579f77SDag-Erling Smørgrav 	struct acl_list* acl;
120865f46b2SCy Schubert 	/** access control, which interfaces are allowed to connect */
121865f46b2SCy Schubert 	struct acl_list* acl_interface;
1224c75e3aaSDag-Erling Smørgrav 	/** TCP connection limit, limit connections from client IPs */
1234c75e3aaSDag-Erling Smørgrav 	struct tcl_list* tcl;
124b7579f77SDag-Erling Smørgrav 	/** local authority zones */
125b7579f77SDag-Erling Smørgrav 	struct local_zones* local_zones;
126b7579f77SDag-Erling Smørgrav 	/** last time of statistics printout */
127b7579f77SDag-Erling Smørgrav 	struct timeval time_last_stat;
128b7579f77SDag-Erling Smørgrav 	/** time when daemon started */
129b7579f77SDag-Erling Smørgrav 	struct timeval time_boot;
130bc892140SDag-Erling Smørgrav 	/** views structure containing view tree */
131bc892140SDag-Erling Smørgrav 	struct views* views;
132ff825849SDag-Erling Smørgrav #ifdef USE_DNSTAP
133ff825849SDag-Erling Smørgrav 	/** the dnstap environment master value, copied and changed by threads*/
134ff825849SDag-Erling Smørgrav 	struct dt_env* dtenv;
135ff825849SDag-Erling Smørgrav #endif
13665b390aaSDag-Erling Smørgrav 	struct shm_main_info* shm_info;
13765b390aaSDag-Erling Smørgrav 	/** response-ip set with associated actions and tags. */
13865b390aaSDag-Erling Smørgrav 	struct respip_set* respip_set;
13965b390aaSDag-Erling Smørgrav 	/** some response-ip tags or actions are configured if true */
14065b390aaSDag-Erling Smørgrav 	int use_response_ip;
141091e9e46SCy Schubert 	/** some RPZ policies are configured */
142091e9e46SCy Schubert 	int use_rpz;
14365b390aaSDag-Erling Smørgrav #ifdef USE_DNSCRYPT
14465b390aaSDag-Erling Smørgrav 	/** the dnscrypt environment */
14565b390aaSDag-Erling Smørgrav 	struct dnsc_env* dnscenv;
14665b390aaSDag-Erling Smørgrav #endif
1471838dec3SCy Schubert 	/** reuse existing cache on reload if other conditions allow it. */
1481838dec3SCy Schubert 	int reuse_cache;
149b7579f77SDag-Erling Smørgrav };
150b7579f77SDag-Erling Smørgrav 
151b7579f77SDag-Erling Smørgrav /**
152b7579f77SDag-Erling Smørgrav  * Initialize daemon structure.
153b7579f77SDag-Erling Smørgrav  * @return: The daemon structure, or NULL on error.
154b7579f77SDag-Erling Smørgrav  */
155b7579f77SDag-Erling Smørgrav struct daemon* daemon_init(void);
156b7579f77SDag-Erling Smørgrav 
157b7579f77SDag-Erling Smørgrav /**
158b7579f77SDag-Erling Smørgrav  * Open shared listening ports (if needed).
159b7579f77SDag-Erling Smørgrav  * The cfg member pointer must have been set for the daemon.
160b7579f77SDag-Erling Smørgrav  * @param daemon: the daemon.
161b7579f77SDag-Erling Smørgrav  * @return: false on error.
162b7579f77SDag-Erling Smørgrav  */
163b7579f77SDag-Erling Smørgrav int daemon_open_shared_ports(struct daemon* daemon);
164b7579f77SDag-Erling Smørgrav 
165b7579f77SDag-Erling Smørgrav /**
166b7579f77SDag-Erling Smørgrav  * Fork workers and start service.
167b7579f77SDag-Erling Smørgrav  * When the routine exits, it is no longer forked.
168b7579f77SDag-Erling Smørgrav  * @param daemon: the daemon.
169b7579f77SDag-Erling Smørgrav  */
170b7579f77SDag-Erling Smørgrav void daemon_fork(struct daemon* daemon);
171b7579f77SDag-Erling Smørgrav 
172b7579f77SDag-Erling Smørgrav /**
173b7579f77SDag-Erling Smørgrav  * Close off the worker thread information.
174b7579f77SDag-Erling Smørgrav  * Bring the daemon back into state ready for daemon_fork again.
175b7579f77SDag-Erling Smørgrav  * @param daemon: the daemon.
176b7579f77SDag-Erling Smørgrav  */
177b7579f77SDag-Erling Smørgrav void daemon_cleanup(struct daemon* daemon);
178b7579f77SDag-Erling Smørgrav 
179b7579f77SDag-Erling Smørgrav /**
180b7579f77SDag-Erling Smørgrav  * Delete workers, close listening ports.
181b7579f77SDag-Erling Smørgrav  * @param daemon: the daemon.
182b7579f77SDag-Erling Smørgrav  */
183b7579f77SDag-Erling Smørgrav void daemon_delete(struct daemon* daemon);
184b7579f77SDag-Erling Smørgrav 
185b7579f77SDag-Erling Smørgrav /**
186b7579f77SDag-Erling Smørgrav  * Apply config settings.
187b7579f77SDag-Erling Smørgrav  * @param daemon: the daemon.
188b7579f77SDag-Erling Smørgrav  * @param cfg: new config settings.
189b7579f77SDag-Erling Smørgrav  */
190b7579f77SDag-Erling Smørgrav void daemon_apply_cfg(struct daemon* daemon, struct config_file* cfg);
191b7579f77SDag-Erling Smørgrav 
192b7579f77SDag-Erling Smørgrav #endif /* DAEMON_H */
193