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