Annotation of embedaddon/dnsmasq/src/dnsmasq.h, revision 1.1.1.3
1.1.1.3 ! misho 1: /* dnsmasq is Copyright (c) 2000-2016 Simon Kelley
1.1 misho 2:
3: 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
5: the Free Software Foundation; version 2 dated June, 1991, or
6: (at your option) version 3 dated 29 June, 2007.
7:
8: 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.
12:
13: 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/>.
15: */
16:
1.1.1.3 ! misho 17: #define COPYRIGHT "Copyright (c) 2000-2016 Simon Kelley"
1.1 misho 18:
19: #ifndef NO_LARGEFILE
20: /* Ensure we can use files >2GB (log files may grow this big) */
21: # define _LARGEFILE_SOURCE 1
22: # define _FILE_OFFSET_BITS 64
23: #endif
24:
25: /* Get linux C library versions and define _GNU_SOURCE for kFreeBSD. */
26: #if defined(__linux__) || defined(__GLIBC__)
27: # ifndef __ANDROID__
28: # define _GNU_SOURCE
29: # endif
30: # include <features.h>
31: #endif
32:
33: /* Need these defined early */
34: #if defined(__sun) || defined(__sun__)
35: # define _XPG4_2
36: # define __EXTENSIONS__
37: #endif
38:
39: /* get these before config.h for IPv6 stuff... */
40: #include <sys/types.h>
41: #include <sys/socket.h>
42:
43: #ifdef __APPLE__
44: /* Define before netinet/in.h to select API. OSX Lion onwards. */
45: # define __APPLE_USE_RFC_3542
46: #endif
47: #include <netinet/in.h>
48:
49: /* Also needed before config.h. */
50: #include <getopt.h>
51:
52: #include "config.h"
1.1.1.2 misho 53: #include "ip6addr.h"
1.1 misho 54:
55: typedef unsigned char u8;
56: typedef unsigned short u16;
57: typedef unsigned int u32;
58: typedef unsigned long long u64;
59:
1.1.1.2 misho 60: #define countof(x) (long)(sizeof(x) / sizeof(x[0]))
61: #define MIN(a,b) ((a) < (b) ? (a) : (b))
62:
1.1 misho 63: #include "dns-protocol.h"
64: #include "dhcp-protocol.h"
65: #ifdef HAVE_DHCP6
66: #include "dhcp6-protocol.h"
67: #include "radv-protocol.h"
68: #endif
69:
70: #define gettext_noop(S) (S)
71: #ifndef LOCALEDIR
72: # define _(S) (S)
73: #else
74: # include <libintl.h>
75: # include <locale.h>
76: # define _(S) gettext(S)
77: #endif
78:
79: #include <arpa/inet.h>
80: #include <sys/stat.h>
81: #include <sys/ioctl.h>
82: #if defined(HAVE_SOLARIS_NETWORK)
83: # include <sys/sockio.h>
84: #endif
1.1.1.3 ! misho 85: #include <sys/poll.h>
1.1 misho 86: #include <sys/wait.h>
87: #include <sys/time.h>
88: #include <sys/un.h>
89: #include <limits.h>
90: #include <net/if.h>
91: #if defined(HAVE_SOLARIS_NETWORK) && !defined(ifr_mtu)
92: /* Some solaris net/if./h omit this. */
93: # define ifr_mtu ifr_ifru.ifru_metric
94: #endif
95: #include <unistd.h>
96: #include <stdio.h>
97: #include <string.h>
98: #include <stdlib.h>
99: #include <fcntl.h>
100: #include <ctype.h>
101: #include <signal.h>
102: #include <stddef.h>
103: #include <time.h>
104: #include <errno.h>
105: #include <pwd.h>
106: #include <grp.h>
107: #include <stdarg.h>
108: #if defined(__OpenBSD__) || defined(__NetBSD__) || defined(__sun__) || defined (__sun) || defined (__ANDROID__)
109: # include <netinet/if_ether.h>
110: #else
111: # include <net/ethernet.h>
112: #endif
113: #include <net/if_arp.h>
114: #include <netinet/in_systm.h>
115: #include <netinet/ip.h>
116: #include <netinet/ip_icmp.h>
117: #include <sys/uio.h>
118: #include <syslog.h>
119: #include <dirent.h>
1.1.1.3 ! misho 120: #include <utime.h>
1.1 misho 121: #ifndef HAVE_LINUX_NETWORK
122: # include <net/if_dl.h>
123: #endif
124:
125: #if defined(HAVE_LINUX_NETWORK)
126: #include <linux/capability.h>
127: /* There doesn't seem to be a universally-available
128: userpace header for these. */
129: extern int capset(cap_user_header_t header, cap_user_data_t data);
130: extern int capget(cap_user_header_t header, cap_user_data_t data);
131: #define LINUX_CAPABILITY_VERSION_1 0x19980330
132: #define LINUX_CAPABILITY_VERSION_2 0x20071026
133: #define LINUX_CAPABILITY_VERSION_3 0x20080522
134:
135: #include <sys/prctl.h>
136: #elif defined(HAVE_SOLARIS_NETWORK)
137: #include <priv.h>
138: #endif
139:
140: /* daemon is function in the C library.... */
141: #define daemon dnsmasq_daemon
142:
143: /* Async event queue */
144: struct event_desc {
145: int event, data, msg_sz;
146: };
147:
148: #define EVENT_RELOAD 1
149: #define EVENT_DUMP 2
150: #define EVENT_ALARM 3
151: #define EVENT_TERM 4
152: #define EVENT_CHILD 5
153: #define EVENT_REOPEN 6
154: #define EVENT_EXITED 7
155: #define EVENT_KILLED 8
156: #define EVENT_EXEC_ERR 9
157: #define EVENT_PIPE_ERR 10
158: #define EVENT_USER_ERR 11
159: #define EVENT_CAP_ERR 12
160: #define EVENT_PIDFILE 13
161: #define EVENT_HUSER_ERR 14
162: #define EVENT_GROUP_ERR 15
163: #define EVENT_DIE 16
164: #define EVENT_LOG_ERR 17
165: #define EVENT_FORK_ERR 18
166: #define EVENT_LUA_ERR 19
167: #define EVENT_TFTP_ERR 20
1.1.1.2 misho 168: #define EVENT_INIT 21
1.1.1.3 ! misho 169: #define EVENT_NEWADDR 22
! 170: #define EVENT_NEWROUTE 23
! 171: #define EVENT_TIME_ERR 24
1.1 misho 172:
173: /* Exit codes. */
174: #define EC_GOOD 0
175: #define EC_BADCONF 1
176: #define EC_BADNET 2
177: #define EC_FILE 3
178: #define EC_NOMEM 4
179: #define EC_MISC 5
180: #define EC_INIT_OFFSET 10
181:
182: /* Trust the compiler dead-code eliminator.... */
183: #define option_bool(x) (((x) < 32) ? daemon->options & (1u << (x)) : daemon->options2 & (1u << ((x) - 32)))
184:
185: #define OPT_BOGUSPRIV 0
186: #define OPT_FILTER 1
187: #define OPT_LOG 2
188: #define OPT_SELFMX 3
189: #define OPT_NO_HOSTS 4
190: #define OPT_NO_POLL 5
191: #define OPT_DEBUG 6
192: #define OPT_ORDER 7
193: #define OPT_NO_RESOLV 8
194: #define OPT_EXPAND 9
195: #define OPT_LOCALMX 10
196: #define OPT_NO_NEG 11
197: #define OPT_NODOTS_LOCAL 12
198: #define OPT_NOWILD 13
199: #define OPT_ETHERS 14
200: #define OPT_RESOLV_DOMAIN 15
201: #define OPT_NO_FORK 16
202: #define OPT_AUTHORITATIVE 17
203: #define OPT_LOCALISE 18
204: #define OPT_DBUS 19
205: #define OPT_DHCP_FQDN 20
206: #define OPT_NO_PING 21
207: #define OPT_LEASE_RO 22
208: #define OPT_ALL_SERVERS 23
209: #define OPT_RELOAD 24
210: #define OPT_LOCAL_REBIND 25
211: #define OPT_TFTP_SECURE 26
212: #define OPT_TFTP_NOBLOCK 27
213: #define OPT_LOG_OPTS 28
214: #define OPT_TFTP_APREF 29
215: #define OPT_NO_OVERRIDE 30
216: #define OPT_NO_REBIND 31
217: #define OPT_ADD_MAC 32
1.1.1.2 misho 218: #define OPT_DNSSEC_PROXY 33
1.1 misho 219: #define OPT_CONSEC_ADDR 34
220: #define OPT_CONNTRACK 35
221: #define OPT_FQDN_UPDATE 36
222: #define OPT_RA 37
223: #define OPT_TFTP_LC 38
224: #define OPT_CLEVERBIND 39
225: #define OPT_TFTP 40
1.1.1.2 misho 226: #define OPT_CLIENT_SUBNET 41
227: #define OPT_QUIET_DHCP 42
228: #define OPT_QUIET_DHCP6 43
229: #define OPT_QUIET_RA 44
230: #define OPT_DNSSEC_VALID 45
231: #define OPT_DNSSEC_TIME 46
232: #define OPT_DNSSEC_DEBUG 47
233: #define OPT_DNSSEC_NO_SIGN 48
234: #define OPT_LOCAL_SERVICE 49
1.1.1.3 ! misho 235: #define OPT_LOOP_DETECT 50
! 236: #define OPT_EXTRALOG 51
! 237: #define OPT_TFTP_NO_FAIL 52
! 238: #define OPT_SCRIPT_ARP 53
! 239: #define OPT_MAC_B64 54
! 240: #define OPT_MAC_HEX 55
! 241: #define OPT_LAST 56
1.1 misho 242:
243: /* extra flags for my_syslog, we use a couple of facilities since they are known
244: not to occupy the same bits as priorities, no matter how syslog.h is set up. */
245: #define MS_TFTP LOG_USER
246: #define MS_DHCP LOG_DAEMON
247:
248: struct all_addr {
249: union {
250: struct in_addr addr4;
251: #ifdef HAVE_IPV6
252: struct in6_addr addr6;
253: #endif
1.1.1.2 misho 254: /* for log_query */
1.1.1.3 ! misho 255: struct {
! 256: unsigned short keytag, algo, digest;
! 257: } log;
! 258: /* for cache_insert of DNSKEY, DS */
1.1.1.2 misho 259: struct {
260: unsigned short class, type;
261: } dnssec;
1.1 misho 262: } addr;
263: };
264:
265: struct bogus_addr {
266: struct in_addr addr;
267: struct bogus_addr *next;
268: };
269:
270: /* dns doctor param */
271: struct doctor {
272: struct in_addr in, end, out, mask;
273: struct doctor *next;
274: };
275:
276: struct mx_srv_record {
277: char *name, *target;
278: int issrv, srvport, priority, weight;
279: unsigned int offset;
280: struct mx_srv_record *next;
281: };
282:
283: struct naptr {
284: char *name, *replace, *regexp, *services, *flags;
285: unsigned int order, pref;
286: struct naptr *next;
287: };
288:
1.1.1.2 misho 289: #define TXT_STAT_CACHESIZE 1
290: #define TXT_STAT_INSERTS 2
291: #define TXT_STAT_EVICTIONS 3
292: #define TXT_STAT_MISSES 4
293: #define TXT_STAT_HITS 5
294: #define TXT_STAT_AUTH 6
295: #define TXT_STAT_SERVERS 7
296:
1.1 misho 297: struct txt_record {
298: char *name;
299: unsigned char *txt;
300: unsigned short class, len;
1.1.1.2 misho 301: int stat;
1.1 misho 302: struct txt_record *next;
303: };
304:
305: struct ptr_record {
306: char *name, *ptr;
307: struct ptr_record *next;
308: };
309:
310: struct cname {
1.1.1.3 ! misho 311: int ttl;
1.1 misho 312: char *alias, *target;
313: struct cname *next;
1.1.1.2 misho 314: };
315:
316: struct ds_config {
317: char *name, *digest;
318: int digestlen, class, algo, keytag, digest_type;
319: struct ds_config *next;
1.1 misho 320: };
321:
1.1.1.2 misho 322: #define ADDRLIST_LITERAL 1
323: #define ADDRLIST_IPV6 2
1.1.1.3 ! misho 324: #define ADDRLIST_REVONLY 4
1.1.1.2 misho 325:
326: struct addrlist {
327: struct all_addr addr;
328: int flags, prefixlen;
329: struct addrlist *next;
330: };
331:
332: #define AUTH6 1
333: #define AUTH4 2
334:
1.1 misho 335: struct auth_zone {
336: char *domain;
1.1.1.2 misho 337: struct auth_name_list {
338: char *name;
339: int flags;
340: struct auth_name_list *next;
341: } *interface_names;
342: struct addrlist *subnet;
1.1 misho 343: struct auth_zone *next;
344: };
345:
346:
347: struct host_record {
1.1.1.3 ! misho 348: int ttl;
1.1 misho 349: struct name_list {
350: char *name;
351: struct name_list *next;
352: } *names;
353: struct in_addr addr;
354: #ifdef HAVE_IPV6
355: struct in6_addr addr6;
356: #endif
357: struct host_record *next;
358: };
359:
360: struct interface_name {
361: char *name; /* domain name */
362: char *intr; /* interface name */
1.1.1.2 misho 363: int family; /* AF_INET, AF_INET6 or zero for both */
364: struct addrlist *addr;
1.1 misho 365: struct interface_name *next;
366: };
367:
368: union bigname {
369: char name[MAXDNAME];
370: union bigname *next; /* freelist */
371: };
372:
1.1.1.2 misho 373: struct blockdata {
374: struct blockdata *next;
1.1 misho 375: unsigned char key[KEYBLOCK_LEN];
376: };
377:
378: struct crec {
379: struct crec *next, *prev, *hash_next;
380: /* union is 16 bytes when doing IPv6, 8 bytes on 32 bit machines without IPv6 */
381: union {
382: struct all_addr addr;
383: struct {
1.1.1.2 misho 384: union {
385: struct crec *cache;
386: struct interface_name *int_name;
387: } target;
388: unsigned int uid; /* 0 if union is interface-name */
1.1 misho 389: } cname;
390: struct {
1.1.1.2 misho 391: struct blockdata *keydata;
392: unsigned short keylen, flags, keytag;
393: unsigned char algo;
394: } key;
395: struct {
396: struct blockdata *keydata;
397: unsigned short keylen, keytag;
1.1 misho 398: unsigned char algo;
1.1.1.2 misho 399: unsigned char digest;
400: } ds;
1.1 misho 401: } addr;
402: time_t ttd; /* time to die */
1.1.1.3 ! misho 403: /* used as class if DNSKEY/DS, index to source for F_HOSTS */
1.1.1.2 misho 404: unsigned int uid;
1.1 misho 405: unsigned short flags;
406: union {
407: char sname[SMALLDNAME];
408: union bigname *bname;
409: char *namep;
410: } name;
411: };
412:
413: #define F_IMMORTAL (1u<<0)
414: #define F_NAMEP (1u<<1)
415: #define F_REVERSE (1u<<2)
416: #define F_FORWARD (1u<<3)
417: #define F_DHCP (1u<<4)
418: #define F_NEG (1u<<5)
419: #define F_HOSTS (1u<<6)
420: #define F_IPV4 (1u<<7)
421: #define F_IPV6 (1u<<8)
422: #define F_BIGNAME (1u<<9)
423: #define F_NXDOMAIN (1u<<10)
424: #define F_CNAME (1u<<11)
425: #define F_DNSKEY (1u<<12)
426: #define F_CONFIG (1u<<13)
427: #define F_DS (1u<<14)
428: #define F_DNSSECOK (1u<<15)
429:
430: /* below here are only valid as args to log_query: cache
431: entries are limited to 16 bits */
432: #define F_UPSTREAM (1u<<16)
433: #define F_RRNAME (1u<<17)
434: #define F_SERVER (1u<<18)
435: #define F_QUERY (1u<<19)
436: #define F_NOERR (1u<<20)
437: #define F_AUTH (1u<<21)
1.1.1.2 misho 438: #define F_DNSSEC (1u<<22)
439: #define F_KEYTAG (1u<<23)
440: #define F_SECSTAT (1u<<24)
441: #define F_NO_RR (1u<<25)
442: #define F_IPSET (1u<<26)
1.1.1.3 ! misho 443: #define F_NOEXTRA (1u<<27)
1.1.1.2 misho 444:
445: /* Values of uid in crecs with F_CONFIG bit set. */
446: #define SRC_INTERFACE 0
447: #define SRC_CONFIG 1
448: #define SRC_HOSTS 2
449: #define SRC_AH 3
1.1 misho 450:
451:
452: /* struct sockaddr is not large enough to hold any address,
453: and specifically not big enough to hold an IPv6 address.
454: Blech. Roll our own. */
455: union mysockaddr {
456: struct sockaddr sa;
457: struct sockaddr_in in;
458: #if defined(HAVE_IPV6)
459: struct sockaddr_in6 in6;
460: #endif
461: };
462:
463: /* bits in flag param to IPv6 callbacks from iface_enumerate() */
464: #define IFACE_TENTATIVE 1
465: #define IFACE_DEPRECATED 2
1.1.1.2 misho 466: #define IFACE_PERMANENT 4
1.1 misho 467:
468:
469: #define SERV_FROM_RESOLV 1 /* 1 for servers from resolv, 0 for command line. */
470: #define SERV_NO_ADDR 2 /* no server, this domain is local only */
471: #define SERV_LITERAL_ADDRESS 4 /* addr is the answer, not the server */
472: #define SERV_HAS_DOMAIN 8 /* server for one domain only */
473: #define SERV_HAS_SOURCE 16 /* source address defined */
474: #define SERV_FOR_NODOTS 32 /* server for names with no domain part only */
475: #define SERV_WARNED_RECURSIVE 64 /* avoid warning spam */
476: #define SERV_FROM_DBUS 128 /* 1 if source is DBus */
477: #define SERV_MARK 256 /* for mark-and-delete */
478: #define SERV_TYPE (SERV_HAS_DOMAIN | SERV_FOR_NODOTS)
479: #define SERV_COUNTED 512 /* workspace for log code */
480: #define SERV_USE_RESOLV 1024 /* forward this domain in the normal way */
481: #define SERV_NO_REBIND 2048 /* inhibit dns-rebind protection */
1.1.1.2 misho 482: #define SERV_FROM_FILE 4096 /* read from --servers-file */
1.1.1.3 ! misho 483: #define SERV_LOOP 8192 /* server causes forwarding loop */
! 484: #define SERV_DO_DNSSEC 16384 /* Validate DNSSEC when using this server */
1.1 misho 485:
486: struct serverfd {
487: int fd;
488: union mysockaddr source_addr;
489: char interface[IF_NAMESIZE+1];
490: struct serverfd *next;
491: };
492:
493: struct randfd {
494: int fd;
495: unsigned short refcount, family;
496: };
497:
498: struct server {
499: union mysockaddr addr, source_addr;
500: char interface[IF_NAMESIZE+1];
501: struct serverfd *sfd;
502: char *domain; /* set if this server only handles a domain. */
1.1.1.3 ! misho 503: int flags, tcpfd, edns_pktsz;
1.1 misho 504: unsigned int queries, failed_queries;
1.1.1.3 ! misho 505: #ifdef HAVE_LOOP
! 506: u32 uid;
! 507: #endif
1.1 misho 508: struct server *next;
509: };
510:
511: struct ipsets {
512: char **sets;
513: char *domain;
514: struct ipsets *next;
515: };
516:
517: struct irec {
518: union mysockaddr addr;
519: struct in_addr netmask; /* only valid for IPv4 */
1.1.1.2 misho 520: int tftp_ok, dhcp_ok, mtu, done, warned, dad, dns_auth, index, multicast_done, found;
1.1 misho 521: char *name;
522: struct irec *next;
523: };
524:
525: struct listener {
526: int fd, tcpfd, tftpfd, family;
527: struct irec *iface; /* only sometimes valid for non-wildcard */
528: struct listener *next;
529: };
530:
531: /* interface and address parms from command line. */
532: struct iname {
533: char *name;
534: union mysockaddr addr;
535: int used;
536: struct iname *next;
537: };
538:
1.1.1.3 ! misho 539: /* subnet parameters from command line */
! 540: struct mysubnet {
! 541: union mysockaddr addr;
! 542: int addr_used;
! 543: int mask;
! 544: };
! 545:
1.1 misho 546: /* resolv-file parms from command-line */
547: struct resolvc {
548: struct resolvc *next;
549: int is_default, logged;
550: time_t mtime;
551: char *name;
1.1.1.3 ! misho 552: #ifdef HAVE_INOTIFY
! 553: int wd; /* inotify watch descriptor */
! 554: char *file; /* pointer to file part if path */
! 555: #endif
1.1 misho 556: };
557:
1.1.1.3 ! misho 558: /* adn-hosts parms from command-line (also dhcp-hostsfile and dhcp-optsfile and dhcp-hostsdir*/
1.1 misho 559: #define AH_DIR 1
560: #define AH_INACTIVE 2
1.1.1.3 ! misho 561: #define AH_WD_DONE 4
! 562: #define AH_HOSTS 8
! 563: #define AH_DHCP_HST 16
! 564: #define AH_DHCP_OPT 32
1.1 misho 565: struct hostsfile {
566: struct hostsfile *next;
567: int flags;
568: char *fname;
1.1.1.3 ! misho 569: #ifdef HAVE_INOTIFY
! 570: int wd; /* inotify watch descriptor */
! 571: #endif
1.1.1.2 misho 572: unsigned int index; /* matches to cache entries for logging */
1.1 misho 573: };
574:
1.1.1.2 misho 575:
576: /* DNSSEC status values. */
577: #define STAT_SECURE 1
578: #define STAT_INSECURE 2
579: #define STAT_BOGUS 3
580: #define STAT_NEED_DS 4
581: #define STAT_NEED_KEY 5
582: #define STAT_TRUNCATED 6
583: #define STAT_SECURE_WILDCARD 7
1.1.1.3 ! misho 584: #define STAT_OK 8
! 585: #define STAT_ABANDONED 9
1.1.1.2 misho 586:
1.1 misho 587: #define FREC_NOREBIND 1
588: #define FREC_CHECKING_DISABLED 2
1.1.1.2 misho 589: #define FREC_HAS_SUBNET 4
590: #define FREC_DNSKEY_QUERY 8
591: #define FREC_DS_QUERY 16
592: #define FREC_AD_QUESTION 32
593: #define FREC_DO_QUESTION 64
594: #define FREC_ADDED_PHEADER 128
1.1.1.3 ! misho 595: #define FREC_TEST_PKTSZ 256
! 596: #define FREC_HAS_EXTRADATA 512
1.1.1.2 misho 597:
598: #ifdef HAVE_DNSSEC
599: #define HASH_SIZE 20 /* SHA-1 digest size */
600: #else
601: #define HASH_SIZE sizeof(int)
602: #endif
1.1 misho 603:
604: struct frec {
605: union mysockaddr source;
606: struct all_addr dest;
607: struct server *sentto; /* NULL means free */
608: struct randfd *rfd4;
609: #ifdef HAVE_IPV6
610: struct randfd *rfd6;
611: #endif
612: unsigned int iface;
613: unsigned short orig_id, new_id;
1.1.1.3 ! misho 614: int log_id, fd, forwardall, flags;
1.1 misho 615: time_t time;
1.1.1.2 misho 616: unsigned char *hash[HASH_SIZE];
617: #ifdef HAVE_DNSSEC
618: int class, work_counter;
619: struct blockdata *stash; /* Saved reply, whilst we validate */
620: size_t stash_len;
621: struct frec *dependent; /* Query awaiting internally-generated DNSKEY or DS query */
622: struct frec *blocking_query; /* Query which is blocking us. */
623: #endif
1.1 misho 624: struct frec *next;
625: };
626:
627: /* flags in top of length field for DHCP-option tables */
628: #define OT_ADDR_LIST 0x8000
629: #define OT_RFC1035_NAME 0x4000
630: #define OT_INTERNAL 0x2000
631: #define OT_NAME 0x1000
632: #define OT_CSTRING 0x0800
633: #define OT_DEC 0x0400
634: #define OT_TIME 0x0200
635:
636: /* actions in the daemon->helper RPC */
637: #define ACTION_DEL 1
638: #define ACTION_OLD_HOSTNAME 2
639: #define ACTION_OLD 3
640: #define ACTION_ADD 4
641: #define ACTION_TFTP 5
1.1.1.3 ! misho 642: #define ACTION_ARP 6
! 643: #define ACTION_ARP_DEL 7
1.1 misho 644:
645: #define LEASE_NEW 1 /* newly created */
646: #define LEASE_CHANGED 2 /* modified */
647: #define LEASE_AUX_CHANGED 4 /* CLID or expiry changed */
648: #define LEASE_AUTH_NAME 8 /* hostname came from config, not from client */
649: #define LEASE_USED 16 /* used this DHCPv6 transaction */
650: #define LEASE_NA 32 /* IPv6 no-temporary lease */
651: #define LEASE_TA 64 /* IPv6 temporary lease */
652: #define LEASE_HAVE_HWADDR 128 /* Have set hwaddress */
653:
654: struct dhcp_lease {
655: int clid_len; /* length of client identifier */
656: unsigned char *clid; /* clientid */
657: char *hostname, *fqdn; /* name from client-hostname option or config */
658: char *old_hostname; /* hostname before it moved to another lease */
659: int flags;
660: time_t expires; /* lease expiry */
661: #ifdef HAVE_BROKEN_RTC
662: unsigned int length;
663: #endif
1.1.1.2 misho 664: int hwaddr_len, hwaddr_type;
665: unsigned char hwaddr[DHCP_CHADDR_MAX];
1.1 misho 666: struct in_addr addr, override, giaddr;
667: unsigned char *extradata;
668: unsigned int extradata_len, extradata_size;
669: int last_interface;
1.1.1.3 ! misho 670: int new_interface; /* save possible originated interface */
! 671: int new_prefixlen; /* and its prefix length */
1.1 misho 672: #ifdef HAVE_DHCP6
1.1.1.2 misho 673: struct in6_addr addr6;
674: int iaid;
1.1 misho 675: struct slaac_address {
1.1.1.2 misho 676: struct in6_addr addr;
1.1 misho 677: time_t ping_time;
678: int backoff; /* zero -> confirmed */
679: struct slaac_address *next;
680: } *slaac_address;
681: int vendorclass_count;
682: #endif
683: struct dhcp_lease *next;
684: };
685:
686: struct dhcp_netid {
687: char *net;
688: struct dhcp_netid *next;
689: };
690:
691: struct dhcp_netid_list {
692: struct dhcp_netid *list;
693: struct dhcp_netid_list *next;
694: };
695:
696: struct tag_if {
697: struct dhcp_netid_list *set;
698: struct dhcp_netid *tag;
699: struct tag_if *next;
700: };
701:
702: struct hwaddr_config {
703: int hwaddr_len, hwaddr_type;
704: unsigned char hwaddr[DHCP_CHADDR_MAX];
705: unsigned int wildcard_mask;
706: struct hwaddr_config *next;
707: };
708:
709: struct dhcp_config {
710: unsigned int flags;
711: int clid_len; /* length of client identifier */
712: unsigned char *clid; /* clientid */
713: char *hostname, *domain;
714: struct dhcp_netid_list *netid;
715: #ifdef HAVE_DHCP6
716: struct in6_addr addr6;
717: #endif
718: struct in_addr addr;
719: time_t decline_time;
720: unsigned int lease_time;
721: struct hwaddr_config *hwaddr;
722: struct dhcp_config *next;
723: };
724:
725: #define have_config(config, mask) ((config) && ((config)->flags & (mask)))
726:
727: #define CONFIG_DISABLE 1
728: #define CONFIG_CLID 2
729: #define CONFIG_TIME 8
730: #define CONFIG_NAME 16
731: #define CONFIG_ADDR 32
732: #define CONFIG_NOCLID 128
733: #define CONFIG_FROM_ETHERS 256 /* entry created by /etc/ethers */
734: #define CONFIG_ADDR_HOSTS 512 /* address added by from /etc/hosts */
735: #define CONFIG_DECLINED 1024 /* address declined by client */
736: #define CONFIG_BANK 2048 /* from dhcp hosts file */
737: #define CONFIG_ADDR6 4096
738: #define CONFIG_WILDCARD 8192
739:
740: struct dhcp_opt {
741: int opt, len, flags;
742: union {
743: int encap;
744: unsigned int wildcard_mask;
745: unsigned char *vendor_class;
746: } u;
747: unsigned char *val;
748: struct dhcp_netid *netid;
749: struct dhcp_opt *next;
750: };
751:
752: #define DHOPT_ADDR 1
753: #define DHOPT_STRING 2
754: #define DHOPT_ENCAPSULATE 4
755: #define DHOPT_ENCAP_MATCH 8
756: #define DHOPT_FORCE 16
757: #define DHOPT_BANK 32
758: #define DHOPT_ENCAP_DONE 64
759: #define DHOPT_MATCH 128
760: #define DHOPT_VENDOR 256
761: #define DHOPT_HEX 512
762: #define DHOPT_VENDOR_MATCH 1024
763: #define DHOPT_RFC3925 2048
764: #define DHOPT_TAGOK 4096
765: #define DHOPT_ADDR6 8192
766:
767: struct dhcp_boot {
768: char *file, *sname, *tftp_sname;
769: struct in_addr next_server;
770: struct dhcp_netid *netid;
771: struct dhcp_boot *next;
772: };
773:
774: struct pxe_service {
775: unsigned short CSA, type;
776: char *menu, *basename, *sname;
777: struct in_addr server;
778: struct dhcp_netid *netid;
779: struct pxe_service *next;
780: };
781:
782: #define MATCH_VENDOR 1
783: #define MATCH_USER 2
784: #define MATCH_CIRCUIT 3
785: #define MATCH_REMOTE 4
786: #define MATCH_SUBSCRIBER 5
787:
788: /* vendorclass, userclass, remote-id or cicuit-id */
789: struct dhcp_vendor {
790: int len, match_type;
791: unsigned int enterprise;
792: char *data;
793: struct dhcp_netid netid;
794: struct dhcp_vendor *next;
795: };
796:
797: struct dhcp_mac {
798: unsigned int mask;
799: int hwaddr_len, hwaddr_type;
800: unsigned char hwaddr[DHCP_CHADDR_MAX];
801: struct dhcp_netid netid;
802: struct dhcp_mac *next;
803: };
804:
805: struct dhcp_bridge {
806: char iface[IF_NAMESIZE];
807: struct dhcp_bridge *alias, *next;
808: };
809:
810: struct cond_domain {
1.1.1.2 misho 811: char *domain, *prefix;
1.1 misho 812: struct in_addr start, end;
813: #ifdef HAVE_IPV6
814: struct in6_addr start6, end6;
815: #endif
816: int is6;
817: struct cond_domain *next;
818: };
819:
820: #ifdef OPTION6_PREFIX_CLASS
821: struct prefix_class {
822: int class;
823: struct dhcp_netid tag;
824: struct prefix_class *next;
825: };
826: #endif
827:
1.1.1.2 misho 828: struct ra_interface {
829: char *name;
830: int interval, lifetime, prio;
831: struct ra_interface *next;
832: };
833:
1.1 misho 834: struct dhcp_context {
835: unsigned int lease_time, addr_epoch;
836: struct in_addr netmask, broadcast;
837: struct in_addr local, router;
838: struct in_addr start, end; /* range of available addresses */
839: #ifdef HAVE_DHCP6
840: struct in6_addr start6, end6; /* range of available addresses */
841: struct in6_addr local6;
842: int prefix, if_index;
1.1.1.2 misho 843: unsigned int valid, preferred, saved_valid;
844: time_t ra_time, ra_short_period_start, address_lost_time;
1.1 misho 845: char *template_interface;
846: #endif
847: int flags;
848: struct dhcp_netid netid, *filter;
849: struct dhcp_context *next, *current;
850: };
851:
1.1.1.2 misho 852: #define CONTEXT_STATIC (1u<<0)
853: #define CONTEXT_NETMASK (1u<<1)
854: #define CONTEXT_BRDCAST (1u<<2)
855: #define CONTEXT_PROXY (1u<<3)
1.1.1.3 ! misho 856: #define CONTEXT_RA_ROUTER (1u<<4)
1.1.1.2 misho 857: #define CONTEXT_RA_DONE (1u<<5)
858: #define CONTEXT_RA_NAME (1u<<6)
859: #define CONTEXT_RA_STATELESS (1u<<7)
860: #define CONTEXT_DHCP (1u<<8)
861: #define CONTEXT_DEPRECATE (1u<<9)
862: #define CONTEXT_TEMPLATE (1u<<10) /* create contexts using addresses */
863: #define CONTEXT_CONSTRUCTED (1u<<11)
864: #define CONTEXT_GC (1u<<12)
865: #define CONTEXT_RA (1u<<13)
866: #define CONTEXT_CONF_USED (1u<<14)
867: #define CONTEXT_USED (1u<<15)
868: #define CONTEXT_OLD (1u<<16)
869: #define CONTEXT_V6 (1u<<17)
1.1.1.3 ! misho 870: #define CONTEXT_RA_OFF_LINK (1u<<18)
1.1 misho 871:
872: struct ping_result {
873: struct in_addr addr;
874: time_t time;
875: unsigned int hash;
876: struct ping_result *next;
877: };
878:
879: struct tftp_file {
880: int refcount, fd;
881: off_t size;
882: dev_t dev;
883: ino_t inode;
884: char filename[];
885: };
886:
887: struct tftp_transfer {
888: int sockfd;
889: time_t timeout;
890: int backoff;
891: unsigned int block, blocksize, expansion;
892: off_t offset;
893: union mysockaddr peer;
894: char opt_blocksize, opt_transize, netascii, carrylf;
895: struct tftp_file *file;
896: struct tftp_transfer *next;
897: };
898:
899: struct addr_list {
900: struct in_addr addr;
901: struct addr_list *next;
902: };
903:
904: struct tftp_prefix {
905: char *interface;
906: char *prefix;
1.1.1.3 ! misho 907: int missing;
1.1 misho 908: struct tftp_prefix *next;
909: };
910:
1.1.1.2 misho 911: struct dhcp_relay {
912: struct all_addr local, server;
913: char *interface; /* Allowable interface for replies from server, and dest for IPv6 multicast */
914: int iface_index; /* working - interface in which requests arrived, for return */
915: struct dhcp_relay *current, *next;
916: };
1.1 misho 917:
918: extern struct daemon {
919: /* datastuctures representing the command-line and
920: config file arguments. All set (including defaults)
921: in option.c */
922:
923: unsigned int options, options2;
924: struct resolvc default_resolv, *resolv_files;
925: time_t last_resolv;
1.1.1.2 misho 926: char *servers_file;
1.1 misho 927: struct mx_srv_record *mxnames;
928: struct naptr *naptr;
929: struct txt_record *txt, *rr;
930: struct ptr_record *ptr;
931: struct host_record *host_records, *host_records_tail;
932: struct cname *cnames;
933: struct auth_zone *auth_zones;
934: struct interface_name *int_names;
935: char *mxtarget;
1.1.1.3 ! misho 936: struct mysubnet *add_subnet4;
! 937: struct mysubnet *add_subnet6;
! 938: char *lease_file;
1.1 misho 939: char *username, *groupname, *scriptuser;
940: char *luascript;
941: char *authserver, *hostmaster;
942: struct iname *authinterface;
943: struct name_list *secondary_forward_server;
944: int group_set, osport;
945: char *domain_suffix;
1.1.1.2 misho 946: struct cond_domain *cond_domain, *synth_domains;
1.1 misho 947: char *runfile;
948: char *lease_change_command;
1.1.1.2 misho 949: struct iname *if_names, *if_addrs, *if_except, *dhcp_except, *auth_peers, *tftp_interfaces;
1.1.1.3 ! misho 950: struct bogus_addr *bogus_addr, *ignore_addr;
1.1 misho 951: struct server *servers;
952: struct ipsets *ipsets;
953: int log_fac; /* log facility */
954: char *log_file; /* optional log file */
955: int max_logs; /* queue limit */
956: int cachesize, ftabsize;
1.1.1.3 ! misho 957: int port, query_port, min_port, max_port;
! 958: unsigned long local_ttl, neg_ttl, max_ttl, min_cache_ttl, max_cache_ttl, auth_ttl, dhcp_ttl, use_dhcp_ttl;
! 959: char *dns_client_id;
1.1 misho 960: struct hostsfile *addn_hosts;
961: struct dhcp_context *dhcp, *dhcp6;
1.1.1.2 misho 962: struct ra_interface *ra_interfaces;
1.1 misho 963: struct dhcp_config *dhcp_conf;
964: struct dhcp_opt *dhcp_opts, *dhcp_match, *dhcp_opts6, *dhcp_match6;
965: struct dhcp_vendor *dhcp_vendors;
966: struct dhcp_mac *dhcp_macs;
967: struct dhcp_boot *boot_config;
968: struct pxe_service *pxe_services;
969: struct tag_if *tag_if;
970: struct addr_list *override_relays;
1.1.1.2 misho 971: struct dhcp_relay *relay4, *relay6;
1.1 misho 972: int override;
973: int enable_pxe;
974: int doing_ra, doing_dhcp6;
975: struct dhcp_netid_list *dhcp_ignore, *dhcp_ignore_names, *dhcp_gen_names;
976: struct dhcp_netid_list *force_broadcast, *bootp_dynamic;
1.1.1.3 ! misho 977: struct hostsfile *dhcp_hosts_file, *dhcp_opts_file, *dynamic_dirs;
! 978: int dhcp_max, tftp_max, tftp_mtu;
1.1 misho 979: int dhcp_server_port, dhcp_client_port;
980: int start_tftp_port, end_tftp_port;
981: unsigned int min_leasetime;
982: struct doctor *doctors;
983: unsigned short edns_pktsz;
984: char *tftp_prefix;
985: struct tftp_prefix *if_prefix; /* per-interface TFTP prefixes */
986: unsigned int duid_enterprise, duid_config_len;
987: unsigned char *duid_config;
988: char *dbus_name;
989: unsigned long soa_sn, soa_refresh, soa_retry, soa_expiry;
990: #ifdef OPTION6_PREFIX_CLASS
991: struct prefix_class *prefix_classes;
992: #endif
1.1.1.2 misho 993: #ifdef HAVE_DNSSEC
994: struct ds_config *ds;
1.1.1.3 ! misho 995: int back_to_the_future;
! 996: char *timestamp_file;
1.1.1.2 misho 997: #endif
1.1 misho 998:
999: /* globally used stuff for DNS */
1000: char *packet; /* packet buffer */
1001: int packet_buff_sz; /* size of above */
1002: char *namebuff; /* MAXDNAME size buffer */
1.1.1.2 misho 1003: #ifdef HAVE_DNSSEC
1004: char *keyname; /* MAXDNAME size buffer */
1005: char *workspacename; /* ditto */
1006: #endif
1007: unsigned int local_answer, queries_forwarded, auth_answer;
1.1 misho 1008: struct frec *frec_list;
1009: struct serverfd *sfds;
1010: struct irec *interfaces;
1011: struct listener *listeners;
1012: struct server *last_server;
1013: time_t forwardtime;
1014: int forwardcount;
1015: struct server *srv_save; /* Used for resend on DoD */
1016: size_t packet_len; /* " " */
1017: struct randfd *rfd_save; /* " " */
1018: pid_t tcp_pids[MAX_PROCS];
1019: struct randfd randomsocks[RANDOM_SOCKS];
1020: int v6pktinfo;
1.1.1.2 misho 1021: struct addrlist *interface_addrs; /* list of all addresses/prefix lengths associated with all local interfaces */
1.1.1.3 ! misho 1022: int log_id, log_display_id; /* ids of transactions for logging */
! 1023: union mysockaddr *log_source_addr;
1.1 misho 1024:
1025: /* DHCP state */
1026: int dhcpfd, helperfd, pxefd;
1.1.1.3 ! misho 1027: #ifdef HAVE_INOTIFY
! 1028: int inotifyfd;
! 1029: #endif
1.1 misho 1030: #if defined(HAVE_LINUX_NETWORK)
1031: int netlinkfd;
1032: #elif defined(HAVE_BSD_NETWORK)
1.1.1.2 misho 1033: int dhcp_raw_fd, dhcp_icmp_fd, routefd;
1.1 misho 1034: #endif
1035: struct iovec dhcp_packet;
1036: char *dhcp_buff, *dhcp_buff2, *dhcp_buff3;
1037: struct ping_result *ping_results;
1038: FILE *lease_stream;
1039: struct dhcp_bridge *bridges;
1040: #ifdef HAVE_DHCP6
1041: int duid_len;
1042: unsigned char *duid;
1043: struct iovec outpacket;
1044: int dhcp6fd, icmp6fd;
1045: #endif
1046: /* DBus stuff */
1047: /* void * here to avoid depending on dbus headers outside dbus.c */
1048: void *dbus;
1049: #ifdef HAVE_DBUS
1050: struct watch *watches;
1051: #endif
1052:
1053: /* TFTP stuff */
1054: struct tftp_transfer *tftp_trans, *tftp_done_trans;
1055:
1056: /* utility string buffer, hold max sized IP address as string */
1057: char *addrbuff;
1.1.1.3 ! misho 1058: char *addrbuff2; /* only allocated when OPT_EXTRALOG */
1.1 misho 1059:
1060: } *daemon;
1061:
1062: /* cache.c */
1063: void cache_init(void);
1064: void log_query(unsigned int flags, char *name, struct all_addr *addr, char *arg);
1.1.1.2 misho 1065: char *record_source(unsigned int index);
1066: char *querystr(char *desc, unsigned short type);
1.1 misho 1067: struct crec *cache_find_by_addr(struct crec *crecp,
1068: struct all_addr *addr, time_t now,
1.1.1.2 misho 1069: unsigned int prot);
1.1 misho 1070: struct crec *cache_find_by_name(struct crec *crecp,
1.1.1.2 misho 1071: char *name, time_t now, unsigned int prot);
1.1 misho 1072: void cache_end_insert(void);
1073: void cache_start_insert(void);
1074: struct crec *cache_insert(char *name, struct all_addr *addr,
1075: time_t now, unsigned long ttl, unsigned short flags);
1076: void cache_reload(void);
1077: void cache_add_dhcp_entry(char *host_name, int prot, struct all_addr *host_address, time_t ttd);
1078: struct in_addr a_record_from_hosts(char *name, time_t now);
1079: void cache_unhash_dhcp(void);
1080: void dump_cache(time_t now);
1.1.1.2 misho 1081: int cache_make_stat(struct txt_record *t);
1.1 misho 1082: char *cache_get_name(struct crec *crecp);
1.1.1.2 misho 1083: char *cache_get_cname_target(struct crec *crecp);
1.1 misho 1084: struct crec *cache_enumerate(int init);
1.1.1.3 ! misho 1085: int read_hostsfile(char *filename, unsigned int index, int cache_size,
! 1086: struct crec **rhash, int hashsz);
1.1.1.2 misho 1087:
1088: /* blockdata.c */
1089: #ifdef HAVE_DNSSEC
1090: void blockdata_init(void);
1091: void blockdata_report(void);
1092: struct blockdata *blockdata_alloc(char *data, size_t len);
1093: void *blockdata_retrieve(struct blockdata *block, size_t len, void *data);
1094: void blockdata_free(struct blockdata *blocks);
1095: #endif
1096:
1097: /* domain.c */
1.1 misho 1098: char *get_domain(struct in_addr addr);
1099: #ifdef HAVE_IPV6
1100: char *get_domain6(struct in6_addr *addr);
1101: #endif
1.1.1.2 misho 1102: int is_name_synthetic(int flags, char *name, struct all_addr *addr);
1103: int is_rev_synth(int flag, struct all_addr *addr, char *name);
1.1 misho 1104:
1105: /* rfc1035.c */
1.1.1.2 misho 1106: int extract_name(struct dns_header *header, size_t plen, unsigned char **pp,
1107: char *name, int isExtract, int extrabytes);
1108: unsigned char *skip_name(unsigned char *ansp, struct dns_header *header, size_t plen, int extrabytes);
1109: unsigned char *skip_questions(struct dns_header *header, size_t plen);
1110: unsigned char *skip_section(unsigned char *ansp, int count, struct dns_header *header, size_t plen);
1.1 misho 1111: unsigned int extract_request(struct dns_header *header, size_t qlen,
1112: char *name, unsigned short *typep);
1113: size_t setup_reply(struct dns_header *header, size_t qlen,
1114: struct all_addr *addrp, unsigned int flags,
1115: unsigned long local_ttl);
1116: int extract_addresses(struct dns_header *header, size_t qlen, char *namebuff,
1117: time_t now, char **ipsets, int is_sign, int checkrebind,
1.1.1.2 misho 1118: int no_cache, int secure, int *doctored);
1.1 misho 1119: size_t answer_request(struct dns_header *header, char *limit, size_t qlen,
1.1.1.2 misho 1120: struct in_addr local_addr, struct in_addr local_netmask,
1.1.1.3 ! misho 1121: time_t now, int ad_reqd, int do_bit, int have_pseudoheader);
1.1 misho 1122: int check_for_bogus_wildcard(struct dns_header *header, size_t qlen, char *name,
1123: struct bogus_addr *addr, time_t now);
1.1.1.3 ! misho 1124: int check_for_ignored_address(struct dns_header *header, size_t qlen, struct bogus_addr *baddr);
1.1 misho 1125: int check_for_local_domain(char *name, time_t now);
1126: unsigned int questions_crc(struct dns_header *header, size_t plen, char *buff);
1127: size_t resize_packet(struct dns_header *header, size_t plen,
1128: unsigned char *pheader, size_t hlen);
1129: int add_resource_record(struct dns_header *header, char *limit, int *truncp,
1130: int nameoffset, unsigned char **pp, unsigned long ttl,
1131: int *offset, unsigned short type, unsigned short class, char *format, ...);
1132: unsigned char *skip_questions(struct dns_header *header, size_t plen);
1133: int extract_name(struct dns_header *header, size_t plen, unsigned char **pp,
1134: char *name, int isExtract, int extrabytes);
1135: int in_arpa_name_2_addr(char *namein, struct all_addr *addrp);
1.1.1.2 misho 1136: int private_net(struct in_addr addr, int ban_localhost);
1.1 misho 1137:
1138: /* auth.c */
1139: #ifdef HAVE_AUTH
1.1.1.2 misho 1140: size_t answer_auth(struct dns_header *header, char *limit, size_t qlen,
1.1.1.3 ! misho 1141: time_t now, union mysockaddr *peer_addr, int local_query,
! 1142: int do_bit, int have_pseudoheader);
1.1.1.2 misho 1143: int in_zone(struct auth_zone *zone, char *name, char **cut);
1.1 misho 1144: #endif
1145:
1.1.1.2 misho 1146: /* dnssec.c */
1.1.1.3 ! misho 1147: size_t dnssec_generate_query(struct dns_header *header, unsigned char *end, char *name, int class, int type, union mysockaddr *addr, int edns_pktsz);
1.1.1.2 misho 1148: int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t n, char *name, char *keyname, int class);
1149: int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class);
1.1.1.3 ! misho 1150: int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int *class,
! 1151: int check_unsigned, int *neganswer, int *nons);
1.1.1.2 misho 1152: int dnskey_keytag(int alg, int flags, unsigned char *rdata, int rdlen);
1153: size_t filter_rrsigs(struct dns_header *header, size_t plen);
1154: unsigned char* hash_questions(struct dns_header *header, size_t plen, char *name);
1.1.1.3 ! misho 1155: int setup_timestamp(void);
1.1.1.2 misho 1156:
1.1 misho 1157: /* util.c */
1158: void rand_init(void);
1159: unsigned short rand16(void);
1.1.1.3 ! misho 1160: u32 rand32(void);
1.1.1.2 misho 1161: u64 rand64(void);
1.1 misho 1162: int legal_hostname(char *c);
1163: char *canonicalise(char *s, int *nomem);
1164: unsigned char *do_rfc1035_name(unsigned char *p, char *sval);
1165: void *safe_malloc(size_t size);
1166: void safe_pipe(int *fd, int read_noblock);
1167: void *whine_malloc(size_t size);
1168: int sa_len(union mysockaddr *addr);
1169: int sockaddr_isequal(union mysockaddr *s1, union mysockaddr *s2);
1170: int hostname_isequal(const char *a, const char *b);
1171: time_t dnsmasq_time(void);
1.1.1.3 ! misho 1172: int netmask_length(struct in_addr mask);
1.1 misho 1173: int is_same_net(struct in_addr a, struct in_addr b, struct in_addr mask);
1174: #ifdef HAVE_IPV6
1175: int is_same_net6(struct in6_addr *a, struct in6_addr *b, int prefixlen);
1176: u64 addr6part(struct in6_addr *addr);
1177: void setaddr6part(struct in6_addr *addr, u64 host);
1178: #endif
1.1.1.3 ! misho 1179: int retry_send(ssize_t rc);
1.1 misho 1180: void prettyprint_time(char *buf, unsigned int t);
1181: int prettyprint_addr(union mysockaddr *addr, char *buf);
1182: int parse_hex(char *in, unsigned char *out, int maxlen,
1183: unsigned int *wildcard_mask, int *mac_type);
1184: int memcmp_masked(unsigned char *a, unsigned char *b, int len,
1185: unsigned int mask);
1186: int expand_buf(struct iovec *iov, size_t size);
1187: char *print_mac(char *buff, unsigned char *mac, int len);
1188: int read_write(int fd, unsigned char *packet, int size, int rw);
1189:
1190: int wildcard_match(const char* wildcard, const char* match);
1.1.1.3 ! misho 1191: int wildcard_matchn(const char* wildcard, const char* match, int num);
1.1 misho 1192:
1193: /* log.c */
1194: void die(char *message, char *arg1, int exit_code);
1195: int log_start(struct passwd *ent_pw, int errfd);
1196: int log_reopen(char *log_file);
1197: void my_syslog(int priority, const char *format, ...);
1.1.1.3 ! misho 1198: void set_log_writer(void);
! 1199: void check_log_writer(int force);
1.1 misho 1200: void flush_log(void);
1201:
1202: /* option.c */
1203: void read_opts (int argc, char **argv, char *compile_opts);
1204: char *option_string(int prot, unsigned int opt, unsigned char *val,
1205: int opt_len, char *buf, int buf_len);
1206: void reread_dhcp(void);
1.1.1.2 misho 1207: void read_servers_file(void);
1.1 misho 1208: void set_option_bool(unsigned int opt);
1209: void reset_option_bool(unsigned int opt);
1210: struct hostsfile *expand_filelist(struct hostsfile *list);
1211: char *parse_server(char *arg, union mysockaddr *addr,
1212: union mysockaddr *source_addr, char *interface, int *flags);
1.1.1.3 ! misho 1213: int option_read_dynfile(char *file, int flags);
1.1 misho 1214:
1215: /* forward.c */
1216: void reply_query(int fd, int family, time_t now);
1217: void receive_query(struct listener *listen, time_t now);
1218: unsigned char *tcp_request(int confd, time_t now,
1219: union mysockaddr *local_addr, struct in_addr netmask, int auth_dns);
1220: void server_gone(struct server *server);
1.1.1.2 misho 1221: struct frec *get_new_frec(time_t now, int *wait, int force);
1.1 misho 1222: int send_from(int fd, int nowild, char *packet, size_t len,
1223: union mysockaddr *to, struct all_addr *source,
1224: unsigned int iface);
1.1.1.3 ! misho 1225: void resend_query();
! 1226: struct randfd *allocate_rfd(int family);
! 1227: void free_rfd(struct randfd *rfd);
1.1 misho 1228:
1229: /* network.c */
1230: int indextoname(int fd, int index, char *name);
1231: int local_bind(int fd, union mysockaddr *addr, char *intname, int is_tcp);
1232: int random_sock(int family);
1233: void pre_allocate_sfds(void);
1234: int reload_servers(char *fname);
1.1.1.2 misho 1235: void mark_servers(int flag);
1236: void cleanup_servers(void);
1237: void add_update_server(int flags,
1238: union mysockaddr *addr,
1239: union mysockaddr *source_addr,
1240: const char *interface,
1241: const char *domain);
1.1 misho 1242: void check_servers(void);
1.1.1.2 misho 1243: int enumerate_interfaces(int reset);
1.1 misho 1244: void create_wildcard_listeners(void);
1245: void create_bound_listeners(int die);
1.1.1.2 misho 1246: void warn_bound_listeners(void);
1247: void warn_int_names(void);
1.1 misho 1248: int is_dad_listeners(void);
1249: int iface_check(int family, struct all_addr *addr, char *name, int *auth_dns);
1250: int loopback_exception(int fd, int family, struct all_addr *addr, char *name);
1.1.1.2 misho 1251: int label_exception(int index, int family, struct all_addr *addr);
1.1 misho 1252: int fix_fd(int fd);
1253: int tcp_interface(int fd, int af);
1254: #ifdef HAVE_IPV6
1255: int set_ipv6pktinfo(int fd);
1256: #endif
1257: #ifdef HAVE_DHCP6
1258: void join_multicast(int dienow);
1259: #endif
1.1.1.2 misho 1260: #if defined(HAVE_LINUX_NETWORK) || defined(HAVE_BSD_NETWORK)
1261: void newaddress(time_t now);
1262: #endif
1263:
1.1 misho 1264:
1265: /* dhcp.c */
1266: #ifdef HAVE_DHCP
1267: void dhcp_init(void);
1268: void dhcp_packet(time_t now, int pxe_fd);
1269: struct dhcp_context *address_available(struct dhcp_context *context,
1270: struct in_addr addr,
1271: struct dhcp_netid *netids);
1272: struct dhcp_context *narrow_context(struct dhcp_context *context,
1273: struct in_addr taddr,
1274: struct dhcp_netid *netids);
1275: int address_allocate(struct dhcp_context *context,
1276: struct in_addr *addrp, unsigned char *hwaddr, int hw_len,
1277: struct dhcp_netid *netids, time_t now);
1278: void dhcp_read_ethers(void);
1279: struct dhcp_config *config_find_by_address(struct dhcp_config *configs, struct in_addr addr);
1280: char *host_from_dns(struct in_addr addr);
1281: #endif
1282:
1283: /* lease.c */
1284: #ifdef HAVE_DHCP
1285: void lease_update_file(time_t now);
1286: void lease_update_dns(int force);
1287: void lease_init(time_t now);
1288: struct dhcp_lease *lease4_allocate(struct in_addr addr);
1289: #ifdef HAVE_DHCP6
1290: struct dhcp_lease *lease6_allocate(struct in6_addr *addrp, int lease_type);
1291: struct dhcp_lease *lease6_find(unsigned char *clid, int clid_len,
1292: int lease_type, int iaid, struct in6_addr *addr);
1293: void lease6_reset(void);
1294: struct dhcp_lease *lease6_find_by_client(struct dhcp_lease *first, int lease_type, unsigned char *clid, int clid_len, int iaid);
1295: struct dhcp_lease *lease6_find_by_addr(struct in6_addr *net, int prefix, u64 addr);
1296: u64 lease_find_max_addr6(struct dhcp_context *context);
1297: void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface);
1298: void lease_update_slaac(time_t now);
1.1.1.2 misho 1299: void lease_set_iaid(struct dhcp_lease *lease, int iaid);
1300: void lease_make_duid(time_t now);
1.1 misho 1301: #endif
1.1.1.3 ! misho 1302: void lease_set_hwaddr(struct dhcp_lease *lease, const unsigned char *hwaddr,
! 1303: const unsigned char *clid, int hw_len, int hw_type,
! 1304: int clid_len, time_t now, int force);
! 1305: void lease_set_hostname(struct dhcp_lease *lease, const char *name, int auth, char *domain, char *config_domain);
1.1 misho 1306: void lease_set_expires(struct dhcp_lease *lease, unsigned int len, time_t now);
1307: void lease_set_interface(struct dhcp_lease *lease, int interface, time_t now);
1308: struct dhcp_lease *lease_find_by_client(unsigned char *hwaddr, int hw_len, int hw_type,
1309: unsigned char *clid, int clid_len);
1310: struct dhcp_lease *lease_find_by_addr(struct in_addr addr);
1311: struct in_addr lease_find_max_addr(struct dhcp_context *context);
1312: void lease_prune(struct dhcp_lease *target, time_t now);
1313: void lease_update_from_configs(void);
1314: int do_script_run(time_t now);
1315: void rerun_scripts(void);
1316: void lease_find_interfaces(time_t now);
1317: #ifdef HAVE_SCRIPT
1318: void lease_add_extradata(struct dhcp_lease *lease, unsigned char *data,
1319: unsigned int len, int delim);
1320: #endif
1321: #endif
1322:
1323: /* rfc2131.c */
1324: #ifdef HAVE_DHCP
1325: size_t dhcp_reply(struct dhcp_context *context, char *iface_name, int int_index,
1326: size_t sz, time_t now, int unicast_dest, int *is_inform, int pxe_fd, struct in_addr fallback);
1327: unsigned char *extended_hwaddr(int hwtype, int hwlen, unsigned char *hwaddr,
1328: int clid_len, unsigned char *clid, int *len_out);
1329: #endif
1330:
1331: /* dnsmasq.c */
1332: #ifdef HAVE_DHCP
1333: int make_icmp_sock(void);
1334: int icmp_ping(struct in_addr addr);
1335: #endif
1.1.1.3 ! misho 1336: void queue_event(int event);
1.1 misho 1337: void send_alarm(time_t event, time_t now);
1338: void send_event(int fd, int event, int data, char *msg);
1339: void clear_cache_and_reload(time_t now);
1340:
1341: /* netlink.c */
1342: #ifdef HAVE_LINUX_NETWORK
1343: void netlink_init(void);
1.1.1.3 ! misho 1344: void netlink_multicast(void);
1.1 misho 1345: #endif
1346:
1347: /* bpf.c */
1348: #ifdef HAVE_BSD_NETWORK
1349: void init_bpf(void);
1350: void send_via_bpf(struct dhcp_packet *mess, size_t len,
1351: struct in_addr iface_addr, struct ifreq *ifr);
1.1.1.2 misho 1352: void route_init(void);
1.1.1.3 ! misho 1353: void route_sock(void);
1.1 misho 1354: #endif
1355:
1356: /* bpf.c or netlink.c */
1357: int iface_enumerate(int family, void *parm, int (callback)());
1358:
1359: /* dbus.c */
1360: #ifdef HAVE_DBUS
1361: char *dbus_init(void);
1.1.1.3 ! misho 1362: void check_dbus_listeners(void);
! 1363: void set_dbus_listeners(void);
1.1 misho 1364: # ifdef HAVE_DHCP
1365: void emit_dbus_signal(int action, struct dhcp_lease *lease, char *hostname);
1366: # endif
1367: #endif
1368:
1369: /* ipset.c */
1370: #ifdef HAVE_IPSET
1371: void ipset_init(void);
1372: int add_to_ipset(const char *setname, const struct all_addr *ipaddr, int flags, int remove);
1373: #endif
1374:
1375: /* helper.c */
1376: #if defined(HAVE_SCRIPT)
1377: int create_helper(int event_fd, int err_fd, uid_t uid, gid_t gid, long max_fd);
1378: void helper_write(void);
1379: void queue_script(int action, struct dhcp_lease *lease,
1380: char *hostname, time_t now);
1381: #ifdef HAVE_TFTP
1382: void queue_tftp(off_t file_len, char *filename, union mysockaddr *peer);
1383: #endif
1.1.1.3 ! misho 1384: void queue_arp(int action, unsigned char *mac, int maclen,
! 1385: int family, struct all_addr *addr);
1.1 misho 1386: int helper_buf_empty(void);
1387: #endif
1388:
1389: /* tftp.c */
1390: #ifdef HAVE_TFTP
1391: void tftp_request(struct listener *listen, time_t now);
1.1.1.3 ! misho 1392: void check_tftp_listeners(time_t now);
1.1 misho 1393: int do_tftp_script_run(void);
1394: #endif
1395:
1396: /* conntrack.c */
1397: #ifdef HAVE_CONNTRACK
1398: int get_incoming_mark(union mysockaddr *peer_addr, struct all_addr *local_addr,
1399: int istcp, unsigned int *markp);
1400: #endif
1401:
1402: /* dhcp6.c */
1403: #ifdef HAVE_DHCP6
1404: void dhcp6_init(void);
1405: void dhcp6_packet(time_t now);
1.1.1.2 misho 1406: struct dhcp_context *address6_allocate(struct dhcp_context *context, unsigned char *clid, int clid_len, int temp_addr,
1.1 misho 1407: int iaid, int serial, struct dhcp_netid *netids, int plain_range, struct in6_addr *ans);
1408: int config_valid(struct dhcp_config *config, struct dhcp_context *context, struct in6_addr *addr);
1409: struct dhcp_context *address6_available(struct dhcp_context *context,
1410: struct in6_addr *taddr,
1411: struct dhcp_netid *netids,
1412: int plain_range);
1413: struct dhcp_context *address6_valid(struct dhcp_context *context,
1414: struct in6_addr *taddr,
1415: struct dhcp_netid *netids,
1416: int plain_range);
1417: struct dhcp_config *config_find_by_address6(struct dhcp_config *configs, struct in6_addr *net,
1418: int prefix, u64 addr);
1419: void make_duid(time_t now);
1420: void dhcp_construct_contexts(time_t now);
1.1.1.2 misho 1421: void get_client_mac(struct in6_addr *client, int iface, unsigned char *mac,
1.1.1.3 ! misho 1422: unsigned int *maclenp, unsigned int *mactypep, time_t now);
1.1 misho 1423: #endif
1.1.1.2 misho 1424:
1.1 misho 1425: /* rfc3315.c */
1426: #ifdef HAVE_DHCP6
1427: unsigned short dhcp6_reply(struct dhcp_context *context, int interface, char *iface_name,
1.1.1.2 misho 1428: struct in6_addr *fallback, struct in6_addr *ll_addr, struct in6_addr *ula_addr,
1429: size_t sz, struct in6_addr *client_addr, time_t now);
1.1.1.3 ! misho 1430: void relay_upstream6(struct dhcp_relay *relay, ssize_t sz, struct in6_addr *peer_address,
! 1431: u32 scope_id, time_t now);
1.1.1.2 misho 1432:
1433: unsigned short relay_reply6( struct sockaddr_in6 *peer, ssize_t sz, char *arrival_interface);
1.1 misho 1434: #endif
1435:
1436: /* dhcp-common.c */
1437: #ifdef HAVE_DHCP
1438: void dhcp_common_init(void);
1439: ssize_t recv_dhcp_packet(int fd, struct msghdr *msg);
1440: struct dhcp_netid *run_tag_if(struct dhcp_netid *input);
1441: struct dhcp_netid *option_filter(struct dhcp_netid *tags, struct dhcp_netid *context_tags,
1442: struct dhcp_opt *opts);
1443: int match_netid(struct dhcp_netid *check, struct dhcp_netid *pool, int negonly);
1444: char *strip_hostname(char *hostname);
1445: void log_tags(struct dhcp_netid *netid, u32 xid);
1446: int match_bytes(struct dhcp_opt *o, unsigned char *p, int len);
1447: void dhcp_update_configs(struct dhcp_config *configs);
1448: void display_opts(void);
1.1.1.2 misho 1449: int lookup_dhcp_opt(int prot, char *name);
1450: int lookup_dhcp_len(int prot, int val);
1.1 misho 1451: char *option_string(int prot, unsigned int opt, unsigned char *val,
1452: int opt_len, char *buf, int buf_len);
1.1.1.2 misho 1453: struct dhcp_config *find_config(struct dhcp_config *configs,
1454: struct dhcp_context *context,
1455: unsigned char *clid, int clid_len,
1456: unsigned char *hwaddr, int hw_len,
1457: int hw_type, char *hostname);
1458: int config_has_mac(struct dhcp_config *config, unsigned char *hwaddr, int len, int type);
1.1 misho 1459: #ifdef HAVE_LINUX_NETWORK
1.1.1.2 misho 1460: char *whichdevice(void);
1461: void bindtodevice(char *device, int fd);
1.1 misho 1462: #endif
1463: # ifdef HAVE_DHCP6
1464: void display_opts6(void);
1465: # endif
1466: void log_context(int family, struct dhcp_context *context);
1.1.1.2 misho 1467: void log_relay(int family, struct dhcp_relay *relay);
1.1 misho 1468: #endif
1469:
1470: /* outpacket.c */
1471: #ifdef HAVE_DHCP6
1472: void end_opt6(int container);
1473: int save_counter(int newval);
1474: void *expand(size_t headroom);
1475: int new_opt6(int opt);
1476: void *put_opt6(void *data, size_t len);
1477: void put_opt6_long(unsigned int val);
1478: void put_opt6_short(unsigned int val);
1479: void put_opt6_char(unsigned int val);
1480: void put_opt6_string(char *s);
1481: #endif
1482:
1483: /* radv.c */
1484: #ifdef HAVE_DHCP6
1485: void ra_init(time_t now);
1486: void icmp6_packet(time_t now);
1487: time_t periodic_ra(time_t now);
1488: void ra_start_unsolicted(time_t now, struct dhcp_context *context);
1489: #endif
1490:
1491: /* slaac.c */
1492: #ifdef HAVE_DHCP6
1493: void slaac_add_addrs(struct dhcp_lease *lease, time_t now, int force);
1494: time_t periodic_slaac(time_t now, struct dhcp_lease *leases);
1495: void slaac_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface, struct dhcp_lease *leases);
1496: #endif
1.1.1.3 ! misho 1497:
! 1498: /* loop.c */
! 1499: #ifdef HAVE_LOOP
! 1500: void loop_send_probes();
! 1501: int detect_loop(char *query, int type);
! 1502: #endif
! 1503:
! 1504: /* inotify.c */
! 1505: #ifdef HAVE_INOTIFY
! 1506: void inotify_dnsmasq_init();
! 1507: int inotify_check(time_t now);
! 1508: void set_dynamic_inotify(int flag, int total_size, struct crec **rhash, int revhashsz);
! 1509: #endif
! 1510:
! 1511: /* poll.c */
! 1512: void poll_reset(void);
! 1513: int poll_check(int fd, short event);
! 1514: void poll_listen(int fd, short event);
! 1515: int do_poll(int timeout);
! 1516:
! 1517: /* rrfilter.c */
! 1518: size_t rrfilter(struct dns_header *header, size_t plen, int mode);
! 1519: u16 *rrfilter_desc(int type);
! 1520: int expand_workspace(unsigned char ***wkspc, int *szp, int new);
! 1521:
! 1522: /* edns0.c */
! 1523: unsigned char *find_pseudoheader(struct dns_header *header, size_t plen,
! 1524: size_t *len, unsigned char **p, int *is_sign, int *is_last);
! 1525: size_t add_pseudoheader(struct dns_header *header, size_t plen, unsigned char *limit,
! 1526: unsigned short udp_sz, int optno, unsigned char *opt, size_t optlen, int set_do, int replace);
! 1527: size_t add_do_bit(struct dns_header *header, size_t plen, unsigned char *limit);
! 1528: size_t add_edns0_config(struct dns_header *header, size_t plen, unsigned char *limit,
! 1529: union mysockaddr *source, time_t now, int *check_subnet);
! 1530: int check_source(struct dns_header *header, size_t plen, unsigned char *pseudoheader, union mysockaddr *peer);
! 1531:
! 1532: /* arp.c */
! 1533: int find_mac(union mysockaddr *addr, unsigned char *mac, int lazy, time_t now);
! 1534: int do_arp_script_run(void);
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>