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