blob: 8ed36a3233da143d3cf07ae4101382230ea4f3fe [file] [log] [blame]
Simon Kelleyc8e8f5c2021-01-24 21:59:37 +00001/* dnsmasq is Copyright (c) 2000-2021 Simon Kelley
Simon Kelley824af852008-02-12 20:43:05 +00002
Simon Kelley9e4abcb2004-01-22 19:47:41 +00003 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
Simon Kelley824af852008-02-12 20:43:05 +00005 the Free Software Foundation; version 2 dated June, 1991, or
6 (at your option) version 3 dated 29 June, 2007.
7
Simon Kelley9e4abcb2004-01-22 19:47:41 +00008 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
Simon Kelley824af852008-02-12 20:43:05 +000012
Simon Kelley73a08a22009-02-05 20:28:08 +000013 You should have received a copy of the GNU General Public License
14 along with this program. If not, see <http://www.gnu.org/licenses/>.
Simon Kelley9e4abcb2004-01-22 19:47:41 +000015*/
16
Simon Kelleyc8e8f5c2021-01-24 21:59:37 +000017#define COPYRIGHT "Copyright (c) 2000-2021 Simon Kelley"
Simon Kelley9e4abcb2004-01-22 19:47:41 +000018
Christian Hesseb697fbb2017-09-25 17:36:24 +010019/* We do defines that influence behavior of stdio.h, so complain
20 if included too early. */
21#ifdef _STDIO_H
22# error "Header file stdio.h included too early!"
23#endif
24
Simon Kelley1a6bca82008-07-11 11:11:42 +010025#ifndef NO_LARGEFILE
Simon Kelley9e038942008-05-30 20:06:34 +010026/* Ensure we can use files >2GB (log files may grow this big) */
Simon Kelley1a6bca82008-07-11 11:11:42 +010027# define _LARGEFILE_SOURCE 1
28# define _FILE_OFFSET_BITS 64
29#endif
Simon Kelley9e038942008-05-30 20:06:34 +010030
Simon Kelley8ef5ada2010-06-03 19:42:45 +010031/* Get linux C library versions and define _GNU_SOURCE for kFreeBSD. */
32#if defined(__linux__) || defined(__GLIBC__)
Simon Kelley572b41e2011-02-18 18:11:18 +000033# ifndef __ANDROID__
34# define _GNU_SOURCE
35# endif
Simon Kelley9e038942008-05-30 20:06:34 +010036# include <features.h>
37#endif
38
Simon Kelley316e2732010-01-22 20:16:09 +000039/* Need these defined early */
40#if defined(__sun) || defined(__sun__)
41# define _XPG4_2
42# define __EXTENSIONS__
43#endif
44
Petr Menšík282eab72018-08-15 19:41:07 +020045#if (defined(__GNUC__) && __GNUC__ >= 3) || defined(__clang__)
46#define ATTRIBUTE_NORETURN __attribute__ ((noreturn))
47#else
48#define ATTRIBUTE_NORETURN
49#endif
50
Simon Kelley9e4abcb2004-01-22 19:47:41 +000051/* get these before config.h for IPv6 stuff... */
Simon Kelley44a2a312004-03-10 20:04:35 +000052#include <sys/types.h>
Simon Kelley1f15b812009-10-13 17:49:32 +010053#include <sys/socket.h>
Simon Kelleyc72daea2012-01-05 21:33:27 +000054
55#ifdef __APPLE__
56/* Define before netinet/in.h to select API. OSX Lion onwards. */
57# define __APPLE_USE_RFC_3542
58#endif
Simon Kelley9e4abcb2004-01-22 19:47:41 +000059#include <netinet/in.h>
60
Simon Kelleyc72daea2012-01-05 21:33:27 +000061/* Also needed before config.h. */
Simon Kelley59353a62004-11-21 19:34:28 +000062#include <getopt.h>
63
Simon Kelley9e4abcb2004-01-22 19:47:41 +000064#include "config.h"
Simon Kelleyc3a04082014-01-11 22:18:19 +000065#include "ip6addr.h"
Julian Kornbergeraba8bbb2018-07-21 21:55:08 +010066#include "metrics.h"
Simon Kelleyb8187c82005-11-26 21:46:27 +000067
Tarun Kundu024baf12022-06-28 10:56:47 -070068#include <stdbool.h>
69
Simon Kelley572b41e2011-02-18 18:11:18 +000070typedef unsigned char u8;
71typedef unsigned short u16;
72typedef unsigned int u32;
Simon Kelley52b92f42012-01-22 16:05:15 +000073typedef unsigned long long u64;
Simon Kelley572b41e2011-02-18 18:11:18 +000074
Giovanni Bajo28c62552012-04-25 17:40:13 +020075#define countof(x) (long)(sizeof(x) / sizeof(x[0]))
76#define MIN(a,b) ((a) < (b) ? (a) : (b))
77
Simon Kelleyc239f7d2012-02-27 10:56:18 +000078#include "dns-protocol.h"
79#include "dhcp-protocol.h"
Simon Kelleyc72daea2012-01-05 21:33:27 +000080#ifdef HAVE_DHCP6
Simon Kelleyc239f7d2012-02-27 10:56:18 +000081#include "dhcp6-protocol.h"
82#include "radv-protocol.h"
Simon Kelleyc72daea2012-01-05 21:33:27 +000083#endif
Simon Kelley572b41e2011-02-18 18:11:18 +000084
Simon Kelleyb8187c82005-11-26 21:46:27 +000085#define gettext_noop(S) (S)
Simon Kelley824af852008-02-12 20:43:05 +000086#ifndef LOCALEDIR
Simon Kelleyb8187c82005-11-26 21:46:27 +000087# define _(S) (S)
88#else
89# include <libintl.h>
90# include <locale.h>
91# define _(S) gettext(S)
92#endif
93
Simon Kelley9e4abcb2004-01-22 19:47:41 +000094#include <arpa/inet.h>
95#include <sys/stat.h>
Simon Kelley9e4abcb2004-01-22 19:47:41 +000096#include <sys/ioctl.h>
Simon Kelley824af852008-02-12 20:43:05 +000097#if defined(HAVE_SOLARIS_NETWORK)
Simon Kelley316e2732010-01-22 20:16:09 +000098# include <sys/sockio.h>
Simon Kelley824af852008-02-12 20:43:05 +000099#endif
Simon Kelley9e147482021-03-02 21:17:28 +0000100#include <poll.h>
Simon Kelleyfeba5c12004-07-27 20:28:58 +0100101#include <sys/wait.h>
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000102#include <sys/time.h>
Simon Kelleyf2621c72007-04-29 19:47:21 +0100103#include <sys/un.h>
Simon Kelley8a911cc2004-03-16 18:35:52 +0000104#include <limits.h>
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000105#include <net/if.h>
Simon Kelley316e2732010-01-22 20:16:09 +0000106#if defined(HAVE_SOLARIS_NETWORK) && !defined(ifr_mtu)
107/* Some solaris net/if./h omit this. */
108# define ifr_mtu ifr_ifru.ifru_metric
109#endif
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000110#include <unistd.h>
111#include <stdio.h>
112#include <string.h>
113#include <stdlib.h>
114#include <fcntl.h>
115#include <ctype.h>
116#include <signal.h>
Simon Kelley9e038942008-05-30 20:06:34 +0100117#include <stddef.h>
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000118#include <time.h>
119#include <errno.h>
120#include <pwd.h>
121#include <grp.h>
Simon Kelleyf6b7dc42005-01-23 12:06:08 +0000122#include <stdarg.h>
Simon Kelley572b41e2011-02-18 18:11:18 +0000123#if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__sun__) || defined (__sun) || defined (__ANDROID__)
Simon Kelley44a2a312004-03-10 20:04:35 +0000124# include <netinet/if_ether.h>
125#else
126# include <net/ethernet.h>
127#endif
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000128#include <net/if_arp.h>
129#include <netinet/in_systm.h>
130#include <netinet/ip.h>
Simon Kelley6b173352018-05-08 18:32:14 +0100131#include <netinet/ip6.h>
Simon Kelley3be34542004-09-11 19:12:13 +0100132#include <netinet/ip_icmp.h>
Simon Kelley608aa9f2019-03-10 22:44:15 +0000133#include <netinet/tcp.h>
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000134#include <sys/uio.h>
Simon Kelley849a8352006-06-09 21:02:31 +0100135#include <syslog.h>
136#include <dirent.h>
Simon Kelley5e9e0ef2006-04-17 14:24:29 +0100137#ifndef HAVE_LINUX_NETWORK
138# include <net/if_dl.h>
139#endif
140
Simon Kelley824af852008-02-12 20:43:05 +0000141#if defined(HAVE_LINUX_NETWORK)
Simon Kelley0506a5e2020-03-19 21:56:45 +0000142#include <linux/version.h>
Jiri Slaby3052ce22019-07-24 17:34:48 +0100143#include <linux/sockios.h>
Simon Kelley5e9e0ef2006-04-17 14:24:29 +0100144#include <linux/capability.h>
145/* There doesn't seem to be a universally-available
Josh Soref730c6742017-02-06 16:14:04 +0000146 userspace header for these. */
Simon Kelley5e9e0ef2006-04-17 14:24:29 +0100147extern int capset(cap_user_header_t header, cap_user_data_t data);
Simon Kelley9e038942008-05-30 20:06:34 +0100148extern int capget(cap_user_header_t header, cap_user_data_t data);
149#define LINUX_CAPABILITY_VERSION_1 0x19980330
150#define LINUX_CAPABILITY_VERSION_2 0x20071026
Simon Kelley1a6bca82008-07-11 11:11:42 +0100151#define LINUX_CAPABILITY_VERSION_3 0x20080522
Simon Kelley9e038942008-05-30 20:06:34 +0100152
Simon Kelley5e9e0ef2006-04-17 14:24:29 +0100153#include <sys/prctl.h>
Simon Kelley7622fc02009-06-04 20:32:05 +0100154#elif defined(HAVE_SOLARIS_NETWORK)
Simon Kelley824af852008-02-12 20:43:05 +0000155#include <priv.h>
Simon Kelley5e9e0ef2006-04-17 14:24:29 +0100156#endif
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000157
Simon Kelleya69b0172021-01-24 21:53:28 +0000158/* Backwards compat with 2.83 */
159#if defined(HAVE_NETTLEHASH)
160# define HAVE_CRYPTOHASH
161#endif
162#if defined(HAVE_DNSSEC) || defined(HAVE_CRYPTOHASH)
Simon Kelleyad9c6f02017-10-27 22:13:49 +0100163# include <nettle/nettle-meta.h>
164#endif
165
Simon Kelley824af852008-02-12 20:43:05 +0000166/* daemon is function in the C library.... */
Simon Kelley5aabfc72007-08-29 11:24:47 +0100167#define daemon dnsmasq_daemon
168
Simon Kelleyee875042018-10-23 22:10:17 +0100169#define ADDRSTRLEN INET6_ADDRSTRLEN
170
Simon Kelley5aabfc72007-08-29 11:24:47 +0100171/* Async event queue */
172struct event_desc {
Simon Kelleyc72daea2012-01-05 21:33:27 +0000173 int event, data, msg_sz;
Simon Kelley5aabfc72007-08-29 11:24:47 +0100174};
175
Petr Menšíkc77fb9d2017-04-16 20:20:08 +0100176#define EVENT_RELOAD 1
177#define EVENT_DUMP 2
178#define EVENT_ALARM 3
179#define EVENT_TERM 4
180#define EVENT_CHILD 5
181#define EVENT_REOPEN 6
182#define EVENT_EXITED 7
183#define EVENT_KILLED 8
184#define EVENT_EXEC_ERR 9
185#define EVENT_PIPE_ERR 10
186#define EVENT_USER_ERR 11
187#define EVENT_CAP_ERR 12
188#define EVENT_PIDFILE 13
189#define EVENT_HUSER_ERR 14
190#define EVENT_GROUP_ERR 15
191#define EVENT_DIE 16
192#define EVENT_LOG_ERR 17
193#define EVENT_FORK_ERR 18
194#define EVENT_LUA_ERR 19
195#define EVENT_TFTP_ERR 20
196#define EVENT_INIT 21
197#define EVENT_NEWADDR 22
198#define EVENT_NEWROUTE 23
199#define EVENT_TIME_ERR 24
200#define EVENT_SCRIPT_LOG 25
Simon Kelley3c973ad2018-01-14 21:05:37 +0000201#define EVENT_TIME 26
Simon Kelley5aabfc72007-08-29 11:24:47 +0100202
203/* Exit codes. */
204#define EC_GOOD 0
205#define EC_BADCONF 1
206#define EC_BADNET 2
207#define EC_FILE 3
208#define EC_NOMEM 4
209#define EC_MISC 5
210#define EC_INIT_OFFSET 10
211
Simon Kelley28866e92011-02-14 20:19:14 +0000212#define OPT_BOGUSPRIV 0
213#define OPT_FILTER 1
214#define OPT_LOG 2
215#define OPT_SELFMX 3
216#define OPT_NO_HOSTS 4
217#define OPT_NO_POLL 5
218#define OPT_DEBUG 6
219#define OPT_ORDER 7
220#define OPT_NO_RESOLV 8
221#define OPT_EXPAND 9
222#define OPT_LOCALMX 10
223#define OPT_NO_NEG 11
224#define OPT_NODOTS_LOCAL 12
225#define OPT_NOWILD 13
226#define OPT_ETHERS 14
227#define OPT_RESOLV_DOMAIN 15
228#define OPT_NO_FORK 16
229#define OPT_AUTHORITATIVE 17
230#define OPT_LOCALISE 18
231#define OPT_DBUS 19
232#define OPT_DHCP_FQDN 20
233#define OPT_NO_PING 21
234#define OPT_LEASE_RO 22
235#define OPT_ALL_SERVERS 23
236#define OPT_RELOAD 24
237#define OPT_LOCAL_REBIND 25
238#define OPT_TFTP_SECURE 26
239#define OPT_TFTP_NOBLOCK 27
240#define OPT_LOG_OPTS 28
Floris Bos60704f52017-04-09 22:22:49 +0100241#define OPT_TFTP_APREF_IP 29
Simon Kelley28866e92011-02-14 20:19:14 +0000242#define OPT_NO_OVERRIDE 30
243#define OPT_NO_REBIND 31
244#define OPT_ADD_MAC 32
Giovanni Bajo237724c2012-04-05 02:46:52 +0200245#define OPT_DNSSEC_PROXY 33
Simon Kelley7de060b2011-08-26 17:24:52 +0100246#define OPT_CONSEC_ADDR 34
247#define OPT_CONNTRACK 35
Simon Kelleyc72daea2012-01-05 21:33:27 +0000248#define OPT_FQDN_UPDATE 36
Simon Kelleyc5ad4e72012-02-24 16:06:20 +0000249#define OPT_RA 37
Simon Kelley61ce6002012-04-20 21:28:49 +0100250#define OPT_TFTP_LC 38
Simon Kelley54dd3932012-06-20 11:23:38 +0100251#define OPT_CLEVERBIND 39
Simon Kelley8bc4cec2012-07-03 21:04:11 +0100252#define OPT_TFTP 40
Simon Kelley6bd3a092013-10-11 10:25:56 +0100253#define OPT_CLIENT_SUBNET 41
Kevin Darbyshire-Bryant8c0b73d2013-10-11 11:56:33 +0100254#define OPT_QUIET_DHCP 42
255#define OPT_QUIET_DHCP6 43
256#define OPT_QUIET_RA 44
Simon Kelley3a237152013-12-12 12:15:50 +0000257#define OPT_DNSSEC_VALID 45
Simon Kelleye98bd522014-03-28 20:41:23 +0000258#define OPT_DNSSEC_TIME 46
Simon Kelley5b3bf922014-01-25 17:03:07 +0000259#define OPT_DNSSEC_DEBUG 47
Simon Kelleya6918532018-04-15 16:20:52 +0100260#define OPT_DNSSEC_IGN_NS 48
Simon Kelleyc8a80482014-03-05 14:29:54 +0000261#define OPT_LOCAL_SERVICE 49
Simon Kelleyb5ea1cc2014-07-29 16:34:14 +0100262#define OPT_LOOP_DETECT 50
Simon Kelley25cf5e32015-01-09 15:53:03 +0000263#define OPT_EXTRALOG 51
Stefan Tomanek30d08792015-03-31 22:32:11 +0100264#define OPT_TFTP_NO_FAIL 52
Simon Kelley1e505122016-01-25 21:29:23 +0000265#define OPT_SCRIPT_ARP 53
266#define OPT_MAC_B64 54
Simon Kelley9e4cf472016-02-17 20:26:32 +0000267#define OPT_MAC_HEX 55
Floris Bos60704f52017-04-09 22:22:49 +0100268#define OPT_TFTP_APREF_MAC 56
Simon Kelley734d5312018-03-23 23:09:53 +0000269#define OPT_RAPID_COMMIT 57
Julian Kornberger8dcdb332018-07-21 22:11:08 +0100270#define OPT_UBUS 58
Florent Fourcot13a58f92019-06-20 10:26:40 +0200271#define OPT_IGNORE_CLID 59
Simon Kelley66f62652020-01-05 16:21:24 +0000272#define OPT_SINGLE_PORT 60
Simon Kelleyee645822020-02-27 16:34:14 +0000273#define OPT_LEASE_RENEW 61
Simon Kelleyb260d222021-03-12 21:57:57 +0000274#define OPT_LOG_DEBUG 62
Kyle Swensonba77fe82021-11-19 09:33:46 -0700275#define OPT_EDNS_RESTRICT 63
276#define OPT_LAST 64
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000277
Petr Menšík24b87602018-10-24 22:30:18 +0100278#define OPTION_BITS (sizeof(unsigned int)*8)
279#define OPTION_SIZE ( (OPT_LAST/OPTION_BITS)+((OPT_LAST%OPTION_BITS)!=0) )
280#define option_var(x) (daemon->options[(x) / OPTION_BITS])
281#define option_val(x) ((1u) << ((x) % OPTION_BITS))
282#define option_bool(x) (option_var(x) & option_val(x))
283
Simon Kelleyb260d222021-03-12 21:57:57 +0000284/* extra flags for my_syslog, we use facilities since they are known
285 not to occupy the same bits as priorities, no matter how syslog.h is set up.
286 MS_DEBUG messages are suppressed unless --log-debug is set. */
Petr Menšíkc77fb9d2017-04-16 20:20:08 +0100287#define MS_TFTP LOG_USER
288#define MS_DHCP LOG_DAEMON
289#define MS_SCRIPT LOG_MAIL
Simon Kelleyb260d222021-03-12 21:57:57 +0000290#define MS_DEBUG LOG_NEWS
Simon Kelley7622fc02009-06-04 20:32:05 +0100291
Simon Kelleycc921df2019-01-02 22:48:59 +0000292/* Note that this is used widely as a container for IPv4/IPv6 addresses,
293 so for that reason, was well as to avoid wasting memory in almost every
294 cache entry, the other variants should not be larger than
295 sizeof(struct in6_addr) - 16 bytes.
296*/
297union all_addr {
298 struct in_addr addr4;
299 struct in6_addr addr6;
300 struct {
301 union {
302 struct crec *cache;
Simon Kelley84449bf2019-10-29 22:24:19 +0000303 char *name;
Simon Kelleycc921df2019-01-02 22:48:59 +0000304 } target;
Simon Kelley1fd56c02019-10-30 12:58:28 +0000305 unsigned int uid;
306 int is_name_ptr; /* disciminates target union */
Simon Kelleycc921df2019-01-02 22:48:59 +0000307 } cname;
308 struct {
309 struct blockdata *keydata;
310 unsigned short keylen, flags, keytag;
311 unsigned char algo;
312 } key;
313 struct {
314 struct blockdata *keydata;
315 unsigned short keylen, keytag;
316 unsigned char algo;
317 unsigned char digest;
318 } ds;
Simon Kelley5b99eae2019-01-06 23:09:50 +0000319 struct {
320 struct blockdata *target;
321 unsigned short targetlen, srvport, priority, weight;
322 } srv;
Simon Kelleycc921df2019-01-02 22:48:59 +0000323 /* for log_query */
324 struct {
325 unsigned short keytag, algo, digest, rcode;
326 } log;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000327};
328
Simon Kelleycc921df2019-01-02 22:48:59 +0000329
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000330struct bogus_addr {
Simon Kelley9eaa91b2021-03-17 20:31:06 +0000331 struct in_addr addr, mask;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000332 struct bogus_addr *next;
333};
334
Simon Kelley1cff1662004-03-12 08:12:58 +0000335/* dns doctor param */
336struct doctor {
Simon Kelley73a08a22009-02-05 20:28:08 +0000337 struct in_addr in, end, out, mask;
Simon Kelley1cff1662004-03-12 08:12:58 +0000338 struct doctor *next;
339};
340
Simon Kelley0a852542005-03-23 20:28:59 +0000341struct mx_srv_record {
342 char *name, *target;
Simon Kelley3d8df262005-08-29 12:19:27 +0100343 int issrv, srvport, priority, weight;
344 unsigned int offset;
Simon Kelley0a852542005-03-23 20:28:59 +0000345 struct mx_srv_record *next;
Simon Kelleyde379512004-06-22 20:23:33 +0100346};
347
Simon Kelley1a6bca82008-07-11 11:11:42 +0100348struct naptr {
349 char *name, *replace, *regexp, *services, *flags;
350 unsigned int order, pref;
351 struct naptr *next;
352};
353
Kevin Darbyshire-Bryant7ac9ae12016-09-09 20:52:08 +0100354#ifndef NO_ID
Simon Kelleyfec216d2014-03-27 20:54:34 +0000355#define TXT_STAT_CACHESIZE 1
356#define TXT_STAT_INSERTS 2
357#define TXT_STAT_EVICTIONS 3
358#define TXT_STAT_MISSES 4
359#define TXT_STAT_HITS 5
360#define TXT_STAT_AUTH 6
361#define TXT_STAT_SERVERS 7
Kevin Darbyshire-Bryant7ac9ae12016-09-09 20:52:08 +0100362#endif
Simon Kelleyfec216d2014-03-27 20:54:34 +0000363
Simon Kelley0a852542005-03-23 20:28:59 +0000364struct txt_record {
Simon Kelley28866e92011-02-14 20:19:14 +0000365 char *name;
366 unsigned char *txt;
Simon Kelley0a852542005-03-23 20:28:59 +0000367 unsigned short class, len;
Simon Kelleyfec216d2014-03-27 20:54:34 +0000368 int stat;
Simon Kelley0a852542005-03-23 20:28:59 +0000369 struct txt_record *next;
Simon Kelleyf6b7dc42005-01-23 12:06:08 +0000370};
371
Simon Kelley832af0b2007-01-21 20:01:28 +0000372struct ptr_record {
373 char *name, *ptr;
374 struct ptr_record *next;
375};
376
Simon Kelley9009d742008-11-14 20:04:27 +0000377struct cname {
Simon Kelley903df072017-01-19 17:22:00 +0000378 int ttl, flag;
Simon Kelley9009d742008-11-14 20:04:27 +0000379 char *alias, *target;
Simon Kelley903df072017-01-19 17:22:00 +0000380 struct cname *next, *targetp;
Simon Kelley376d48c2013-11-13 13:04:30 +0000381};
382
Simon Kelleyee415862014-02-11 11:07:22 +0000383struct ds_config {
384 char *name, *digest;
385 int digestlen, class, algo, keytag, digest_type;
386 struct ds_config *next;
Simon Kelley0fc2f312014-01-08 10:26:58 +0000387};
388
Simon Kelley137286e2020-02-06 22:09:30 +0000389#define ADDRLIST_LITERAL 1
390#define ADDRLIST_IPV6 2
391#define ADDRLIST_REVONLY 4
392#define ADDRLIST_PREFIX 8
393#define ADDRLIST_WILDCARD 16
Simon Kelleyc125c1d2020-03-05 17:10:14 +0000394#define ADDRLIST_DECLINED 32
Simon Kelley376d48c2013-11-13 13:04:30 +0000395
396struct addrlist {
Simon Kelleycc921df2019-01-02 22:48:59 +0000397 union all_addr addr;
Simon Kelleyc125c1d2020-03-05 17:10:14 +0000398 int flags, prefixlen;
399 time_t decline_time;
Simon Kelley376d48c2013-11-13 13:04:30 +0000400 struct addrlist *next;
Simon Kelley9009d742008-11-14 20:04:27 +0000401};
402
Simon Kelley376d48c2013-11-13 13:04:30 +0000403#define AUTH6 1
404#define AUTH4 2
405
Simon Kelley4f7b3042012-11-28 21:27:02 +0000406struct auth_zone {
407 char *domain;
Simon Kelley376d48c2013-11-13 13:04:30 +0000408 struct auth_name_list {
409 char *name;
410 int flags;
411 struct auth_name_list *next;
412 } *interface_names;
413 struct addrlist *subnet;
Mathias Kresin094bfae2016-07-24 14:15:22 +0100414 struct addrlist *exclude;
Simon Kelley4f7b3042012-11-28 21:27:02 +0000415 struct auth_zone *next;
416};
417
Simon Kelley157d8cf2019-10-25 17:46:49 +0100418#define HR_6 1
419#define HR_4 2
Simon Kelley4f7b3042012-11-28 21:27:02 +0000420
Simon Kelleye759d422012-03-16 13:18:57 +0000421struct host_record {
Simon Kelley157d8cf2019-10-25 17:46:49 +0100422 int ttl, flags;
Simon Kelleye759d422012-03-16 13:18:57 +0000423 struct name_list {
424 char *name;
425 struct name_list *next;
426 } *names;
427 struct in_addr addr;
Simon Kelleye759d422012-03-16 13:18:57 +0000428 struct in6_addr addr6;
Simon Kelleye759d422012-03-16 13:18:57 +0000429 struct host_record *next;
430};
431
Simon Kelleyb7cf7542021-03-04 16:54:14 +0000432#define IN4 1
433#define IN6 2
434#define INP4 4
435#define INP6 8
436
Simon Kelleyf2621c72007-04-29 19:47:21 +0100437struct interface_name {
438 char *name; /* domain name */
439 char *intr; /* interface name */
Simon Kelleyb7cf7542021-03-04 16:54:14 +0000440 int flags;
441 struct in_addr proto4;
442 struct in6_addr proto6;
Simon Kelley376d48c2013-11-13 13:04:30 +0000443 struct addrlist *addr;
Simon Kelleyf2621c72007-04-29 19:47:21 +0100444 struct interface_name *next;
445};
446
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000447union bigname {
448 char name[MAXDNAME];
449 union bigname *next; /* freelist */
450};
451
Simon Kelleyc3e0b9b2013-12-31 13:50:39 +0000452struct blockdata {
453 struct blockdata *next;
Simon Kelley7b4ad2e2012-04-04 14:05:35 +0100454 unsigned char key[KEYBLOCK_LEN];
455};
456
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000457struct crec {
458 struct crec *next, *prev, *hash_next;
Simon Kelleycc921df2019-01-02 22:48:59 +0000459 union all_addr addr;
Simon Kelleycdbee9a2012-04-04 21:55:59 +0100460 time_t ttd; /* time to die */
Simon Kelley93be5b12015-12-15 12:04:40 +0000461 /* used as class if DNSKEY/DS, index to source for F_HOSTS */
Simon Kelley3f7483e2014-03-16 22:56:58 +0000462 unsigned int uid;
Simon Kelley5b99eae2019-01-06 23:09:50 +0000463 unsigned int flags;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000464 union {
465 char sname[SMALLDNAME];
466 union bigname *bname;
467 char *namep;
468 } name;
469};
470
Simon Kelley3a610a02018-09-26 16:50:35 +0100471#define SIZEOF_BARE_CREC (sizeof(struct crec) - SMALLDNAME)
472#define SIZEOF_POINTER_CREC (sizeof(struct crec) + sizeof(char *) - SMALLDNAME)
473
Simon Kelley28866e92011-02-14 20:19:14 +0000474#define F_IMMORTAL (1u<<0)
475#define F_NAMEP (1u<<1)
476#define F_REVERSE (1u<<2)
477#define F_FORWARD (1u<<3)
478#define F_DHCP (1u<<4)
479#define F_NEG (1u<<5)
480#define F_HOSTS (1u<<6)
481#define F_IPV4 (1u<<7)
482#define F_IPV6 (1u<<8)
483#define F_BIGNAME (1u<<9)
484#define F_NXDOMAIN (1u<<10)
485#define F_CNAME (1u<<11)
Simon Kelley7b4ad2e2012-04-04 14:05:35 +0100486#define F_DNSKEY (1u<<12)
Simon Kelley28866e92011-02-14 20:19:14 +0000487#define F_CONFIG (1u<<13)
Simon Kelley7b4ad2e2012-04-04 14:05:35 +0100488#define F_DS (1u<<14)
489#define F_DNSSECOK (1u<<15)
Simon Kelley28866e92011-02-14 20:19:14 +0000490#define F_UPSTREAM (1u<<16)
491#define F_RRNAME (1u<<17)
492#define F_SERVER (1u<<18)
493#define F_QUERY (1u<<19)
Simon Kelley7b4ad2e2012-04-04 14:05:35 +0100494#define F_NOERR (1u<<20)
Simon Kelley4f7b3042012-11-28 21:27:02 +0000495#define F_AUTH (1u<<21)
Simon Kelley0fc2f312014-01-08 10:26:58 +0000496#define F_DNSSEC (1u<<22)
497#define F_KEYTAG (1u<<23)
498#define F_SECSTAT (1u<<24)
Simon Kelley12fae492014-02-04 22:03:06 +0000499#define F_NO_RR (1u<<25)
Wang Jian49752b92014-03-28 20:52:47 +0000500#define F_IPSET (1u<<26)
Simon Kelley93be5b12015-12-15 12:04:40 +0000501#define F_NOEXTRA (1u<<27)
Simon Kelleyee645822020-02-27 16:34:14 +0000502#define F_SERVFAIL (1u<<28) /* currently unused. */
Simon Kelley07ed5852018-05-04 21:52:22 +0100503#define F_RCODE (1u<<29)
Simon Kelley5b99eae2019-01-06 23:09:50 +0000504#define F_SRV (1u<<30)
Simon Kelley4f7b3042012-11-28 21:27:02 +0000505
Simon Kelley45d8a242018-07-17 21:01:14 +0100506#define UID_NONE 0
Simon Kelley19c51cf2014-03-18 22:38:30 +0000507/* Values of uid in crecs with F_CONFIG bit set. */
Simon Kelley19c51cf2014-03-18 22:38:30 +0000508#define SRC_CONFIG 1
509#define SRC_HOSTS 2
510#define SRC_AH 3
511
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000512
513/* struct sockaddr is not large enough to hold any address,
Simon Kelleycdeda282006-03-16 20:16:06 +0000514 and specifically not big enough to hold an IPv6 address.
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000515 Blech. Roll our own. */
516union mysockaddr {
517 struct sockaddr sa;
518 struct sockaddr_in in;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000519 struct sockaddr_in6 in6;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000520};
521
Simon Kelleybad7b872012-12-20 22:00:39 +0000522/* bits in flag param to IPv6 callbacks from iface_enumerate() */
523#define IFACE_TENTATIVE 1
524#define IFACE_DEPRECATED 2
Vladislav Grishenko4568a6f2013-08-19 16:07:07 +0100525#define IFACE_PERMANENT 4
Simon Kelleybad7b872012-12-20 22:00:39 +0000526
527
Simon Kelley0a852542005-03-23 20:28:59 +0000528#define SERV_FROM_RESOLV 1 /* 1 for servers from resolv, 0 for command line. */
529#define SERV_NO_ADDR 2 /* no server, this domain is local only */
530#define SERV_LITERAL_ADDRESS 4 /* addr is the answer, not the server */
Simon Kelley5aabfc72007-08-29 11:24:47 +0100531#define SERV_HAS_DOMAIN 8 /* server for one domain only */
532#define SERV_HAS_SOURCE 16 /* source address defined */
Simon Kelley0a852542005-03-23 20:28:59 +0000533#define SERV_FOR_NODOTS 32 /* server for names with no domain part only */
534#define SERV_WARNED_RECURSIVE 64 /* avoid warning spam */
Simon Kelley3d8df262005-08-29 12:19:27 +0100535#define SERV_FROM_DBUS 128 /* 1 if source is DBus */
536#define SERV_MARK 256 /* for mark-and-delete */
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000537#define SERV_TYPE (SERV_HAS_DOMAIN | SERV_FOR_NODOTS)
Simon Kelley824af852008-02-12 20:43:05 +0000538#define SERV_COUNTED 512 /* workspace for log code */
Simon Kelley8ef5ada2010-06-03 19:42:45 +0100539#define SERV_USE_RESOLV 1024 /* forward this domain in the normal way */
540#define SERV_NO_REBIND 2048 /* inhibit dns-rebind protection */
Simon Kelley7b1eae42014-02-20 13:43:28 +0000541#define SERV_FROM_FILE 4096 /* read from --servers-file */
Simon Kelleyb5ea1cc2014-07-29 16:34:14 +0100542#define SERV_LOOP 8192 /* server causes forwarding loop */
Simon Kelley367341f2016-01-12 15:58:23 +0000543#define SERV_DO_DNSSEC 16384 /* Validate DNSSEC when using this server */
Simon Kelley361dfe52017-02-10 21:12:30 +0000544#define SERV_GOT_TCP 32768 /* Got some data from the TCP connection */
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000545
546struct serverfd {
547 int fd;
548 union mysockaddr source_addr;
Simon Kelley824af852008-02-12 20:43:05 +0000549 char interface[IF_NAMESIZE+1];
Simon Kelley4441cf72018-04-10 21:39:54 +0100550 unsigned int ifindex, used, preallocated;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000551 struct serverfd *next;
552};
553
Simon Kelley1a6bca82008-07-11 11:11:42 +0100554struct randfd {
Simon Kelley74d4fcd2021-03-15 21:59:51 +0000555 struct server *serv;
Simon Kelley1a6bca82008-07-11 11:11:42 +0100556 int fd;
Simon Kelley74d4fcd2021-03-15 21:59:51 +0000557 unsigned short refcount; /* refcount == 0xffff means overflow record. */
Simon Kelley1a6bca82008-07-11 11:11:42 +0100558};
Simon Kelley74d4fcd2021-03-15 21:59:51 +0000559
560struct randfd_list {
561 struct randfd *rfd;
562 struct randfd_list *next;
563};
564
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000565struct server {
566 union mysockaddr addr, source_addr;
Simon Kelley824af852008-02-12 20:43:05 +0000567 char interface[IF_NAMESIZE+1];
Simon Kelley74d4fcd2021-03-15 21:59:51 +0000568 unsigned int ifindex; /* corresponding to interface, above */
Simon Kelley16972692006-10-16 20:04:18 +0100569 struct serverfd *sfd;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000570 char *domain; /* set if this server only handles a domain. */
Simon Kelleya77cec82015-05-08 16:25:38 +0100571 int flags, tcpfd, edns_pktsz;
Simon Kelleyc1a4e252018-01-19 22:00:05 +0000572 time_t pktsz_reduced;
Simon Kelley824af852008-02-12 20:43:05 +0000573 unsigned int queries, failed_queries;
Simon Kelleyb5ea1cc2014-07-29 16:34:14 +0100574#ifdef HAVE_LOOP
575 u32 uid;
576#endif
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000577 struct server *next;
578};
579
Jason A. Donenfeld13d86c72013-02-22 18:20:53 +0000580struct ipsets {
581 char **sets;
582 char *domain;
583 struct ipsets *next;
584};
585
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000586struct irec {
587 union mysockaddr addr;
Simon Kelleyf6b7dc42005-01-23 12:06:08 +0000588 struct in_addr netmask; /* only valid for IPv4 */
Petr Menšíkad59f272017-03-17 17:22:19 +0000589 int tftp_ok, dhcp_ok, mtu, done, warned, dad, dns_auth, index, multicast_done, found, label;
Simon Kelley5d162f22012-12-20 14:55:46 +0000590 char *name;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000591 struct irec *next;
592};
593
Simon Kelley44a2a312004-03-10 20:04:35 +0000594struct listener {
Petr Menšík1c1b9252019-07-15 17:16:44 +0200595 int fd, tcpfd, tftpfd, used;
Petr Menšík49bdf1e2019-07-15 17:13:12 +0200596 union mysockaddr addr;
Simon Kelley52d4abf2012-03-21 21:39:48 +0000597 struct irec *iface; /* only sometimes valid for non-wildcard */
Simon Kelley44a2a312004-03-10 20:04:35 +0000598 struct listener *next;
599};
600
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000601/* interface and address parms from command line. */
602struct iname {
603 char *name;
604 union mysockaddr addr;
Simon Kelley4ce4f372012-06-14 11:50:45 +0100605 int used;
Tarun Kundu024baf12022-06-28 10:56:47 -0700606 bool is_ra_adv_dis;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000607 struct iname *next;
608};
609
Ed Bardsleya7369be2015-08-05 21:17:18 +0100610/* subnet parameters from command line */
611struct mysubnet {
612 union mysockaddr addr;
613 int addr_used;
614 int mask;
615};
616
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000617/* resolv-file parms from command-line */
618struct resolvc {
619 struct resolvc *next;
Simon Kelley3d8df262005-08-29 12:19:27 +0100620 int is_default, logged;
621 time_t mtime;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000622 char *name;
Simon Kelley04918052015-01-26 11:23:43 +0000623#ifdef HAVE_INOTIFY
Simon Kelley193de4a2014-12-10 17:32:16 +0000624 int wd; /* inotify watch descriptor */
625 char *file; /* pointer to file part if path */
626#endif
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000627};
628
Simon Kelley5f4dc5c2015-01-20 20:51:02 +0000629/* adn-hosts parms from command-line (also dhcp-hostsfile and dhcp-optsfile and dhcp-hostsdir*/
Simon Kelley7622fc02009-06-04 20:32:05 +0100630#define AH_DIR 1
631#define AH_INACTIVE 2
Simon Kelley5f4dc5c2015-01-20 20:51:02 +0000632#define AH_WD_DONE 4
Simon Kelley70d18732015-01-31 19:59:29 +0000633#define AH_HOSTS 8
634#define AH_DHCP_HST 16
635#define AH_DHCP_OPT 32
Simon Kelleyfd9fa482004-10-21 20:24:00 +0100636struct hostsfile {
637 struct hostsfile *next;
Simon Kelley7622fc02009-06-04 20:32:05 +0100638 int flags;
Simon Kelleyfd9fa482004-10-21 20:24:00 +0100639 char *fname;
Simon Kelley04918052015-01-26 11:23:43 +0000640#ifdef HAVE_INOTIFY
Simon Kelley5f4dc5c2015-01-20 20:51:02 +0000641 int wd; /* inotify watch descriptor */
642#endif
Simon Kelley19c51cf2014-03-18 22:38:30 +0000643 unsigned int index; /* matches to cache entries for logging */
Simon Kelleyfd9fa482004-10-21 20:24:00 +0100644};
645
Simon Kelley6b173352018-05-08 18:32:14 +0100646/* packet-dump flags */
647#define DUMP_QUERY 0x0001
648#define DUMP_REPLY 0x0002
649#define DUMP_UP_QUERY 0x0004
650#define DUMP_UP_REPLY 0x0008
651#define DUMP_SEC_QUERY 0x0010
652#define DUMP_SEC_REPLY 0x0020
653#define DUMP_BOGUS 0x0040
654#define DUMP_SEC_BOGUS 0x0080
655
Simon Kelley3a237152013-12-12 12:15:50 +0000656
657/* DNSSEC status values. */
658#define STAT_SECURE 1
659#define STAT_INSECURE 2
660#define STAT_BOGUS 3
661#define STAT_NEED_DS 4
662#define STAT_NEED_KEY 5
Simon Kelley5d3b87a2014-01-20 11:57:23 +0000663#define STAT_TRUNCATED 6
Simon Kelley5107ace2014-02-23 10:48:32 +0000664#define STAT_SECURE_WILDCARD 7
Simon Kelley9a31b682015-12-15 10:20:39 +0000665#define STAT_OK 8
666#define STAT_ABANDONED 9
Simon Kelley3a237152013-12-12 12:15:50 +0000667
Simon Kelley28866e92011-02-14 20:19:14 +0000668#define FREC_NOREBIND 1
669#define FREC_CHECKING_DISABLED 2
Simon Kelleyed4c0762013-10-08 20:46:34 +0100670#define FREC_HAS_SUBNET 4
Simon Kelley9d633042013-12-13 15:36:55 +0000671#define FREC_DNSKEY_QUERY 8
672#define FREC_DS_QUERY 16
Simon Kelley83349b82014-02-10 21:02:01 +0000673#define FREC_AD_QUESTION 32
Simon Kelley613ad152014-02-25 23:02:28 +0000674#define FREC_DO_QUESTION 64
675#define FREC_ADDED_PHEADER 128
Simon Kelley9a31b682015-12-15 10:20:39 +0000676#define FREC_TEST_PKTSZ 256
Simon Kelley15b60dd2020-11-18 18:34:55 +0000677#define FREC_HAS_EXTRADATA 512
678#define FREC_HAS_PHEADER 1024
Simon Kelley25e63f12020-11-25 21:17:52 +0000679#define FREC_NO_CACHE 2048
Simon Kelley28866e92011-02-14 20:19:14 +0000680
Simon Kelley2d765862020-11-12 22:06:07 +0000681#define HASH_SIZE 32 /* SHA-256 digest size */
Simon Kelley8a9be9e2014-01-25 23:17:21 +0000682
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000683struct frec {
Simon Kelley15b60dd2020-11-18 18:34:55 +0000684 struct frec_src {
685 union mysockaddr source;
686 union all_addr dest;
687 unsigned int iface, log_id;
Simon Kelley04490bf2021-01-22 16:49:12 +0000688 int fd;
Simon Kelley15b60dd2020-11-18 18:34:55 +0000689 unsigned short orig_id;
690 struct frec_src *next;
691 } frec_src;
Simon Kelley832af0b2007-01-21 20:01:28 +0000692 struct server *sentto; /* NULL means free */
Simon Kelley74d4fcd2021-03-15 21:59:51 +0000693 struct randfd_list *rfds;
Simon Kelley15b60dd2020-11-18 18:34:55 +0000694 unsigned short new_id;
Simon Kelley04490bf2021-01-22 16:49:12 +0000695 int forwardall, flags;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000696 time_t time;
Simon Kelley8a9be9e2014-01-25 23:17:21 +0000697 unsigned char *hash[HASH_SIZE];
698#ifdef HAVE_DNSSEC
Simon Kelley7fa836e2014-02-10 20:11:24 +0000699 int class, work_counter;
Simon Kelley3a237152013-12-12 12:15:50 +0000700 struct blockdata *stash; /* Saved reply, whilst we validate */
Simon Kelley9a31b682015-12-15 10:20:39 +0000701 size_t stash_len;
Simon Kelley3a237152013-12-12 12:15:50 +0000702 struct frec *dependent; /* Query awaiting internally-generated DNSKEY or DS query */
703 struct frec *blocking_query; /* Query which is blocking us. */
704#endif
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000705 struct frec *next;
706};
707
Simon Kelley40ef23b2012-03-13 21:59:28 +0000708/* flags in top of length field for DHCP-option tables */
709#define OT_ADDR_LIST 0x8000
710#define OT_RFC1035_NAME 0x4000
711#define OT_INTERNAL 0x2000
712#define OT_NAME 0x1000
713#define OT_CSTRING 0x0800
714#define OT_DEC 0x0400
Simon Kelley23245c02012-07-18 16:21:11 +0100715#define OT_TIME 0x0200
Simon Kelley40ef23b2012-03-13 21:59:28 +0000716
Simon Kelley16972692006-10-16 20:04:18 +0100717/* actions in the daemon->helper RPC */
718#define ACTION_DEL 1
719#define ACTION_OLD_HOSTNAME 2
720#define ACTION_OLD 3
721#define ACTION_ADD 4
Simon Kelleya9530962012-03-20 22:07:35 +0000722#define ACTION_TFTP 5
Simon Kelley33702ab2015-12-28 23:17:15 +0000723#define ACTION_ARP 6
Simon Kelleye6e751b2016-02-01 17:59:07 +0000724#define ACTION_ARP_DEL 7
Simon Kelley16972692006-10-16 20:04:18 +0100725
Simon Kelley4cb1b322012-02-06 14:30:41 +0000726#define LEASE_NEW 1 /* newly created */
727#define LEASE_CHANGED 2 /* modified */
728#define LEASE_AUX_CHANGED 4 /* CLID or expiry changed */
729#define LEASE_AUTH_NAME 8 /* hostname came from config, not from client */
730#define LEASE_USED 16 /* used this DHCPv6 transaction */
731#define LEASE_NA 32 /* IPv6 no-temporary lease */
732#define LEASE_TA 64 /* IPv6 temporary lease */
Simon Kelley353ae4d2012-03-19 20:07:51 +0000733#define LEASE_HAVE_HWADDR 128 /* Have set hwaddress */
Simon Kelleyee645822020-02-27 16:34:14 +0000734#define LEASE_EXP_CHANGED 256 /* Lease expiry time changed */
Simon Kelley4cb1b322012-02-06 14:30:41 +0000735
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000736struct dhcp_lease {
737 int clid_len; /* length of client identifier */
738 unsigned char *clid; /* clientid */
739 char *hostname, *fqdn; /* name from client-hostname option or config */
Simon Kelley16972692006-10-16 20:04:18 +0100740 char *old_hostname; /* hostname before it moved to another lease */
Simon Kelley4cb1b322012-02-06 14:30:41 +0000741 int flags;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000742 time_t expires; /* lease expiry */
Simon Kelley5e9e0ef2006-04-17 14:24:29 +0100743#ifdef HAVE_BROKEN_RTC
744 unsigned int length;
745#endif
Simon Kelley89500e32013-09-20 16:29:20 +0100746 int hwaddr_len, hwaddr_type;
747 unsigned char hwaddr[DHCP_CHADDR_MAX];
Simon Kelley1f15b812009-10-13 17:49:32 +0100748 struct in_addr addr, override, giaddr;
Simon Kelley316e2732010-01-22 20:16:09 +0000749 unsigned char *extradata;
750 unsigned int extradata_len, extradata_size;
Simon Kelley824af852008-02-12 20:43:05 +0000751 int last_interface;
Lung-Pin Changdc8a1b12014-07-02 10:48:05 +0800752 int new_interface; /* save possible originated interface */
753 int new_prefixlen; /* and its prefix length */
Simon Kelley353ae4d2012-03-19 20:07:51 +0000754#ifdef HAVE_DHCP6
Simon Kelley89500e32013-09-20 16:29:20 +0100755 struct in6_addr addr6;
Dominik DL6ER456a3192019-10-20 18:51:52 +0200756 unsigned int iaid;
Simon Kelley353ae4d2012-03-19 20:07:51 +0000757 struct slaac_address {
Simon Kelley875b8162013-12-17 17:40:32 +0000758 struct in6_addr addr;
Simon Kelley353ae4d2012-03-19 20:07:51 +0000759 time_t ping_time;
760 int backoff; /* zero -> confirmed */
761 struct slaac_address *next;
762 } *slaac_address;
Simon Kelley6f9aaa92013-04-10 10:25:26 +0100763 int vendorclass_count;
Simon Kelley353ae4d2012-03-19 20:07:51 +0000764#endif
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000765 struct dhcp_lease *next;
766};
767
Simon Kelleya2226412004-05-13 20:27:08 +0100768struct dhcp_netid {
769 char *net;
770 struct dhcp_netid *next;
771};
772
Simon Kelley26128d22004-11-14 16:43:54 +0000773struct dhcp_netid_list {
774 struct dhcp_netid *list;
775 struct dhcp_netid_list *next;
776};
Simon Kelley16972692006-10-16 20:04:18 +0100777
Simon Kelley8ef5ada2010-06-03 19:42:45 +0100778struct tag_if {
779 struct dhcp_netid_list *set;
780 struct dhcp_netid *tag;
781 struct tag_if *next;
782};
783
Floris Bos503c6092017-04-09 23:07:13 +0100784struct delay_config {
785 int delay;
786 struct dhcp_netid *netid;
787 struct delay_config *next;
788};
789
Simon Kelley9009d742008-11-14 20:04:27 +0000790struct hwaddr_config {
791 int hwaddr_len, hwaddr_type;
792 unsigned char hwaddr[DHCP_CHADDR_MAX];
793 unsigned int wildcard_mask;
794 struct hwaddr_config *next;
795};
796
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000797struct dhcp_config {
Simon Kelley33820b72004-04-03 21:10:00 +0100798 unsigned int flags;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000799 int clid_len; /* length of client identifier */
800 unsigned char *clid; /* clientid */
Simon Kelley9009d742008-11-14 20:04:27 +0000801 char *hostname, *domain;
Simon Kelley8ef5ada2010-06-03 19:42:45 +0100802 struct dhcp_netid_list *netid;
Simon Kelley52ec7832020-02-07 21:05:54 +0000803 struct dhcp_netid *filter;
Simon Kelley52b92f42012-01-22 16:05:15 +0000804#ifdef HAVE_DHCP6
Simon Kelley137286e2020-02-06 22:09:30 +0000805 struct addrlist *addr6;
Simon Kelley52b92f42012-01-22 16:05:15 +0000806#endif
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000807 struct in_addr addr;
Simon Kelley849a8352006-06-09 21:02:31 +0100808 time_t decline_time;
Simon Kelley9009d742008-11-14 20:04:27 +0000809 unsigned int lease_time;
810 struct hwaddr_config *hwaddr;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000811 struct dhcp_config *next;
812};
813
Simon Kelley4cb1b322012-02-06 14:30:41 +0000814#define have_config(config, mask) ((config) && ((config)->flags & (mask)))
815
Simon Kelley0a852542005-03-23 20:28:59 +0000816#define CONFIG_DISABLE 1
817#define CONFIG_CLID 2
Simon Kelley0a852542005-03-23 20:28:59 +0000818#define CONFIG_TIME 8
819#define CONFIG_NAME 16
820#define CONFIG_ADDR 32
Simon Kelley0a852542005-03-23 20:28:59 +0000821#define CONFIG_NOCLID 128
Simon Kelley849a8352006-06-09 21:02:31 +0100822#define CONFIG_FROM_ETHERS 256 /* entry created by /etc/ethers */
823#define CONFIG_ADDR_HOSTS 512 /* address added by from /etc/hosts */
824#define CONFIG_DECLINED 1024 /* address declined by client */
Simon Kelley5aabfc72007-08-29 11:24:47 +0100825#define CONFIG_BANK 2048 /* from dhcp hosts file */
Simon Kelley52b92f42012-01-22 16:05:15 +0000826#define CONFIG_ADDR6 4096
Steven Siloti18eac672019-01-13 22:56:36 +0000827#define CONFIG_ADDR6_HOSTS 16384 /* address added by from /etc/hosts */
Simon Kelley33820b72004-04-03 21:10:00 +0100828
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000829struct dhcp_opt {
Simon Kelleycdeda282006-03-16 20:16:06 +0000830 int opt, len, flags;
Simon Kelley73a08a22009-02-05 20:28:08 +0000831 union {
832 int encap;
833 unsigned int wildcard_mask;
834 unsigned char *vendor_class;
835 } u;
836 unsigned char *val;
Simon Kelley26128d22004-11-14 16:43:54 +0000837 struct dhcp_netid *netid;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000838 struct dhcp_opt *next;
Simon Kelleya84fa1d2004-04-23 22:21:21 +0100839};
840
Kyle Swenson545712c2021-11-17 12:25:04 -0700841/* CRADLEPOINT */
842struct ssid_device_id_map {
843 unsigned char *map;
844 size_t map_size;
845};
846/* CRADLEPOINT */
847
Simon Kelleycdeda282006-03-16 20:16:06 +0000848#define DHOPT_ADDR 1
849#define DHOPT_STRING 2
Simon Kelley6b010842007-02-12 20:32:07 +0000850#define DHOPT_ENCAPSULATE 4
Simon Kelley73a08a22009-02-05 20:28:08 +0000851#define DHOPT_ENCAP_MATCH 8
Simon Kelley6b010842007-02-12 20:32:07 +0000852#define DHOPT_FORCE 16
Simon Kelley824af852008-02-12 20:43:05 +0000853#define DHOPT_BANK 32
Simon Kelley73a08a22009-02-05 20:28:08 +0000854#define DHOPT_ENCAP_DONE 64
855#define DHOPT_MATCH 128
856#define DHOPT_VENDOR 256
857#define DHOPT_HEX 512
Simon Kelley7622fc02009-06-04 20:32:05 +0100858#define DHOPT_VENDOR_MATCH 1024
Simon Kelley316e2732010-01-22 20:16:09 +0000859#define DHOPT_RFC3925 2048
Simon Kelley7de060b2011-08-26 17:24:52 +0100860#define DHOPT_TAGOK 4096
Simon Kelley4cb1b322012-02-06 14:30:41 +0000861#define DHOPT_ADDR6 8192
Wang Shanker4ded9622020-12-04 10:17:35 +0800862#define DHOPT_VENDOR_PXE 16384
Simon Kelleycdeda282006-03-16 20:16:06 +0000863
Simon Kelley26128d22004-11-14 16:43:54 +0000864struct dhcp_boot {
Simon Kelley7de060b2011-08-26 17:24:52 +0100865 char *file, *sname, *tftp_sname;
Simon Kelley26128d22004-11-14 16:43:54 +0000866 struct in_addr next_server;
867 struct dhcp_netid *netid;
868 struct dhcp_boot *next;
869};
870
Simon Kelleyc8226202018-08-08 23:46:03 +0100871struct dhcp_match_name {
872 char *name;
873 int wildcard;
874 struct dhcp_netid *netid;
875 struct dhcp_match_name *next;
876};
877
Simon Kelley7622fc02009-06-04 20:32:05 +0100878struct pxe_service {
879 unsigned short CSA, type;
Simon Kelley751d6f42012-02-10 15:24:51 +0000880 char *menu, *basename, *sname;
Simon Kelley7622fc02009-06-04 20:32:05 +0100881 struct in_addr server;
882 struct dhcp_netid *netid;
883 struct pxe_service *next;
884};
885
Wang Shanker4ded9622020-12-04 10:17:35 +0800886#define DHCP_PXE_DEF_VENDOR "PXEClient"
887
Simon Kelleyf2621c72007-04-29 19:47:21 +0100888#define MATCH_VENDOR 1
889#define MATCH_USER 2
890#define MATCH_CIRCUIT 3
891#define MATCH_REMOTE 4
892#define MATCH_SUBSCRIBER 5
893
Josh Soref730c6742017-02-06 16:14:04 +0000894/* vendorclass, userclass, remote-id or circuit-id */
Simon Kelleya84fa1d2004-04-23 22:21:21 +0100895struct dhcp_vendor {
Simon Kelleya5c72ab2012-02-10 13:42:47 +0000896 int len, match_type;
897 unsigned int enterprise;
Simon Kelleya2226412004-05-13 20:27:08 +0100898 char *data;
899 struct dhcp_netid netid;
Simon Kelleya84fa1d2004-04-23 22:21:21 +0100900 struct dhcp_vendor *next;
901};
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000902
Wang Shanker4ded9622020-12-04 10:17:35 +0800903struct dhcp_pxe_vendor {
904 char *data;
905 struct dhcp_pxe_vendor *next;
906};
907
Simon Kelleycdeda282006-03-16 20:16:06 +0000908struct dhcp_mac {
909 unsigned int mask;
910 int hwaddr_len, hwaddr_type;
911 unsigned char hwaddr[DHCP_CHADDR_MAX];
912 struct dhcp_netid netid;
913 struct dhcp_mac *next;
914};
915
Simon Kelley832af0b2007-01-21 20:01:28 +0000916struct dhcp_bridge {
917 char iface[IF_NAMESIZE];
918 struct dhcp_bridge *alias, *next;
919};
Simon Kelley832af0b2007-01-21 20:01:28 +0000920
Simon Kelley9009d742008-11-14 20:04:27 +0000921struct cond_domain {
Simon Kelley48fd1c42013-04-25 09:49:38 +0100922 char *domain, *prefix;
Simon Kelley9009d742008-11-14 20:04:27 +0000923 struct in_addr start, end;
Simon Kelleyd74942a2012-02-07 20:51:56 +0000924 struct in6_addr start6, end6;
Simon Kelley6b2b5642018-03-10 18:12:04 +0000925 int is6, indexed;
Simon Kelley9009d742008-11-14 20:04:27 +0000926 struct cond_domain *next;
Simon Kelley1f776932012-12-16 19:46:08 +0000927};
Simon Kelley9009d742008-11-14 20:04:27 +0000928
Simon Kelleyc4cd95d2013-10-10 20:58:11 +0100929struct ra_interface {
930 char *name;
Vladislav Grishenko6ec5f5c2017-04-24 22:34:45 +0100931 char *mtu_name;
David Flamand005c46d2017-04-11 11:49:54 +0100932 int interval, lifetime, prio, mtu;
Tarun Kundu41aa4882022-07-05 10:44:13 -0700933 unsigned int reachable_time, retrans_time;
Tarun Kundu024baf12022-06-28 10:56:47 -0700934 unsigned char hop_limit;
Simon Kelleyc4cd95d2013-10-10 20:58:11 +0100935 struct ra_interface *next;
936};
937
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000938struct dhcp_context {
Simon Kelleyfeba5c12004-07-27 20:28:58 +0100939 unsigned int lease_time, addr_epoch;
Simon Kelley0a852542005-03-23 20:28:59 +0000940 struct in_addr netmask, broadcast;
941 struct in_addr local, router;
Simon Kelleya84fa1d2004-04-23 22:21:21 +0100942 struct in_addr start, end; /* range of available addresses */
Simon Kelleyc72daea2012-01-05 21:33:27 +0000943#ifdef HAVE_DHCP6
944 struct in6_addr start6, end6; /* range of available addresses */
Simon Kelleye44ddca2012-02-18 17:08:50 +0000945 struct in6_addr local6;
Simon Kelley353ae4d2012-03-19 20:07:51 +0000946 int prefix, if_index;
Kyle Swenson9d238072021-12-01 08:13:17 -0700947 unsigned int valid, preferred, saved_valid, valid_lifetime;
Simon Kelleyef1a94a2013-07-26 13:59:03 +0100948 time_t ra_time, ra_short_period_start, address_lost_time;
Simon Kelley1f776932012-12-16 19:46:08 +0000949 char *template_interface;
Simon Kelleyc72daea2012-01-05 21:33:27 +0000950#endif
Simon Kelley0a852542005-03-23 20:28:59 +0000951 int flags;
Kyle Swenson545712c2021-11-17 12:25:04 -0700952 /* CRADLEPOINT */
953 char *forcedinterface;
954 struct in_addr forcedaddress;
955 /* CRADLEPOINT */
Simon Kelleycdeda282006-03-16 20:16:06 +0000956 struct dhcp_netid netid, *filter;
Simon Kelley36717ee2004-09-20 19:20:58 +0100957 struct dhcp_context *next, *current;
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000958};
959
Simon Kelleyae5b7e02019-03-27 22:33:28 +0000960struct shared_network {
961 int if_index;
962 struct in_addr match_addr, shared_addr;
963#ifdef HAVE_DHCP6
964 /* shared_addr == 0 for IP6 entries. */
965 struct in6_addr match_addr6, shared_addr6;
966#endif
967 struct shared_network *next;
968};
969
Simon Kelley89500e32013-09-20 16:29:20 +0100970#define CONTEXT_STATIC (1u<<0)
971#define CONTEXT_NETMASK (1u<<1)
972#define CONTEXT_BRDCAST (1u<<2)
973#define CONTEXT_PROXY (1u<<3)
Simon Kelley7ea3d3f2014-04-25 22:04:05 +0100974#define CONTEXT_RA_ROUTER (1u<<4)
Simon Kelley89500e32013-09-20 16:29:20 +0100975#define CONTEXT_RA_DONE (1u<<5)
976#define CONTEXT_RA_NAME (1u<<6)
977#define CONTEXT_RA_STATELESS (1u<<7)
978#define CONTEXT_DHCP (1u<<8)
979#define CONTEXT_DEPRECATE (1u<<9)
980#define CONTEXT_TEMPLATE (1u<<10) /* create contexts using addresses */
981#define CONTEXT_CONSTRUCTED (1u<<11)
982#define CONTEXT_GC (1u<<12)
983#define CONTEXT_RA (1u<<13)
984#define CONTEXT_CONF_USED (1u<<14)
985#define CONTEXT_USED (1u<<15)
Simon Kelley376d48c2013-11-13 13:04:30 +0000986#define CONTEXT_OLD (1u<<16)
987#define CONTEXT_V6 (1u<<17)
Neil Jerram2fd5bc92015-06-10 22:13:06 +0100988#define CONTEXT_RA_OFF_LINK (1u<<18)
Simon Kelley4d85e402020-07-12 22:45:46 +0100989#define CONTEXT_SETLEASE (1u<<19)
Kyle Swenson9d238072021-12-01 08:13:17 -0700990#define CONTEXT_SETVALID (1u<<20)
Simon Kelleyef1a94a2013-07-26 13:59:03 +0100991
Simon Kelley3d8df262005-08-29 12:19:27 +0100992struct ping_result {
993 struct in_addr addr;
994 time_t time;
Simon Kelley7de060b2011-08-26 17:24:52 +0100995 unsigned int hash;
Simon Kelley3d8df262005-08-29 12:19:27 +0100996 struct ping_result *next;
997};
Simon Kelley9e4abcb2004-01-22 19:47:41 +0000998
Simon Kelley832af0b2007-01-21 20:01:28 +0000999struct tftp_file {
1000 int refcount, fd;
1001 off_t size;
Simon Kelley5aabfc72007-08-29 11:24:47 +01001002 dev_t dev;
1003 ino_t inode;
Simon Kelley832af0b2007-01-21 20:01:28 +00001004 char filename[];
1005};
1006
1007struct tftp_transfer {
1008 int sockfd;
1009 time_t timeout;
1010 int backoff;
Simon Kelley9e038942008-05-30 20:06:34 +01001011 unsigned int block, blocksize, expansion;
1012 off_t offset;
Simon Kelley28866e92011-02-14 20:19:14 +00001013 union mysockaddr peer;
Simon Kelley66f62652020-01-05 16:21:24 +00001014 union all_addr source;
1015 int if_index;
Simon Kelley9e038942008-05-30 20:06:34 +01001016 char opt_blocksize, opt_transize, netascii, carrylf;
Simon Kelley832af0b2007-01-21 20:01:28 +00001017 struct tftp_file *file;
1018 struct tftp_transfer *next;
1019};
1020
Simon Kelley8ef5ada2010-06-03 19:42:45 +01001021struct addr_list {
1022 struct in_addr addr;
1023 struct addr_list *next;
1024};
1025
Simon Kelley8ef5ada2010-06-03 19:42:45 +01001026struct tftp_prefix {
1027 char *interface;
1028 char *prefix;
Stefan Tomanek30d08792015-03-31 22:32:11 +01001029 int missing;
Simon Kelley8ef5ada2010-06-03 19:42:45 +01001030 struct tftp_prefix *next;
1031};
1032
Simon Kelleyff7eea22013-09-04 18:01:38 +01001033struct dhcp_relay {
Simon Kelleycc921df2019-01-02 22:48:59 +00001034 union all_addr local, server;
Simon Kelleyff7eea22013-09-04 18:01:38 +01001035 char *interface; /* Allowable interface for replies from server, and dest for IPv6 multicast */
1036 int iface_index; /* working - interface in which requests arrived, for return */
1037 struct dhcp_relay *current, *next;
1038};
Simon Kelley8ef5ada2010-06-03 19:42:45 +01001039
Simon Kelley5aabfc72007-08-29 11:24:47 +01001040extern struct daemon {
Simon Kelley3be34542004-09-11 19:12:13 +01001041 /* datastuctures representing the command-line and
1042 config file arguments. All set (including defaults)
1043 in option.c */
1044
Petr Menšík24b87602018-10-24 22:30:18 +01001045 unsigned int options[OPTION_SIZE];
Simon Kelley3be34542004-09-11 19:12:13 +01001046 struct resolvc default_resolv, *resolv_files;
Simon Kelley9009d742008-11-14 20:04:27 +00001047 time_t last_resolv;
Simon Kelley7b1eae42014-02-20 13:43:28 +00001048 char *servers_file;
Simon Kelley0a852542005-03-23 20:28:59 +00001049 struct mx_srv_record *mxnames;
Simon Kelley1a6bca82008-07-11 11:11:42 +01001050 struct naptr *naptr;
Simon Kelley9f7f3b12012-05-28 21:39:57 +01001051 struct txt_record *txt, *rr;
Simon Kelley832af0b2007-01-21 20:01:28 +00001052 struct ptr_record *ptr;
Simon Kelleye759d422012-03-16 13:18:57 +00001053 struct host_record *host_records, *host_records_tail;
Simon Kelley9009d742008-11-14 20:04:27 +00001054 struct cname *cnames;
Simon Kelley4f7b3042012-11-28 21:27:02 +00001055 struct auth_zone *auth_zones;
Simon Kelleyf2621c72007-04-29 19:47:21 +01001056 struct interface_name *int_names;
Simon Kelley3be34542004-09-11 19:12:13 +01001057 char *mxtarget;
Ed Bardsleya7369be2015-08-05 21:17:18 +01001058 struct mysubnet *add_subnet4;
1059 struct mysubnet *add_subnet6;
1060 char *lease_file;
Simon Kelley9e038942008-05-30 20:06:34 +01001061 char *username, *groupname, *scriptuser;
Simon Kelleyc72daea2012-01-05 21:33:27 +00001062 char *luascript;
Simon Kelley429798f2012-12-10 20:45:53 +00001063 char *authserver, *hostmaster;
1064 struct iname *authinterface;
Simon Kelleye1ff4192012-12-09 17:08:47 +00001065 struct name_list *secondary_forward_server;
Simon Kelley1a6bca82008-07-11 11:11:42 +01001066 int group_set, osport;
Simon Kelley3be34542004-09-11 19:12:13 +01001067 char *domain_suffix;
Simon Kelley2bb73af2013-04-24 17:38:19 +01001068 struct cond_domain *cond_domain, *synth_domains;
Simon Kelley3be34542004-09-11 19:12:13 +01001069 char *runfile;
Simon Kelley7cebd202006-05-06 14:13:33 +01001070 char *lease_change_command;
Tarun Kundu024baf12022-06-28 10:56:47 -07001071 struct iname *if_names, *if_addrs, *if_except, *dhcp_except, *auth_peers, *tftp_interfaces, *ra_adv_if_names;
Glen Huang32fc6db2014-12-27 15:28:12 +00001072 struct bogus_addr *bogus_addr, *ignore_addr;
Simon Kelley3be34542004-09-11 19:12:13 +01001073 struct server *servers;
Jason A. Donenfeld13d86c72013-02-22 18:20:53 +00001074 struct ipsets *ipsets;
Simon Kelley849a8352006-06-09 21:02:31 +01001075 int log_fac; /* log facility */
Simon Kelleyf2621c72007-04-29 19:47:21 +01001076 char *log_file; /* optional log file */
1077 int max_logs; /* queue limit */
Simon Kelley208b65c2006-08-05 21:41:37 +01001078 int cachesize, ftabsize;
Hans Dedecker926332a2016-01-23 10:48:12 +00001079 int port, query_port, min_port, max_port;
Simon Kelley832e47b2016-02-24 21:24:45 +00001080 unsigned long local_ttl, neg_ttl, max_ttl, min_cache_ttl, max_cache_ttl, auth_ttl, dhcp_ttl, use_dhcp_ttl;
Simon Kelley33702ab2015-12-28 23:17:15 +00001081 char *dns_client_id;
Simon Kelleyfd9fa482004-10-21 20:24:00 +01001082 struct hostsfile *addn_hosts;
Simon Kelley1f776932012-12-16 19:46:08 +00001083 struct dhcp_context *dhcp, *dhcp6;
Simon Kelleyc4cd95d2013-10-10 20:58:11 +01001084 struct ra_interface *ra_interfaces;
Simon Kelley3be34542004-09-11 19:12:13 +01001085 struct dhcp_config *dhcp_conf;
Simon Kelley3634c542012-02-08 14:22:37 +00001086 struct dhcp_opt *dhcp_opts, *dhcp_match, *dhcp_opts6, *dhcp_match6;
Simon Kelleyc8226202018-08-08 23:46:03 +01001087 struct dhcp_match_name *dhcp_name_match;
Wang Shanker4ded9622020-12-04 10:17:35 +08001088 struct dhcp_pxe_vendor *dhcp_pxe_vendors;
Simon Kelley3be34542004-09-11 19:12:13 +01001089 struct dhcp_vendor *dhcp_vendors;
Simon Kelleycdeda282006-03-16 20:16:06 +00001090 struct dhcp_mac *dhcp_macs;
Simon Kelley26128d22004-11-14 16:43:54 +00001091 struct dhcp_boot *boot_config;
Simon Kelley7622fc02009-06-04 20:32:05 +01001092 struct pxe_service *pxe_services;
Simon Kelley8ef5ada2010-06-03 19:42:45 +01001093 struct tag_if *tag_if;
1094 struct addr_list *override_relays;
Simon Kelleyff7eea22013-09-04 18:01:38 +01001095 struct dhcp_relay *relay4, *relay6;
Floris Bos503c6092017-04-09 23:07:13 +01001096 struct delay_config *delay_conf;
Simon Kelley8ef5ada2010-06-03 19:42:45 +01001097 int override;
Simon Kelley1f15b812009-10-13 17:49:32 +01001098 int enable_pxe;
Simon Kelley1f776932012-12-16 19:46:08 +00001099 int doing_ra, doing_dhcp6;
Simon Kelley8ef5ada2010-06-03 19:42:45 +01001100 struct dhcp_netid_list *dhcp_ignore, *dhcp_ignore_names, *dhcp_gen_names;
1101 struct dhcp_netid_list *force_broadcast, *bootp_dynamic;
Simon Kelley70d18732015-01-31 19:59:29 +00001102 struct hostsfile *dhcp_hosts_file, *dhcp_opts_file, *dynamic_dirs;
Simon Kelleybec366b2016-02-24 22:03:26 +00001103 int dhcp_max, tftp_max, tftp_mtu;
Simon Kelley9e038942008-05-30 20:06:34 +01001104 int dhcp_server_port, dhcp_client_port;
Simon Kelley824af852008-02-12 20:43:05 +00001105 int start_tftp_port, end_tftp_port;
Simon Kelley3be34542004-09-11 19:12:13 +01001106 unsigned int min_leasetime;
1107 struct doctor *doctors;
1108 unsigned short edns_pktsz;
Simon Kelley824af852008-02-12 20:43:05 +00001109 char *tftp_prefix;
Simon Kelley8ef5ada2010-06-03 19:42:45 +01001110 struct tftp_prefix *if_prefix; /* per-interface TFTP prefixes */
Simon Kelley8b372702012-03-09 17:45:10 +00001111 unsigned int duid_enterprise, duid_config_len;
1112 unsigned char *duid_config;
Simon Kelleyad094272012-08-10 17:10:54 +01001113 char *dbus_name;
Oldřich Jedličkad162bee2020-03-20 22:18:57 +01001114 char *ubus_name;
Simon Kelley6b173352018-05-08 18:32:14 +01001115 char *dump_file;
1116 int dump_mask;
Simon Kelley4f7b3042012-11-28 21:27:02 +00001117 unsigned long soa_sn, soa_refresh, soa_retry, soa_expiry;
Julian Kornbergeraba8bbb2018-07-21 21:55:08 +01001118 u32 metrics[__METRIC_MAX];
Simon Kelley0fc2f312014-01-08 10:26:58 +00001119#ifdef HAVE_DNSSEC
Simon Kelleyee415862014-02-11 11:07:22 +00001120 struct ds_config *ds;
Simon Kelleyf6e62e22015-03-01 18:17:54 +00001121 char *timestamp_file;
Simon Kelley0fc2f312014-01-08 10:26:58 +00001122#endif
Simon Kelley3be34542004-09-11 19:12:13 +01001123
1124 /* globally used stuff for DNS */
1125 char *packet; /* packet buffer */
Simon Kelley0a852542005-03-23 20:28:59 +00001126 int packet_buff_sz; /* size of above */
Simon Kelley3be34542004-09-11 19:12:13 +01001127 char *namebuff; /* MAXDNAME size buffer */
Simon Kelleyc3e0b9b2013-12-31 13:50:39 +00001128#ifdef HAVE_DNSSEC
1129 char *keyname; /* MAXDNAME size buffer */
Simon Kelley5107ace2014-02-23 10:48:32 +00001130 char *workspacename; /* ditto */
Simon Kelleyae7a3b92019-09-03 14:40:47 +01001131 unsigned long *rr_status; /* ceiling in TTL from DNSSEC or zero for insecure */
Simon Kelley373e9172017-12-01 22:40:56 +00001132 int rr_status_sz;
Simon Kelley6b173352018-05-08 18:32:14 +01001133 int dnssec_no_time_check;
1134 int back_to_the_future;
Simon Kelleyc3e0b9b2013-12-31 13:50:39 +00001135#endif
Simon Kelley1a6bca82008-07-11 11:11:42 +01001136 struct frec *frec_list;
Simon Kelley15b60dd2020-11-18 18:34:55 +00001137 struct frec_src *free_frec_src;
1138 int frec_src_count;
Simon Kelley3be34542004-09-11 19:12:13 +01001139 struct serverfd *sfds;
Simon Kelley3d8df262005-08-29 12:19:27 +01001140 struct irec *interfaces;
Simon Kelley3be34542004-09-11 19:12:13 +01001141 struct listener *listeners;
1142 struct server *last_server;
Simon Kelley1f15b812009-10-13 17:49:32 +01001143 time_t forwardtime;
1144 int forwardcount;
Simon Kelleycdeda282006-03-16 20:16:06 +00001145 struct server *srv_save; /* Used for resend on DoD */
1146 size_t packet_len; /* " " */
Simon Kelley74d4fcd2021-03-15 21:59:51 +00001147 int fd_save; /* " " */
Simon Kelley7622fc02009-06-04 20:32:05 +01001148 pid_t tcp_pids[MAX_PROCS];
Simon Kelleya799ca02018-10-18 19:35:29 +01001149 int tcp_pipes[MAX_PROCS];
1150 int pipe_to_parent;
Simon Kelleyea28d0e2021-03-26 22:02:04 +00001151 int numrrand;
1152 struct randfd *randomsocks;
Simon Kelley74d4fcd2021-03-15 21:59:51 +00001153 struct randfd_list *rfl_spare, *rfl_poll;
Simon Kelley316e2732010-01-22 20:16:09 +00001154 int v6pktinfo;
Simon Kelleyc8a80482014-03-05 14:29:54 +00001155 struct addrlist *interface_addrs; /* list of all addresses/prefix lengths associated with all local interfaces */
Simon Kelley25cf5e32015-01-09 15:53:03 +00001156 int log_id, log_display_id; /* ids of transactions for logging */
1157 union mysockaddr *log_source_addr;
Simon Kelley1a6bca82008-07-11 11:11:42 +01001158
Simon Kelley3be34542004-09-11 19:12:13 +01001159 /* DHCP state */
Simon Kelley316e2732010-01-22 20:16:09 +00001160 int dhcpfd, helperfd, pxefd;
Simon Kelley04918052015-01-26 11:23:43 +00001161#ifdef HAVE_INOTIFY
1162 int inotifyfd;
1163#endif
Simon Kelley7622fc02009-06-04 20:32:05 +01001164#if defined(HAVE_LINUX_NETWORK)
Simon Kelley0506a5e2020-03-19 21:56:45 +00001165 int netlinkfd, kernel_version;
Simon Kelley7622fc02009-06-04 20:32:05 +01001166#elif defined(HAVE_BSD_NETWORK)
Simon Kelley1ee9be42013-12-09 16:50:19 +00001167 int dhcp_raw_fd, dhcp_icmp_fd, routefd;
Simon Kelley0a852542005-03-23 20:28:59 +00001168#endif
Simon Kelley5e9e0ef2006-04-17 14:24:29 +01001169 struct iovec dhcp_packet;
Simon Kelley8ef5ada2010-06-03 19:42:45 +01001170 char *dhcp_buff, *dhcp_buff2, *dhcp_buff3;
Simon Kelley3d8df262005-08-29 12:19:27 +01001171 struct ping_result *ping_results;
Simon Kelleycdeda282006-03-16 20:16:06 +00001172 FILE *lease_stream;
Simon Kelley832af0b2007-01-21 20:01:28 +00001173 struct dhcp_bridge *bridges;
Simon Kelleyae5b7e02019-03-27 22:33:28 +00001174 struct shared_network *shared_networks;
Simon Kelleyc72daea2012-01-05 21:33:27 +00001175#ifdef HAVE_DHCP6
1176 int duid_len;
1177 unsigned char *duid;
1178 struct iovec outpacket;
Simon Kelleyc5ad4e72012-02-24 16:06:20 +00001179 int dhcp6fd, icmp6fd;
Simon Kelleyc72daea2012-01-05 21:33:27 +00001180#endif
Simon Kelley3d8df262005-08-29 12:19:27 +01001181 /* DBus stuff */
Simon Kelley3d8df262005-08-29 12:19:27 +01001182 /* void * here to avoid depending on dbus headers outside dbus.c */
1183 void *dbus;
Simon Kelley832af0b2007-01-21 20:01:28 +00001184#ifdef HAVE_DBUS
Simon Kelley3d8df262005-08-29 12:19:27 +01001185 struct watch *watches;
1186#endif
Jan Willem Janssena2b82202019-03-25 12:42:23 +01001187 /* UBus stuff */
1188#ifdef HAVE_UBUS
1189 /* void * here to avoid depending on ubus headers outside ubus.c */
1190 void *ubus;
1191#endif
Simon Kelley3d8df262005-08-29 12:19:27 +01001192
Simon Kelley832af0b2007-01-21 20:01:28 +00001193 /* TFTP stuff */
Simon Kelleya9530962012-03-20 22:07:35 +00001194 struct tftp_transfer *tftp_trans, *tftp_done_trans;
Simon Kelley824af852008-02-12 20:43:05 +00001195
Simon Kelleyc72daea2012-01-05 21:33:27 +00001196 /* utility string buffer, hold max sized IP address as string */
1197 char *addrbuff;
Simon Kelley25cf5e32015-01-09 15:53:03 +00001198 char *addrbuff2; /* only allocated when OPT_EXTRALOG */
Simon Kelleyc72daea2012-01-05 21:33:27 +00001199
Kyle Swenson545712c2021-11-17 12:25:04 -07001200/* CRADLEPOINT */
1201 /* EDNS options */
1202 unsigned char *edns_options;
1203 int edns_options_len;
1204
1205 /* ssid => network id map */
1206 struct ssid_device_id_map ssid_device_id_map;
1207/* CRADLEPOINT */
Simon Kelley6b173352018-05-08 18:32:14 +01001208#ifdef HAVE_DUMPFILE
1209 /* file for packet dumps. */
1210 int dumpfd;
1211#endif
Simon Kelley5aabfc72007-08-29 11:24:47 +01001212} *daemon;
Simon Kelley3be34542004-09-11 19:12:13 +01001213
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001214/* cache.c */
Simon Kelley5aabfc72007-08-29 11:24:47 +01001215void cache_init(void);
Simon Kelley45d8a242018-07-17 21:01:14 +01001216void next_uid(struct crec *crecp);
Simon Kelleycc921df2019-01-02 22:48:59 +00001217void log_query(unsigned int flags, char *name, union all_addr *addr, char *arg);
Simon Kelley19c51cf2014-03-18 22:38:30 +00001218char *record_source(unsigned int index);
Simon Kelley610e7822014-02-06 14:45:17 +00001219char *querystr(char *desc, unsigned short type);
Simon Kelleyb6f926f2018-08-21 17:46:52 +01001220int cache_find_non_terminal(char *name, time_t now);
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001221struct crec *cache_find_by_addr(struct crec *crecp,
Simon Kelleycc921df2019-01-02 22:48:59 +00001222 union all_addr *addr, time_t now,
Simon Kelley12fae492014-02-04 22:03:06 +00001223 unsigned int prot);
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001224struct crec *cache_find_by_name(struct crec *crecp,
Simon Kelley12fae492014-02-04 22:03:06 +00001225 char *name, time_t now, unsigned int prot);
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001226void cache_end_insert(void);
1227void cache_start_insert(void);
Simon Kelleya799ca02018-10-18 19:35:29 +01001228int cache_recv_insert(time_t now, int fd);
Simon Kelleycc921df2019-01-02 22:48:59 +00001229struct crec *cache_insert(char *name, union all_addr *addr, unsigned short class,
Simon Kelley5b99eae2019-01-06 23:09:50 +00001230 time_t now, unsigned long ttl, unsigned int flags);
Simon Kelley7622fc02009-06-04 20:32:05 +01001231void cache_reload(void);
Simon Kelleycc921df2019-01-02 22:48:59 +00001232void cache_add_dhcp_entry(char *host_name, int prot, union all_addr *host_address, time_t ttd);
Simon Kelley7de060b2011-08-26 17:24:52 +01001233struct in_addr a_record_from_hosts(char *name, time_t now);
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001234void cache_unhash_dhcp(void);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001235void dump_cache(time_t now);
Kyle Swenson545712c2021-11-17 12:25:04 -07001236/*CRADLEPOINT*/
1237void dump_cache_json(time_t now);
1238/*CRADLEPOINT*/
Kevin Darbyshire-Bryant7ac9ae12016-09-09 20:52:08 +01001239#ifndef NO_ID
Simon Kelleyfec216d2014-03-27 20:54:34 +00001240int cache_make_stat(struct txt_record *t);
Kevin Darbyshire-Bryant7ac9ae12016-09-09 20:52:08 +01001241#endif
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001242char *cache_get_name(struct crec *crecp);
Simon Kelleyd56a6042013-10-11 14:39:03 +01001243char *cache_get_cname_target(struct crec *crecp);
Simon Kelleyb75e9362012-12-07 11:50:41 +00001244struct crec *cache_enumerate(int init);
Simon Kelley70d18732015-01-31 19:59:29 +00001245int read_hostsfile(char *filename, unsigned int index, int cache_size,
1246 struct crec **rhash, int hashsz);
Simon Kelley98c098b2014-01-08 17:31:16 +00001247
1248/* blockdata.c */
Simon Kelley82e3f452014-01-31 21:05:48 +00001249void blockdata_init(void);
Simon Kelleyc2207682014-01-08 18:04:20 +00001250void blockdata_report(void);
Simon Kelley3a237152013-12-12 12:15:50 +00001251struct blockdata *blockdata_alloc(char *data, size_t len);
Simon Kelley86bec2d2014-01-13 21:31:20 +00001252void *blockdata_retrieve(struct blockdata *block, size_t len, void *data);
Simon Kelleya799ca02018-10-18 19:35:29 +01001253struct blockdata *blockdata_read(int fd, size_t len);
1254void blockdata_write(struct blockdata *block, size_t len, int fd);
Simon Kelley3a237152013-12-12 12:15:50 +00001255void blockdata_free(struct blockdata *blocks);
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001256
Simon Kelley2bb73af2013-04-24 17:38:19 +01001257/* domain.c */
1258char *get_domain(struct in_addr addr);
Simon Kelley2bb73af2013-04-24 17:38:19 +01001259char *get_domain6(struct in6_addr *addr);
Simon Kelleycc921df2019-01-02 22:48:59 +00001260int is_name_synthetic(int flags, char *name, union all_addr *addr);
1261int is_rev_synth(int flag, union all_addr *addr, char *name);
Simon Kelley2bb73af2013-04-24 17:38:19 +01001262
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001263/* rfc1035.c */
Giovanni Bajof53c79c2012-04-22 14:30:53 +02001264int extract_name(struct dns_header *header, size_t plen, unsigned char **pp,
1265 char *name, int isExtract, int extrabytes);
Giovanni Bajo32f82c62012-04-28 01:01:16 +02001266unsigned char *skip_name(unsigned char *ansp, struct dns_header *header, size_t plen, int extrabytes);
Giovanni Bajof53c79c2012-04-22 14:30:53 +02001267unsigned char *skip_questions(struct dns_header *header, size_t plen);
Simon Kelley5107ace2014-02-23 10:48:32 +00001268unsigned char *skip_section(unsigned char *ansp, int count, struct dns_header *header, size_t plen);
Simon Kelley572b41e2011-02-18 18:11:18 +00001269unsigned int extract_request(struct dns_header *header, size_t qlen,
Simon Kelleyc1bb8502004-08-11 18:40:17 +01001270 char *name, unsigned short *typep);
Simon Kelley572b41e2011-02-18 18:11:18 +00001271size_t setup_reply(struct dns_header *header, size_t qlen,
Simon Kelleycc921df2019-01-02 22:48:59 +00001272 union all_addr *addrp, unsigned int flags,
Rosen Penev50a28412017-06-27 22:27:02 +01001273 unsigned long ttl);
1274int extract_addresses(struct dns_header *header, size_t qlen, char *name,
1275 time_t now, char **ipsets, int is_sign, int check_rebind,
Simon Kelley373e9172017-12-01 22:40:56 +00001276 int no_cache_dnssec, int secure, int *doctored);
Simon Kelley572b41e2011-02-18 18:11:18 +00001277size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
Simon Kelley83349b82014-02-10 21:02:01 +00001278 struct in_addr local_addr, struct in_addr local_netmask,
Simon Kelleyfa14bec2015-12-20 17:12:16 +00001279 time_t now, int ad_reqd, int do_bit, int have_pseudoheader);
Simon Kelley572b41e2011-02-18 18:11:18 +00001280int check_for_bogus_wildcard(struct dns_header *header, size_t qlen, char *name,
Simon Kelley9eaa91b2021-03-17 20:31:06 +00001281 time_t now);
1282int check_for_ignored_address(struct dns_header *header, size_t qlen);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001283int check_for_local_domain(char *name, time_t now);
Simon Kelley572b41e2011-02-18 18:11:18 +00001284size_t resize_packet(struct dns_header *header, size_t plen,
Simon Kelleycdeda282006-03-16 20:16:06 +00001285 unsigned char *pheader, size_t hlen);
Simon Kelley4f7b3042012-11-28 21:27:02 +00001286int add_resource_record(struct dns_header *header, char *limit, int *truncp,
Simon Kelleyb75e9362012-12-07 11:50:41 +00001287 int nameoffset, unsigned char **pp, unsigned long ttl,
Simon Kelleye1ff4192012-12-09 17:08:47 +00001288 int *offset, unsigned short type, unsigned short class, char *format, ...);
Simon Kelleycc921df2019-01-02 22:48:59 +00001289int in_arpa_name_2_addr(char *namein, union all_addr *addrp);
Simon Kelleydc27e142013-10-16 13:09:53 +01001290int private_net(struct in_addr addr, int ban_localhost);
Simon Kelley4f7b3042012-11-28 21:27:02 +00001291
1292/* auth.c */
Simon Kelley4820dce2012-12-18 18:30:30 +00001293#ifdef HAVE_AUTH
Simon Kelley19b16892013-10-20 10:19:39 +01001294size_t answer_auth(struct dns_header *header, char *limit, size_t qlen,
Simon Kelleyfa14bec2015-12-20 17:12:16 +00001295 time_t now, union mysockaddr *peer_addr, int local_query,
1296 int do_bit, int have_pseudoheader);
Simon Kelleyb485ed92013-10-18 22:00:39 +01001297int in_zone(struct auth_zone *zone, char *name, char **cut);
Simon Kelley4820dce2012-12-18 18:30:30 +00001298#endif
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001299
Giovanni Bajof53c79c2012-04-22 14:30:53 +02001300/* dnssec.c */
Simon Kelleye1791f32018-10-06 23:23:23 +01001301size_t dnssec_generate_query(struct dns_header *header, unsigned char *end, char *name, int class, int type, int edns_pktsz);
Rosen Penev50a28412017-06-27 22:27:02 +01001302int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class);
Simon Kelleyc3e0b9b2013-12-31 13:50:39 +00001303int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class);
Simon Kelley9a31b682015-12-15 10:20:39 +00001304int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int *class,
Simon Kelleyfef2f1c2019-08-29 21:59:00 +01001305 int check_unsigned, int *neganswer, int *nons, int *nsec_ttl);
Rosen Penev50a28412017-06-27 22:27:02 +01001306int dnskey_keytag(int alg, int flags, unsigned char *key, int keylen);
Simon Kelley613ad152014-02-25 23:02:28 +00001307size_t filter_rrsigs(struct dns_header *header, size_t plen);
Simon Kelley360f2512015-03-07 18:28:06 +00001308int setup_timestamp(void);
Giovanni Bajof53c79c2012-04-22 14:30:53 +02001309
Simon Kelley2d765862020-11-12 22:06:07 +00001310/* hash_questions.c */
Simon Kelleye75069f2021-01-22 22:50:25 +00001311void hash_questions_init(void);
Simon Kelley2d765862020-11-12 22:06:07 +00001312unsigned char *hash_questions(struct dns_header *header, size_t plen, char *name);
1313
Simon Kelleyad9c6f02017-10-27 22:13:49 +01001314/* crypto.c */
1315const struct nettle_hash *hash_find(char *name);
1316int hash_init(const struct nettle_hash *hash, void **ctxp, unsigned char **digestp);
Simon Kelleyad9c6f02017-10-27 22:13:49 +01001317int verify(struct blockdata *key_data, unsigned int key_len, unsigned char *sig, size_t sig_len,
1318 unsigned char *digest, size_t digest_len, int algo);
1319char *ds_digest_name(int digest);
1320char *algo_digest_name(int algo);
1321char *nsec3_digest_name(int digest);
1322
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001323/* util.c */
Simon Kelley1a6bca82008-07-11 11:11:42 +01001324void rand_init(void);
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001325unsigned short rand16(void);
Simon Kelleyb5ea1cc2014-07-29 16:34:14 +01001326u32 rand32(void);
Simon Kelley6586e832013-11-07 14:20:13 +00001327u64 rand64(void);
Rosen Penev50a28412017-06-27 22:27:02 +01001328int legal_hostname(char *name);
1329char *canonicalise(char *in, int *nomem);
Simon Kelley0549c732017-09-25 18:17:11 +01001330unsigned char *do_rfc1035_name(unsigned char *p, char *sval, char *limit);
Simon Kelley0a852542005-03-23 20:28:59 +00001331void *safe_malloc(size_t size);
Petr Menšík47b45b22018-08-15 18:17:00 +02001332void safe_strncpy(char *dest, const char *src, size_t size);
Simon Kelley1a6bca82008-07-11 11:11:42 +01001333void safe_pipe(int *fd, int read_noblock);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001334void *whine_malloc(size_t size);
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001335int sa_len(union mysockaddr *addr);
Simon Kelley74d4fcd2021-03-15 21:59:51 +00001336int sockaddr_isequal(const union mysockaddr *s1, const union mysockaddr *s2);
Simon Kelleyc99df932012-10-12 13:39:04 +01001337int hostname_isequal(const char *a, const char *b);
Simon Kelleyb6f926f2018-08-21 17:46:52 +01001338int hostname_issubdomain(char *a, char *b);
Simon Kelley5e9e0ef2006-04-17 14:24:29 +01001339time_t dnsmasq_time(void);
Lung-Pin Changdc8a1b12014-07-02 10:48:05 +08001340int netmask_length(struct in_addr mask);
Simon Kelleya84fa1d2004-04-23 22:21:21 +01001341int is_same_net(struct in_addr a, struct in_addr b, struct in_addr mask);
Simon Kelleyc72daea2012-01-05 21:33:27 +00001342int is_same_net6(struct in6_addr *a, struct in6_addr *b, int prefixlen);
Simon Kelley52b92f42012-01-22 16:05:15 +00001343u64 addr6part(struct in6_addr *addr);
1344void setaddr6part(struct in6_addr *addr, u64 host);
Simon Kelleyff841eb2015-03-11 21:36:30 +00001345int retry_send(ssize_t rc);
Simon Kelley0a852542005-03-23 20:28:59 +00001346void prettyprint_time(char *buf, unsigned int t);
Simon Kelley3d8df262005-08-29 12:19:27 +01001347int prettyprint_addr(union mysockaddr *addr, char *buf);
Simon Kelley0a852542005-03-23 20:28:59 +00001348int parse_hex(char *in, unsigned char *out, int maxlen,
Simon Kelleycdeda282006-03-16 20:16:06 +00001349 unsigned int *wildcard_mask, int *mac_type);
Simon Kelley5e9e0ef2006-04-17 14:24:29 +01001350int memcmp_masked(unsigned char *a, unsigned char *b, int len,
1351 unsigned int mask);
1352int expand_buf(struct iovec *iov, size_t size);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001353char *print_mac(char *buff, unsigned char *mac, int len);
Simon Kelley16972692006-10-16 20:04:18 +01001354int read_write(int fd, unsigned char *packet, int size, int rw);
Simon Kelley0541a1a2020-03-02 17:10:25 +00001355void close_fds(long max_fd, int spare1, int spare2, int spare3);
Simon Kelley49333cb2013-03-15 20:30:51 +00001356int wildcard_match(const char* wildcard, const char* match);
Neil Jerram70772c92014-06-11 21:22:40 +01001357int wildcard_matchn(const char* wildcard, const char* match, int num);
Simon Kelley0506a5e2020-03-19 21:56:45 +00001358#ifdef HAVE_LINUX_NETWORK
1359int kernel_version(void);
1360#endif
Simon Kelley49333cb2013-03-15 20:30:51 +00001361
Simon Kelleyf2621c72007-04-29 19:47:21 +01001362/* log.c */
Petr Menšík282eab72018-08-15 19:41:07 +02001363void die(char *message, char *arg1, int exit_code) ATTRIBUTE_NORETURN;
Simon Kelley1a6bca82008-07-11 11:11:42 +01001364int log_start(struct passwd *ent_pw, int errfd);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001365int log_reopen(char *log_file);
Rosen Penevcbd29e52017-06-27 22:29:51 +01001366
Simon Kelleyf2621c72007-04-29 19:47:21 +01001367void my_syslog(int priority, const char *format, ...);
Rosen Penevcbd29e52017-06-27 22:29:51 +01001368
Simon Kelleyb842bc92015-07-12 21:09:11 +01001369void set_log_writer(void);
1370void check_log_writer(int force);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001371void flush_log(void);
Simon Kelleyf2621c72007-04-29 19:47:21 +01001372
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001373/* option.c */
Simon Kelley5aabfc72007-08-29 11:24:47 +01001374void read_opts (int argc, char **argv, char *compile_opts);
Simon Kelley4cb1b322012-02-06 14:30:41 +00001375char *option_string(int prot, unsigned int opt, unsigned char *val,
1376 int opt_len, char *buf, int buf_len);
Simon Kelley824af852008-02-12 20:43:05 +00001377void reread_dhcp(void);
Simon Kelley7b1eae42014-02-20 13:43:28 +00001378void read_servers_file(void);
Simon Kelley28866e92011-02-14 20:19:14 +00001379void set_option_bool(unsigned int opt);
Simon Kelley2b5bae92012-06-26 16:55:23 +01001380void reset_option_bool(unsigned int opt);
Simon Kelley28866e92011-02-14 20:19:14 +00001381struct hostsfile *expand_filelist(struct hostsfile *list);
Simon Kelleyfaafb3f2012-09-20 14:17:39 +01001382char *parse_server(char *arg, union mysockaddr *addr,
1383 union mysockaddr *source_addr, char *interface, int *flags);
Simon Kelley70d18732015-01-31 19:59:29 +00001384int option_read_dynfile(char *file, int flags);
1385
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001386/* forward.c */
Simon Kelley74d4fcd2021-03-15 21:59:51 +00001387void reply_query(int fd, time_t now);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001388void receive_query(struct listener *listen, time_t now);
1389unsigned char *tcp_request(int confd, time_t now,
Simon Kelley4f7b3042012-11-28 21:27:02 +00001390 union mysockaddr *local_addr, struct in_addr netmask, int auth_dns);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001391void server_gone(struct server *server);
Simon Kelley8caf3d72020-04-04 17:00:32 +01001392struct frec *get_new_frec(time_t now, int *wait, struct frec *force);
Simon Kelley29689cf2012-03-22 14:01:00 +00001393int send_from(int fd, int nowild, char *packet, size_t len,
Simon Kelleycc921df2019-01-02 22:48:59 +00001394 union mysockaddr *to, union all_addr *source,
Simon Kelley50303b12012-04-04 22:13:17 +01001395 unsigned int iface);
Rosen Penev50a28412017-06-27 22:27:02 +01001396void resend_query(void);
Simon Kelley74d4fcd2021-03-15 21:59:51 +00001397int allocate_rfd(struct randfd_list **fdlp, struct server *serv);
1398void free_rfds(struct randfd_list **fdlp);
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001399
1400/* network.c */
Simon Kelley7622fc02009-06-04 20:32:05 +01001401int indextoname(int fd, int index, char *name);
Simon Kelley9d6918d2017-10-13 17:55:09 +01001402int local_bind(int fd, union mysockaddr *addr, char *intname, unsigned int ifindex, int is_tcp);
Simon Kelley824af852008-02-12 20:43:05 +00001403void pre_allocate_sfds(void);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001404int reload_servers(char *fname);
Simon Kelleyd68c2ca2014-02-18 22:30:30 +00001405void mark_servers(int flag);
1406void cleanup_servers(void);
1407void add_update_server(int flags,
1408 union mysockaddr *addr,
1409 union mysockaddr *source_addr,
1410 const char *interface,
1411 const char *domain);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001412void check_servers(void);
Simon Kelley115ac3e2013-05-20 11:28:32 +01001413int enumerate_interfaces(int reset);
Simon Kelley74c95c22011-10-19 09:33:39 +01001414void create_wildcard_listeners(void);
Rosen Penev50a28412017-06-27 22:27:02 +01001415void create_bound_listeners(int dienow);
Simon Kelleydc27e142013-10-16 13:09:53 +01001416void warn_bound_listeners(void);
Petr Menšíkad59f272017-03-17 17:22:19 +00001417void warn_wild_labels(void);
Simon Kelleyf7029f52013-11-21 15:09:09 +00001418void warn_int_names(void);
Simon Kelley74c95c22011-10-19 09:33:39 +01001419int is_dad_listeners(void);
Simon Kelleycc921df2019-01-02 22:48:59 +00001420int iface_check(int family, union all_addr *addr, char *name, int *auth);
1421int loopback_exception(int fd, int family, union all_addr *addr, char *name);
1422int label_exception(int index, int family, union all_addr *addr);
Simon Kelley7cebd202006-05-06 14:13:33 +01001423int fix_fd(int fd);
Simon Kelley22ce5502013-01-22 13:53:04 +00001424int tcp_interface(int fd, int af);
Simon Kelleyc72daea2012-01-05 21:33:27 +00001425int set_ipv6pktinfo(int fd);
Simon Kelley5d162f22012-12-20 14:55:46 +00001426#ifdef HAVE_DHCP6
1427void join_multicast(int dienow);
1428#endif
Simon Kelley1ee9be42013-12-09 16:50:19 +00001429#if defined(HAVE_LINUX_NETWORK) || defined(HAVE_BSD_NETWORK)
1430void newaddress(time_t now);
1431#endif
1432
Simon Kelley3be34542004-09-11 19:12:13 +01001433
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001434/* dhcp.c */
Simon Kelley7622fc02009-06-04 20:32:05 +01001435#ifdef HAVE_DHCP
Simon Kelley5aabfc72007-08-29 11:24:47 +01001436void dhcp_init(void);
Simon Kelley316e2732010-01-22 20:16:09 +00001437void dhcp_packet(time_t now, int pxe_fd);
Simon Kelley824af852008-02-12 20:43:05 +00001438struct dhcp_context *address_available(struct dhcp_context *context,
Rosen Penev50a28412017-06-27 22:27:02 +01001439 struct in_addr taddr,
Simon Kelley824af852008-02-12 20:43:05 +00001440 struct dhcp_netid *netids);
1441struct dhcp_context *narrow_context(struct dhcp_context *context,
1442 struct in_addr taddr,
1443 struct dhcp_netid *netids);
Simon Kelley5ce3e762017-04-28 22:14:20 +01001444struct ping_result *do_icmp_ping(time_t now, struct in_addr addr,
Simon Kelleyc7be0162017-05-10 22:21:53 +01001445 unsigned int hash, int loopback);
Simon Kelley8ef5ada2010-06-03 19:42:45 +01001446int address_allocate(struct dhcp_context *context,
Simon Kelleycdeda282006-03-16 20:16:06 +00001447 struct in_addr *addrp, unsigned char *hwaddr, int hw_len,
Simon Kelleyc7be0162017-05-10 22:21:53 +01001448 struct dhcp_netid *netids, time_t now, int loopback);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001449void dhcp_read_ethers(void);
Simon Kelleydfa666f2004-08-02 18:27:27 +01001450struct dhcp_config *config_find_by_address(struct dhcp_config *configs, struct in_addr addr);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001451char *host_from_dns(struct in_addr addr);
Simon Kelley7622fc02009-06-04 20:32:05 +01001452#endif
Simon Kelley3be34542004-09-11 19:12:13 +01001453
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001454/* lease.c */
Simon Kelley7622fc02009-06-04 20:32:05 +01001455#ifdef HAVE_DHCP
Simon Kelley5aabfc72007-08-29 11:24:47 +01001456void lease_update_file(time_t now);
Simon Kelley353ae4d2012-03-19 20:07:51 +00001457void lease_update_dns(int force);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001458void lease_init(time_t now);
Simon Kelley52b92f42012-01-22 16:05:15 +00001459struct dhcp_lease *lease4_allocate(struct in_addr addr);
Simon Kelleyc72daea2012-01-05 21:33:27 +00001460#ifdef HAVE_DHCP6
Simon Kelley4cb1b322012-02-06 14:30:41 +00001461struct dhcp_lease *lease6_allocate(struct in6_addr *addrp, int lease_type);
1462struct dhcp_lease *lease6_find(unsigned char *clid, int clid_len,
Dominik DL6ER456a3192019-10-20 18:51:52 +02001463 int lease_type, unsigned int iaid, struct in6_addr *addr);
Simon Kelleya6ebfac2013-03-06 20:52:35 +00001464void lease6_reset(void);
Dominik DL6ER456a3192019-10-20 18:51:52 +02001465struct dhcp_lease *lease6_find_by_client(struct dhcp_lease *first, int lease_type,
1466 unsigned char *clid, int clid_len, unsigned int iaid);
Simon Kelley52b92f42012-01-22 16:05:15 +00001467struct dhcp_lease *lease6_find_by_addr(struct in6_addr *net, int prefix, u64 addr);
Simon Kelley07933802012-02-14 20:55:25 +00001468u64 lease_find_max_addr6(struct dhcp_context *context);
Simon Kelley353ae4d2012-03-19 20:07:51 +00001469void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface);
Simon Kelley0c050242012-12-22 22:13:19 +00001470void lease_update_slaac(time_t now);
Dominik DL6ER456a3192019-10-20 18:51:52 +02001471void lease_set_iaid(struct dhcp_lease *lease, unsigned int iaid);
Simon Kelley3511a922013-11-07 10:28:11 +00001472void lease_make_duid(time_t now);
Simon Kelleyc72daea2012-01-05 21:33:27 +00001473#endif
Nicolas Cavallari64bcff12015-04-28 21:55:18 +01001474void lease_set_hwaddr(struct dhcp_lease *lease, const unsigned char *hwaddr,
1475 const unsigned char *clid, int hw_len, int hw_type,
1476 int clid_len, time_t now, int force);
1477void lease_set_hostname(struct dhcp_lease *lease, const char *name, int auth, char *domain, char *config_domain);
Simon Kelley5e9e0ef2006-04-17 14:24:29 +01001478void lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now);
Simon Kelley353ae4d2012-03-19 20:07:51 +00001479void lease_set_interface(struct dhcp_lease *lease, int interface, time_t now);
Simon Kelleycdeda282006-03-16 20:16:06 +00001480struct dhcp_lease *lease_find_by_client(unsigned char *hwaddr, int hw_len, int hw_type,
Simon Kelley0a852542005-03-23 20:28:59 +00001481 unsigned char *clid, int clid_len);
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001482struct dhcp_lease *lease_find_by_addr(struct in_addr addr);
Simon Kelley7de060b2011-08-26 17:24:52 +01001483struct in_addr lease_find_max_addr(struct dhcp_context *context);
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001484void lease_prune(struct dhcp_lease *target, time_t now);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001485void lease_update_from_configs(void);
1486int do_script_run(time_t now);
1487void rerun_scripts(void);
Simon Kelley8b372702012-03-09 17:45:10 +00001488void lease_find_interfaces(time_t now);
Simon Kelleyceae00d2012-02-09 21:28:14 +00001489#ifdef HAVE_SCRIPT
1490void lease_add_extradata(struct dhcp_lease *lease, unsigned char *data,
1491 unsigned int len, int delim);
1492#endif
Simon Kelley7622fc02009-06-04 20:32:05 +01001493#endif
Simon Kelleya84fa1d2004-04-23 22:21:21 +01001494
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001495/* rfc2131.c */
Simon Kelley7622fc02009-06-04 20:32:05 +01001496#ifdef HAVE_DHCP
Simon Kelley824af852008-02-12 20:43:05 +00001497size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
Simon Kelleyc7be0162017-05-10 22:21:53 +01001498 size_t sz, time_t now, int unicast_dest, int loopback,
Rosen Penev50a28412017-06-27 22:27:02 +01001499 int *is_inform, int pxe, struct in_addr fallback, time_t recvtime);
Simon Kelley9009d742008-11-14 20:04:27 +00001500unsigned char *extended_hwaddr(int hwtype, int hwlen, unsigned char *hwaddr,
1501 int clid_len, unsigned char *clid, int *len_out);
Simon Kelley7622fc02009-06-04 20:32:05 +01001502#endif
Simon Kelley3be34542004-09-11 19:12:13 +01001503
1504/* dnsmasq.c */
Simon Kelley7622fc02009-06-04 20:32:05 +01001505#ifdef HAVE_DHCP
Simon Kelley5e9e0ef2006-04-17 14:24:29 +01001506int make_icmp_sock(void);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001507int icmp_ping(struct in_addr addr);
Floris Bos503c6092017-04-09 23:07:13 +01001508int delay_dhcp(time_t start, int sec, int fd, uint32_t addr, unsigned short id);
Simon Kelley7622fc02009-06-04 20:32:05 +01001509#endif
Simon Kelley47a95162014-07-08 22:22:02 +01001510void queue_event(int event);
Simon Kelley353ae4d2012-03-19 20:07:51 +00001511void send_alarm(time_t event, time_t now);
Simon Kelleyc72daea2012-01-05 21:33:27 +00001512void send_event(int fd, int event, int data, char *msg);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001513void clear_cache_and_reload(time_t now);
Simon Kelley44a2a312004-03-10 20:04:35 +00001514
Simon Kelley0a852542005-03-23 20:28:59 +00001515/* netlink.c */
Simon Kelley5e9e0ef2006-04-17 14:24:29 +01001516#ifdef HAVE_LINUX_NETWORK
Simon Kelley913fa152020-04-19 23:16:52 +01001517char *netlink_init(void);
Simon Kelleya0358e52014-06-07 13:38:48 +01001518void netlink_multicast(void);
Simon Kelley5e9e0ef2006-04-17 14:24:29 +01001519#endif
1520
1521/* bpf.c */
Simon Kelley824af852008-02-12 20:43:05 +00001522#ifdef HAVE_BSD_NETWORK
Simon Kelley5aabfc72007-08-29 11:24:47 +01001523void init_bpf(void);
1524void send_via_bpf(struct dhcp_packet *mess, size_t len,
Simon Kelley5e9e0ef2006-04-17 14:24:29 +01001525 struct in_addr iface_addr, struct ifreq *ifr);
Simon Kelley1ee9be42013-12-09 16:50:19 +00001526void route_init(void);
Simon Kelleya0358e52014-06-07 13:38:48 +01001527void route_sock(void);
Simon Kelley0a852542005-03-23 20:28:59 +00001528#endif
Simon Kelley3d8df262005-08-29 12:19:27 +01001529
Simon Kelley824af852008-02-12 20:43:05 +00001530/* bpf.c or netlink.c */
Simon Kelley28866e92011-02-14 20:19:14 +00001531int iface_enumerate(int family, void *parm, int (callback)());
Simon Kelley824af852008-02-12 20:43:05 +00001532
Simon Kelley3d8df262005-08-29 12:19:27 +01001533/* dbus.c */
1534#ifdef HAVE_DBUS
Simon Kelley5aabfc72007-08-29 11:24:47 +01001535char *dbus_init(void);
Simon Kelleyb842bc92015-07-12 21:09:11 +01001536void check_dbus_listeners(void);
1537void set_dbus_listeners(void);
Simon Kelley316e2732010-01-22 20:16:09 +00001538# ifdef HAVE_DHCP
Simon Kelley1f15b812009-10-13 17:49:32 +01001539void emit_dbus_signal(int action, struct dhcp_lease *lease, char *hostname);
Simon Kelley316e2732010-01-22 20:16:09 +00001540# endif
Simon Kelley3d8df262005-08-29 12:19:27 +01001541#endif
Simon Kelley16972692006-10-16 20:04:18 +01001542
Julian Kornbergercaf4d572018-07-21 21:45:03 +01001543/* ubus.c */
1544#ifdef HAVE_UBUS
Jan Willem Janssena2b82202019-03-25 12:42:23 +01001545void ubus_init(void);
Julian Kornbergercaf4d572018-07-21 21:45:03 +01001546void set_ubus_listeners(void);
1547void check_ubus_listeners(void);
1548void ubus_event_bcast(const char *type, const char *mac, const char *ip, const char *name, const char *interface);
1549#endif
1550
Jason A. Donenfeld13d86c72013-02-22 18:20:53 +00001551/* ipset.c */
1552#ifdef HAVE_IPSET
1553void ipset_init(void);
Simon Kelleycc921df2019-01-02 22:48:59 +00001554int add_to_ipset(const char *setname, const union all_addr *ipaddr, int flags, int remove);
Jason A. Donenfeld13d86c72013-02-22 18:20:53 +00001555#endif
1556
Simon Kelley16972692006-10-16 20:04:18 +01001557/* helper.c */
Simon Kelley00683012012-03-19 20:29:55 +00001558#if defined(HAVE_SCRIPT)
Simon Kelley1a6bca82008-07-11 11:11:42 +01001559int create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001560void helper_write(void);
1561void queue_script(int action, struct dhcp_lease *lease,
1562 char *hostname, time_t now);
Simon Kelleya9530962012-03-20 22:07:35 +00001563#ifdef HAVE_TFTP
1564void queue_tftp(off_t file_len, char *filename, union mysockaddr *peer);
1565#endif
Simon Kelley33702ab2015-12-28 23:17:15 +00001566void queue_arp(int action, unsigned char *mac, int maclen,
Simon Kelleycc921df2019-01-02 22:48:59 +00001567 int family, union all_addr *addr);
Simon Kelley16972692006-10-16 20:04:18 +01001568int helper_buf_empty(void);
Simon Kelley5aabfc72007-08-29 11:24:47 +01001569#endif
Simon Kelley832af0b2007-01-21 20:01:28 +00001570
1571/* tftp.c */
1572#ifdef HAVE_TFTP
Simon Kelley5aabfc72007-08-29 11:24:47 +01001573void tftp_request(struct listener *listen, time_t now);
Simon Kelleyb842bc92015-07-12 21:09:11 +01001574void check_tftp_listeners(time_t now);
Simon Kelleya9530962012-03-20 22:07:35 +00001575int do_tftp_script_run(void);
Simon Kelley832af0b2007-01-21 20:01:28 +00001576#endif
Simon Kelley7de060b2011-08-26 17:24:52 +01001577
1578/* conntrack.c */
1579#ifdef HAVE_CONNTRACK
Simon Kelleycc921df2019-01-02 22:48:59 +00001580int get_incoming_mark(union mysockaddr *peer_addr, union all_addr *local_addr,
Simon Kelley7de060b2011-08-26 17:24:52 +01001581 int istcp, unsigned int *markp);
1582#endif
Simon Kelleyc72daea2012-01-05 21:33:27 +00001583
Simon Kelley52b92f42012-01-22 16:05:15 +00001584/* dhcp6.c */
1585#ifdef HAVE_DHCP6
1586void dhcp6_init(void);
1587void dhcp6_packet(time_t now);
Simon Kelley6586e832013-11-07 14:20:13 +00001588struct dhcp_context *address6_allocate(struct dhcp_context *context, unsigned char *clid, int clid_len, int temp_addr,
Dominik DL6ER456a3192019-10-20 18:51:52 +02001589 unsigned int iaid, int serial, struct dhcp_netid *netids, int plain_range, struct in6_addr *ans);
Simon Kelley52b92f42012-01-22 16:05:15 +00001590struct dhcp_context *address6_available(struct dhcp_context *context,
1591 struct in6_addr *taddr,
Simon Kelleyc6309242013-03-07 20:59:28 +00001592 struct dhcp_netid *netids,
1593 int plain_range);
Simon Kelley37c9cce2013-01-09 19:51:04 +00001594struct dhcp_context *address6_valid(struct dhcp_context *context,
1595 struct in6_addr *taddr,
Simon Kelleyc6309242013-03-07 20:59:28 +00001596 struct dhcp_netid *netids,
1597 int plain_range);
Simon Kelleyceae00d2012-02-09 21:28:14 +00001598struct dhcp_config *config_find_by_address6(struct dhcp_config *configs, struct in6_addr *net,
Simon Kelley79aba0f2020-02-03 23:58:45 +00001599 int prefix, struct in6_addr *addr);
Simon Kelley4cb1b322012-02-06 14:30:41 +00001600void make_duid(time_t now);
Simon Kelley1f776932012-12-16 19:46:08 +00001601void dhcp_construct_contexts(time_t now);
Simon Kelley8939c952013-09-25 11:49:34 +01001602void get_client_mac(struct in6_addr *client, int iface, unsigned char *mac,
Simon Kelley33702ab2015-12-28 23:17:15 +00001603 unsigned int *maclenp, unsigned int *mactypep, time_t now);
Simon Kelley52b92f42012-01-22 16:05:15 +00001604#endif
Simon Kelley8939c952013-09-25 11:49:34 +01001605
Simon Kelleyc72daea2012-01-05 21:33:27 +00001606/* rfc3315.c */
1607#ifdef HAVE_DHCP6
Simon Kelley1d0f91c2012-03-12 11:56:22 +00001608unsigned short dhcp6_reply(struct dhcp_context *context, int interface, char *iface_name,
Simon Kelleyc3a04082014-01-11 22:18:19 +00001609 struct in6_addr *fallback, struct in6_addr *ll_addr, struct in6_addr *ula_addr,
1610 size_t sz, struct in6_addr *client_addr, time_t now);
Simon Kelley33702ab2015-12-28 23:17:15 +00001611void relay_upstream6(struct dhcp_relay *relay, ssize_t sz, struct in6_addr *peer_address,
1612 u32 scope_id, time_t now);
Simon Kelleyff7eea22013-09-04 18:01:38 +01001613
1614unsigned short relay_reply6( struct sockaddr_in6 *peer, ssize_t sz, char *arrival_interface);
Simon Kelleyc72daea2012-01-05 21:33:27 +00001615#endif
Simon Kelley4cb1b322012-02-06 14:30:41 +00001616
1617/* dhcp-common.c */
Simon Kelleyceae00d2012-02-09 21:28:14 +00001618#ifdef HAVE_DHCP
Simon Kelley4cb1b322012-02-06 14:30:41 +00001619void dhcp_common_init(void);
1620ssize_t recv_dhcp_packet(int fd, struct msghdr *msg);
Rosen Penev50a28412017-06-27 22:27:02 +01001621struct dhcp_netid *run_tag_if(struct dhcp_netid *tags);
Simon Kelley4cb1b322012-02-06 14:30:41 +00001622struct dhcp_netid *option_filter(struct dhcp_netid *tags, struct dhcp_netid *context_tags,
1623 struct dhcp_opt *opts);
Rosen Penev50a28412017-06-27 22:27:02 +01001624int match_netid(struct dhcp_netid *check, struct dhcp_netid *pool, int tagnotneeded);
Simon Kelley4cb1b322012-02-06 14:30:41 +00001625char *strip_hostname(char *hostname);
1626void log_tags(struct dhcp_netid *netid, u32 xid);
Simon Kelley3634c542012-02-08 14:22:37 +00001627int match_bytes(struct dhcp_opt *o, unsigned char *p, int len);
Simon Kelleyceae00d2012-02-09 21:28:14 +00001628void dhcp_update_configs(struct dhcp_config *configs);
Simon Kelley40ef23b2012-03-13 21:59:28 +00001629void display_opts(void);
Simon Kelleybd08ae62013-04-19 10:22:06 +01001630int lookup_dhcp_opt(int prot, char *name);
1631int lookup_dhcp_len(int prot, int val);
Simon Kelley89500e32013-09-20 16:29:20 +01001632struct dhcp_config *find_config(struct dhcp_config *configs,
1633 struct dhcp_context *context,
1634 unsigned char *clid, int clid_len,
1635 unsigned char *hwaddr, int hw_len,
Simon Kelley52ec7832020-02-07 21:05:54 +00001636 int hw_type, char *hostname,
1637 struct dhcp_netid *filter);
Simon Kelley89500e32013-09-20 16:29:20 +01001638int config_has_mac(struct dhcp_config *config, unsigned char *hwaddr, int len, int type);
Simon Kelley9380ba72012-04-16 14:41:56 +01001639#ifdef HAVE_LINUX_NETWORK
Simon Kelley3b3f4412013-10-11 16:33:28 +01001640char *whichdevice(void);
1641void bindtodevice(char *device, int fd);
Simon Kelley9380ba72012-04-16 14:41:56 +01001642#endif
Simon Kelley843c96b2012-02-27 17:42:38 +00001643# ifdef HAVE_DHCP6
Simon Kelley40ef23b2012-03-13 21:59:28 +00001644void display_opts6(void);
Simon Kelley843c96b2012-02-27 17:42:38 +00001645# endif
Simon Kelley1f776932012-12-16 19:46:08 +00001646void log_context(int family, struct dhcp_context *context);
Simon Kelleyff7eea22013-09-04 18:01:38 +01001647void log_relay(int family, struct dhcp_relay *relay);
Simon Kelley9e4abcb2004-01-22 19:47:41 +00001648#endif
Simon Kelleyc5ad4e72012-02-24 16:06:20 +00001649
1650/* outpacket.c */
1651#ifdef HAVE_DHCP6
1652void end_opt6(int container);
Simon Kelleyfa785732016-07-22 20:56:01 +01001653void reset_counter(void);
Simon Kelleyc5ad4e72012-02-24 16:06:20 +00001654int save_counter(int newval);
1655void *expand(size_t headroom);
1656int new_opt6(int opt);
1657void *put_opt6(void *data, size_t len);
1658void put_opt6_long(unsigned int val);
1659void put_opt6_short(unsigned int val);
1660void put_opt6_char(unsigned int val);
1661void put_opt6_string(char *s);
1662#endif
1663
1664/* radv.c */
1665#ifdef HAVE_DHCP6
Tarun Kundu15048b52022-07-05 12:16:58 -07001666// MAX_RA_DELAY_TIME in milliseconds
1667#define MAX_RA_DELAY_TIME 500
1668#define random_num_in_range(range) (rand() % (range))
Simon Kelleyc5ad4e72012-02-24 16:06:20 +00001669void ra_init(time_t now);
Simon Kelley1f776932012-12-16 19:46:08 +00001670void icmp6_packet(time_t now);
Simon Kelleyc5ad4e72012-02-24 16:06:20 +00001671time_t periodic_ra(time_t now);
Josh Soref730c6742017-02-06 16:14:04 +00001672void ra_start_unsolicited(time_t now, struct dhcp_context *context);
Simon Kelley353ae4d2012-03-19 20:07:51 +00001673#endif
1674
1675/* slaac.c */
1676#ifdef HAVE_DHCP6
Simon Kelleya9ab7322012-04-28 11:29:37 +01001677void slaac_add_addrs(struct dhcp_lease *lease, time_t now, int force);
Simon Kelley353ae4d2012-03-19 20:07:51 +00001678time_t periodic_slaac(time_t now, struct dhcp_lease *leases);
1679void slaac_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface, struct dhcp_lease *leases);
Simon Kelleyc5ad4e72012-02-24 16:06:20 +00001680#endif
Simon Kelleyb5ea1cc2014-07-29 16:34:14 +01001681
1682/* loop.c */
1683#ifdef HAVE_LOOP
Rosen Penev50a28412017-06-27 22:27:02 +01001684void loop_send_probes(void);
Simon Kelleyb5ea1cc2014-07-29 16:34:14 +01001685int detect_loop(char *query, int type);
1686#endif
1687
Simon Kelley193de4a2014-12-10 17:32:16 +00001688/* inotify.c */
Simon Kelley04918052015-01-26 11:23:43 +00001689#ifdef HAVE_INOTIFY
Rosen Penev50a28412017-06-27 22:27:02 +01001690void inotify_dnsmasq_init(void);
Simon Kelley5f4dc5c2015-01-20 20:51:02 +00001691int inotify_check(time_t now);
Simon Kelley70d18732015-01-31 19:59:29 +00001692void set_dynamic_inotify(int flag, int total_size, struct crec **rhash, int revhashsz);
Simon Kelley193de4a2014-12-10 17:32:16 +00001693#endif
Simon Kelleyb842bc92015-07-12 21:09:11 +01001694
1695/* poll.c */
1696void poll_reset(void);
1697int poll_check(int fd, short event);
1698void poll_listen(int fd, short event);
1699int do_poll(int timeout);
1700
Simon Kelleyc2bcd1e2015-12-15 17:25:21 +00001701/* rrfilter.c */
1702size_t rrfilter(struct dns_header *header, size_t plen, int mode);
1703u16 *rrfilter_desc(int type);
1704int expand_workspace(unsigned char ***wkspc, int *szp, int new);
1705
Simon Kelley1d030162015-12-21 14:17:06 +00001706/* edns0.c */
Simon Kelley5bb88f02015-12-21 16:23:47 +00001707unsigned char *find_pseudoheader(struct dns_header *header, size_t plen,
1708 size_t *len, unsigned char **p, int *is_sign, int *is_last);
Simon Kelley1d030162015-12-21 14:17:06 +00001709size_t add_pseudoheader(struct dns_header *header, size_t plen, unsigned char *limit,
Simon Kelleyc7f3bd22016-02-28 21:48:34 +00001710 unsigned short udp_sz, int optno, unsigned char *opt, size_t optlen, int set_do, int replace);
Simon Kelley33702ab2015-12-28 23:17:15 +00001711size_t add_do_bit(struct dns_header *header, size_t plen, unsigned char *limit);
1712size_t add_edns0_config(struct dns_header *header, size_t plen, unsigned char *limit,
Simon Kelley25e63f12020-11-25 21:17:52 +00001713 union mysockaddr *source, time_t now, int *check_subnet, int *cacheable);
Simon Kelley1d030162015-12-21 14:17:06 +00001714int check_source(struct dns_header *header, size_t plen, unsigned char *pseudoheader, union mysockaddr *peer);
Simon Kelley11867dc2015-12-23 16:15:58 +00001715
1716/* arp.c */
Simon Kelley33702ab2015-12-28 23:17:15 +00001717int find_mac(union mysockaddr *addr, unsigned char *mac, int lazy, time_t now);
1718int do_arp_script_run(void);
Simon Kelley6b173352018-05-08 18:32:14 +01001719
1720/* dump.c */
1721#ifdef HAVE_DUMPFILE
1722void dump_init(void);
1723void dump_packet(int mask, void *packet, size_t len, union mysockaddr *src, union mysockaddr *dst);
1724#endif