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; 61*46d2f618SCy Schubert struct doq_table; 6256850988SCy Schubert struct cookie_secrets; 63b7579f77SDag-Erling Smørgrav 64ff825849SDag-Erling Smørgrav #include "dnstap/dnstap_config.h" 65ff825849SDag-Erling Smørgrav #ifdef USE_DNSTAP 66ff825849SDag-Erling Smørgrav struct dt_env; 67ff825849SDag-Erling Smørgrav #endif 68ff825849SDag-Erling Smørgrav 6965b390aaSDag-Erling Smørgrav #include "dnscrypt/dnscrypt_config.h" 7065b390aaSDag-Erling Smørgrav #ifdef USE_DNSCRYPT 7165b390aaSDag-Erling Smørgrav struct dnsc_env; 7265b390aaSDag-Erling Smørgrav #endif 7365b390aaSDag-Erling Smørgrav 74b7579f77SDag-Erling Smørgrav /** 75b7579f77SDag-Erling Smørgrav * Structure holding worker list. 76b7579f77SDag-Erling Smørgrav * Holds globally visible information. 77b7579f77SDag-Erling Smørgrav */ 78b7579f77SDag-Erling Smørgrav struct daemon { 79b7579f77SDag-Erling Smørgrav /** The config settings */ 80b7579f77SDag-Erling Smørgrav struct config_file* cfg; 81b7579f77SDag-Erling Smørgrav /** the chroot dir in use, NULL if none */ 82b7579f77SDag-Erling Smørgrav char* chroot; 83b7579f77SDag-Erling Smørgrav /** pidfile that is used */ 84b7579f77SDag-Erling Smørgrav char* pidfile; 85b7579f77SDag-Erling Smørgrav /** port number that has ports opened. */ 86b7579f77SDag-Erling Smørgrav int listening_port; 8717d15b25SDag-Erling Smørgrav /** array of listening ports, opened. Listening ports per worker, 8817d15b25SDag-Erling Smørgrav * or just one element[0] shared by the worker threads. */ 8917d15b25SDag-Erling Smørgrav struct listen_port** ports; 9017d15b25SDag-Erling Smørgrav /** size of ports array */ 9117d15b25SDag-Erling Smørgrav size_t num_ports; 92ff825849SDag-Erling Smørgrav /** reuseport is enabled if true */ 93ff825849SDag-Erling Smørgrav int reuseport; 94b7579f77SDag-Erling Smørgrav /** port number for remote that has ports opened. */ 95b7579f77SDag-Erling Smørgrav int rc_port; 96b7579f77SDag-Erling Smørgrav /** listening ports for remote control */ 97b7579f77SDag-Erling Smørgrav struct listen_port* rc_ports; 98b7579f77SDag-Erling Smørgrav /** remote control connections management (for first worker) */ 99b7579f77SDag-Erling Smørgrav struct daemon_remote* rc; 100b7579f77SDag-Erling Smørgrav /** ssl context for listening to dnstcp over ssl, and connecting ssl */ 101b7579f77SDag-Erling Smørgrav void* listen_sslctx, *connect_sslctx; 102b7579f77SDag-Erling Smørgrav /** num threads allocated */ 103b7579f77SDag-Erling Smørgrav int num; 1041838dec3SCy Schubert /** num threads allocated in the previous config or 0 at first */ 1051838dec3SCy Schubert int old_num; 106b7579f77SDag-Erling Smørgrav /** the worker entries */ 107b7579f77SDag-Erling Smørgrav struct worker** workers; 1081838dec3SCy Schubert /** per-worker allocation cache */ 1091838dec3SCy Schubert struct alloc_cache **worker_allocs; 110b7579f77SDag-Erling Smørgrav /** do we need to exit unbound (or is it only a reload?) */ 111b7579f77SDag-Erling Smørgrav int need_to_exit; 112b7579f77SDag-Erling Smørgrav /** master random table ; used for port div between threads on reload*/ 113b7579f77SDag-Erling Smørgrav struct ub_randstate* rand; 114b7579f77SDag-Erling Smørgrav /** master allocation cache */ 115b7579f77SDag-Erling Smørgrav struct alloc_cache superalloc; 116b7579f77SDag-Erling Smørgrav /** the module environment master value, copied and changed by threads*/ 117b7579f77SDag-Erling Smørgrav struct module_env* env; 118b7579f77SDag-Erling Smørgrav /** stack of module callbacks */ 119b7579f77SDag-Erling Smørgrav struct module_stack mods; 12056850988SCy Schubert /** The module stack has been inited */ 12156850988SCy Schubert int mods_inited; 122b7579f77SDag-Erling Smørgrav /** access control, which client IPs are allowed to connect */ 123b7579f77SDag-Erling Smørgrav struct acl_list* acl; 124865f46b2SCy Schubert /** access control, which interfaces are allowed to connect */ 125865f46b2SCy Schubert struct acl_list* acl_interface; 1264c75e3aaSDag-Erling Smørgrav /** TCP connection limit, limit connections from client IPs */ 1274c75e3aaSDag-Erling Smørgrav struct tcl_list* tcl; 128b7579f77SDag-Erling Smørgrav /** local authority zones */ 129b7579f77SDag-Erling Smørgrav struct local_zones* local_zones; 130b7579f77SDag-Erling Smørgrav /** last time of statistics printout */ 131b7579f77SDag-Erling Smørgrav struct timeval time_last_stat; 132b7579f77SDag-Erling Smørgrav /** time when daemon started */ 133b7579f77SDag-Erling Smørgrav struct timeval time_boot; 134bc892140SDag-Erling Smørgrav /** views structure containing view tree */ 135bc892140SDag-Erling Smørgrav struct views* views; 136ff825849SDag-Erling Smørgrav #ifdef USE_DNSTAP 137ff825849SDag-Erling Smørgrav /** the dnstap environment master value, copied and changed by threads*/ 138ff825849SDag-Erling Smørgrav struct dt_env* dtenv; 139ff825849SDag-Erling Smørgrav #endif 14065b390aaSDag-Erling Smørgrav struct shm_main_info* shm_info; 14165b390aaSDag-Erling Smørgrav /** response-ip set with associated actions and tags. */ 14265b390aaSDag-Erling Smørgrav struct respip_set* respip_set; 14365b390aaSDag-Erling Smørgrav /** some response-ip tags or actions are configured if true */ 14465b390aaSDag-Erling Smørgrav int use_response_ip; 145091e9e46SCy Schubert /** some RPZ policies are configured */ 146091e9e46SCy Schubert int use_rpz; 14765b390aaSDag-Erling Smørgrav #ifdef USE_DNSCRYPT 14865b390aaSDag-Erling Smørgrav /** the dnscrypt environment */ 14965b390aaSDag-Erling Smørgrav struct dnsc_env* dnscenv; 15065b390aaSDag-Erling Smørgrav #endif 151*46d2f618SCy Schubert /** the doq connection table */ 152*46d2f618SCy Schubert struct doq_table* doq_table; 1531838dec3SCy Schubert /** reuse existing cache on reload if other conditions allow it. */ 1541838dec3SCy Schubert int reuse_cache; 15556850988SCy Schubert /** the EDNS cookie secrets from the cookie-secret-file */ 15656850988SCy Schubert struct cookie_secrets* cookie_secrets; 157b7579f77SDag-Erling Smørgrav }; 158b7579f77SDag-Erling Smørgrav 159b7579f77SDag-Erling Smørgrav /** 160b7579f77SDag-Erling Smørgrav * Initialize daemon structure. 161b7579f77SDag-Erling Smørgrav * @return: The daemon structure, or NULL on error. 162b7579f77SDag-Erling Smørgrav */ 163b7579f77SDag-Erling Smørgrav struct daemon* daemon_init(void); 164b7579f77SDag-Erling Smørgrav 165b7579f77SDag-Erling Smørgrav /** 166b7579f77SDag-Erling Smørgrav * Open shared listening ports (if needed). 167b7579f77SDag-Erling Smørgrav * The cfg member pointer must have been set for the daemon. 168b7579f77SDag-Erling Smørgrav * @param daemon: the daemon. 169b7579f77SDag-Erling Smørgrav * @return: false on error. 170b7579f77SDag-Erling Smørgrav */ 171b7579f77SDag-Erling Smørgrav int daemon_open_shared_ports(struct daemon* daemon); 172b7579f77SDag-Erling Smørgrav 173b7579f77SDag-Erling Smørgrav /** 17456850988SCy Schubert * Do daemon setup that needs privileges 17556850988SCy Schubert * like opening privileged ports or opening device files. 17656850988SCy Schubert * The cfg member pointer must have been set for the daemon. 17756850988SCy Schubert * @param daemon: the daemon. 17856850988SCy Schubert * @return: false on error. 17956850988SCy Schubert */ 18056850988SCy Schubert int daemon_privileged(struct daemon* daemon); 18156850988SCy Schubert 18256850988SCy Schubert /** 183b7579f77SDag-Erling Smørgrav * Fork workers and start service. 184b7579f77SDag-Erling Smørgrav * When the routine exits, it is no longer forked. 185b7579f77SDag-Erling Smørgrav * @param daemon: the daemon. 186b7579f77SDag-Erling Smørgrav */ 187b7579f77SDag-Erling Smørgrav void daemon_fork(struct daemon* daemon); 188b7579f77SDag-Erling Smørgrav 189b7579f77SDag-Erling Smørgrav /** 190b7579f77SDag-Erling Smørgrav * Close off the worker thread information. 191b7579f77SDag-Erling Smørgrav * Bring the daemon back into state ready for daemon_fork again. 192b7579f77SDag-Erling Smørgrav * @param daemon: the daemon. 193b7579f77SDag-Erling Smørgrav */ 194b7579f77SDag-Erling Smørgrav void daemon_cleanup(struct daemon* daemon); 195b7579f77SDag-Erling Smørgrav 196b7579f77SDag-Erling Smørgrav /** 197b7579f77SDag-Erling Smørgrav * Delete workers, close listening ports. 198b7579f77SDag-Erling Smørgrav * @param daemon: the daemon. 199b7579f77SDag-Erling Smørgrav */ 200b7579f77SDag-Erling Smørgrav void daemon_delete(struct daemon* daemon); 201b7579f77SDag-Erling Smørgrav 202b7579f77SDag-Erling Smørgrav /** 203b7579f77SDag-Erling Smørgrav * Apply config settings. 204b7579f77SDag-Erling Smørgrav * @param daemon: the daemon. 205b7579f77SDag-Erling Smørgrav * @param cfg: new config settings. 206b7579f77SDag-Erling Smørgrav */ 207b7579f77SDag-Erling Smørgrav void daemon_apply_cfg(struct daemon* daemon, struct config_file* cfg); 208b7579f77SDag-Erling Smørgrav 209b7579f77SDag-Erling Smørgrav #endif /* DAEMON_H */ 210