--- embedaddon/dnsmasq/src/dnsmasq.h 2013/07/29 19:37:40 1.1.1.1 +++ embedaddon/dnsmasq/src/dnsmasq.h 2014/06/15 16:31:38 1.1.1.2 @@ -1,4 +1,4 @@ -/* dnsmasq is Copyright (c) 2000-2013 Simon Kelley +/* dnsmasq is Copyright (c) 2000-2014 Simon Kelley This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -14,7 +14,7 @@ along with this program. If not, see . */ -#define COPYRIGHT "Copyright (c) 2000-2013 Simon Kelley" +#define COPYRIGHT "Copyright (c) 2000-2014 Simon Kelley" #ifndef NO_LARGEFILE /* Ensure we can use files >2GB (log files may grow this big) */ @@ -50,12 +50,16 @@ #include #include "config.h" +#include "ip6addr.h" typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; typedef unsigned long long u64; +#define countof(x) (long)(sizeof(x) / sizeof(x[0])) +#define MIN(a,b) ((a) < (b) ? (a) : (b)) + #include "dns-protocol.h" #include "dhcp-protocol.h" #ifdef HAVE_DHCP6 @@ -160,6 +164,7 @@ struct event_desc { #define EVENT_FORK_ERR 18 #define EVENT_LUA_ERR 19 #define EVENT_TFTP_ERR 20 +#define EVENT_INIT 21 /* Exit codes. */ #define EC_GOOD 0 @@ -213,7 +218,7 @@ struct event_desc { #define OPT_NO_OVERRIDE 30 #define OPT_NO_REBIND 31 #define OPT_ADD_MAC 32 -#define OPT_DNSSEC 33 +#define OPT_DNSSEC_PROXY 33 #define OPT_CONSEC_ADDR 34 #define OPT_CONNTRACK 35 #define OPT_FQDN_UPDATE 36 @@ -221,7 +226,16 @@ struct event_desc { #define OPT_TFTP_LC 38 #define OPT_CLEVERBIND 39 #define OPT_TFTP 40 -#define OPT_LAST 41 +#define OPT_CLIENT_SUBNET 41 +#define OPT_QUIET_DHCP 42 +#define OPT_QUIET_DHCP6 43 +#define OPT_QUIET_RA 44 +#define OPT_DNSSEC_VALID 45 +#define OPT_DNSSEC_TIME 46 +#define OPT_DNSSEC_DEBUG 47 +#define OPT_DNSSEC_NO_SIGN 48 +#define OPT_LOCAL_SERVICE 49 +#define OPT_LAST 50 /* extra flags for my_syslog, we use a couple of facilities since they are known not to occupy the same bits as priorities, no matter how syslog.h is set up. */ @@ -234,6 +248,12 @@ struct all_addr { #ifdef HAVE_IPV6 struct in6_addr addr6; #endif + /* for log_query */ + unsigned int keytag; + /* for cache_insert if RRSIG, DNSKEY, DS */ + struct { + unsigned short class, type; + } dnssec; } addr; }; @@ -261,10 +281,19 @@ struct naptr { struct naptr *next; }; +#define TXT_STAT_CACHESIZE 1 +#define TXT_STAT_INSERTS 2 +#define TXT_STAT_EVICTIONS 3 +#define TXT_STAT_MISSES 4 +#define TXT_STAT_HITS 5 +#define TXT_STAT_AUTH 6 +#define TXT_STAT_SERVERS 7 + struct txt_record { char *name; unsigned char *txt; unsigned short class, len; + int stat; struct txt_record *next; }; @@ -276,18 +305,34 @@ struct ptr_record { struct cname { char *alias, *target; struct cname *next; +}; + +struct ds_config { + char *name, *digest; + int digestlen, class, algo, keytag, digest_type; + struct ds_config *next; }; +#define ADDRLIST_LITERAL 1 +#define ADDRLIST_IPV6 2 + +struct addrlist { + struct all_addr addr; + int flags, prefixlen; + struct addrlist *next; +}; + +#define AUTH6 1 +#define AUTH4 2 + struct auth_zone { char *domain; - struct subnet { - int is6, prefixlen; - struct in_addr addr4; -#ifdef HAVE_IPV6 - struct in6_addr addr6; -#endif - struct subnet *next; - } *subnet; + struct auth_name_list { + char *name; + int flags; + struct auth_name_list *next; + } *interface_names; + struct addrlist *subnet; struct auth_zone *next; }; @@ -307,6 +352,8 @@ struct host_record { struct interface_name { char *name; /* domain name */ char *intr; /* interface name */ + int family; /* AF_INET, AF_INET6 or zero for both */ + struct addrlist *addr; struct interface_name *next; }; @@ -315,8 +362,8 @@ union bigname { union bigname *next; /* freelist */ }; -struct keydata { - struct keydata *next; +struct blockdata { + struct blockdata *next; unsigned char key[KEYBLOCK_LEN]; }; @@ -326,19 +373,32 @@ struct crec { union { struct all_addr addr; struct { - struct crec *cache; - int uid; + union { + struct crec *cache; + struct interface_name *int_name; + } target; + unsigned int uid; /* 0 if union is interface-name */ } cname; struct { - struct keydata *keydata; + struct blockdata *keydata; + unsigned short keylen, flags, keytag; unsigned char algo; - unsigned char digest; /* DS only */ - unsigned short flags_or_keyid; /* flags for DNSKEY, keyid for DS */ - } key; + } key; + struct { + struct blockdata *keydata; + unsigned short keylen, keytag; + unsigned char algo; + unsigned char digest; + } ds; + struct { + struct blockdata *keydata; + unsigned short keylen, type_covered, keytag; + char algo; + } sig; } addr; time_t ttd; /* time to die */ - /* used as keylen if F_DS or F_DNSKEY, index to source for F_HOSTS */ - int uid; + /* used as class if DNSKEY/DS/RRSIG, index to source for F_HOSTS */ + unsigned int uid; unsigned short flags; union { char sname[SMALLDNAME]; @@ -372,12 +432,19 @@ struct crec { #define F_QUERY (1u<<19) #define F_NOERR (1u<<20) #define F_AUTH (1u<<21) +#define F_DNSSEC (1u<<22) +#define F_KEYTAG (1u<<23) +#define F_SECSTAT (1u<<24) +#define F_NO_RR (1u<<25) +#define F_IPSET (1u<<26) -/* composites */ -#define F_TYPE (F_IPV4 | F_IPV6 | F_DNSKEY | F_DS) /* Only one may be set */ +/* Values of uid in crecs with F_CONFIG bit set. */ +#define SRC_INTERFACE 0 +#define SRC_CONFIG 1 +#define SRC_HOSTS 2 +#define SRC_AH 3 - /* struct sockaddr is not large enough to hold any address, and specifically not big enough to hold an IPv6 address. Blech. Roll our own. */ @@ -392,6 +459,7 @@ union mysockaddr { /* bits in flag param to IPv6 callbacks from iface_enumerate() */ #define IFACE_TENTATIVE 1 #define IFACE_DEPRECATED 2 +#define IFACE_PERMANENT 4 #define SERV_FROM_RESOLV 1 /* 1 for servers from resolv, 0 for command line. */ @@ -407,6 +475,7 @@ union mysockaddr { #define SERV_COUNTED 512 /* workspace for log code */ #define SERV_USE_RESOLV 1024 /* forward this domain in the normal way */ #define SERV_NO_REBIND 2048 /* inhibit dns-rebind protection */ +#define SERV_FROM_FILE 4096 /* read from --servers-file */ struct serverfd { int fd; @@ -439,7 +508,7 @@ struct ipsets { struct irec { union mysockaddr addr; struct in_addr netmask; /* only valid for IPv4 */ - int tftp_ok, dhcp_ok, mtu, done, dad, dns_auth, index, multicast_done; + int tftp_ok, dhcp_ok, mtu, done, warned, dad, dns_auth, index, multicast_done, found; char *name; struct irec *next; }; @@ -473,12 +542,39 @@ struct hostsfile { struct hostsfile *next; int flags; char *fname; - int index; /* matches to cache entries for logging */ + unsigned int index; /* matches to cache entries for logging */ }; + +/* DNSSEC status values. */ +#define STAT_SECURE 1 +#define STAT_INSECURE 2 +#define STAT_BOGUS 3 +#define STAT_NEED_DS 4 +#define STAT_NEED_KEY 5 +#define STAT_TRUNCATED 6 +#define STAT_SECURE_WILDCARD 7 +#define STAT_NO_SIG 8 +#define STAT_NO_DS 9 +#define STAT_NEED_DS_NEG 10 +#define STAT_CHASE_CNAME 11 + #define FREC_NOREBIND 1 #define FREC_CHECKING_DISABLED 2 +#define FREC_HAS_SUBNET 4 +#define FREC_DNSKEY_QUERY 8 +#define FREC_DS_QUERY 16 +#define FREC_AD_QUESTION 32 +#define FREC_DO_QUESTION 64 +#define FREC_ADDED_PHEADER 128 +#define FREC_CHECK_NOSIGN 256 +#ifdef HAVE_DNSSEC +#define HASH_SIZE 20 /* SHA-1 digest size */ +#else +#define HASH_SIZE sizeof(int) +#endif + struct frec { union mysockaddr source; struct all_addr dest; @@ -490,8 +586,15 @@ struct frec { unsigned int iface; unsigned short orig_id, new_id; int fd, forwardall, flags; - unsigned int crc; time_t time; + unsigned char *hash[HASH_SIZE]; +#ifdef HAVE_DNSSEC + int class, work_counter; + struct blockdata *stash; /* Saved reply, whilst we validate */ + size_t stash_len; + struct frec *dependent; /* Query awaiting internally-generated DNSKEY or DS query */ + struct frec *blocking_query; /* Query which is blocking us. */ +#endif struct frec *next; }; @@ -530,15 +633,17 @@ struct dhcp_lease { #ifdef HAVE_BROKEN_RTC unsigned int length; #endif - int hwaddr_len, hwaddr_type; /* hw_type used for iaid in v6 */ - unsigned char hwaddr[DHCP_CHADDR_MAX]; /* also IPv6 address */ + int hwaddr_len, hwaddr_type; + unsigned char hwaddr[DHCP_CHADDR_MAX]; struct in_addr addr, override, giaddr; unsigned char *extradata; unsigned int extradata_len, extradata_size; int last_interface; #ifdef HAVE_DHCP6 + struct in6_addr addr6; + int iaid; struct slaac_address { - struct in6_addr addr, local; + struct in6_addr addr; time_t ping_time; int backoff; /* zero -> confirmed */ struct slaac_address *next; @@ -673,7 +778,7 @@ struct dhcp_bridge { }; struct cond_domain { - char *domain; + char *domain, *prefix; struct in_addr start, end; #ifdef HAVE_IPV6 struct in6_addr start6, end6; @@ -690,6 +795,12 @@ struct prefix_class { }; #endif +struct ra_interface { + char *name; + int interval, lifetime, prio; + struct ra_interface *next; +}; + struct dhcp_context { unsigned int lease_time, addr_epoch; struct in_addr netmask, broadcast; @@ -699,8 +810,8 @@ struct dhcp_context { struct in6_addr start6, end6; /* range of available addresses */ struct in6_addr local6; int prefix, if_index; - unsigned int valid, preferred; - time_t ra_time, ra_short_period_start; + unsigned int valid, preferred, saved_valid; + time_t ra_time, ra_short_period_start, address_lost_time; char *template_interface; #endif int flags; @@ -708,23 +819,26 @@ struct dhcp_context { struct dhcp_context *next, *current; }; -#define CONTEXT_STATIC 1 -#define CONTEXT_NETMASK 2 -#define CONTEXT_BRDCAST 4 -#define CONTEXT_PROXY 8 -#define CONTEXT_RA_ONLY 16 -#define CONTEXT_RA_DONE 32 -#define CONTEXT_RA_NAME 64 -#define CONTEXT_RA_STATELESS 128 -#define CONTEXT_DHCP 256 -#define CONTEXT_DEPRECATE 512 -#define CONTEXT_TEMPLATE 1024 /* create contexts using addresses */ -#define CONTEXT_CONSTRUCTED 2048 -#define CONTEXT_GC 4096 -#define CONTEXT_RA 8192 -#define CONTEXT_CONF_USED 16384 -#define CONTEXT_USED 32768 +#define CONTEXT_STATIC (1u<<0) +#define CONTEXT_NETMASK (1u<<1) +#define CONTEXT_BRDCAST (1u<<2) +#define CONTEXT_PROXY (1u<<3) +#define CONTEXT_RA_ONLY (1u<<4) +#define CONTEXT_RA_DONE (1u<<5) +#define CONTEXT_RA_NAME (1u<<6) +#define CONTEXT_RA_STATELESS (1u<<7) +#define CONTEXT_DHCP (1u<<8) +#define CONTEXT_DEPRECATE (1u<<9) +#define CONTEXT_TEMPLATE (1u<<10) /* create contexts using addresses */ +#define CONTEXT_CONSTRUCTED (1u<<11) +#define CONTEXT_GC (1u<<12) +#define CONTEXT_RA (1u<<13) +#define CONTEXT_CONF_USED (1u<<14) +#define CONTEXT_USED (1u<<15) +#define CONTEXT_OLD (1u<<16) +#define CONTEXT_V6 (1u<<17) + struct ping_result { struct in_addr addr; time_t time; @@ -763,6 +877,12 @@ struct tftp_prefix { struct tftp_prefix *next; }; +struct dhcp_relay { + struct all_addr local, server; + char *interface; /* Allowable interface for replies from server, and dest for IPv6 multicast */ + int iface_index; /* working - interface in which requests arrived, for return */ + struct dhcp_relay *current, *next; +}; extern struct daemon { /* datastuctures representing the command-line and @@ -772,6 +892,7 @@ extern struct daemon { unsigned int options, options2; struct resolvc default_resolv, *resolv_files; time_t last_resolv; + char *servers_file; struct mx_srv_record *mxnames; struct naptr *naptr; struct txt_record *txt, *rr; @@ -781,6 +902,8 @@ extern struct daemon { struct auth_zone *auth_zones; struct interface_name *int_names; char *mxtarget; + int addr4_netmask; + int addr6_netmask; char *lease_file; char *username, *groupname, *scriptuser; char *luascript; @@ -789,10 +912,10 @@ extern struct daemon { struct name_list *secondary_forward_server; int group_set, osport; char *domain_suffix; - struct cond_domain *cond_domain; + struct cond_domain *cond_domain, *synth_domains; char *runfile; char *lease_change_command; - struct iname *if_names, *if_addrs, *if_except, *dhcp_except, *auth_peers; + struct iname *if_names, *if_addrs, *if_except, *dhcp_except, *auth_peers, *tftp_interfaces; struct bogus_addr *bogus_addr; struct server *servers; struct ipsets *ipsets; @@ -804,6 +927,7 @@ extern struct daemon { unsigned long local_ttl, neg_ttl, max_ttl, max_cache_ttl, auth_ttl; struct hostsfile *addn_hosts; struct dhcp_context *dhcp, *dhcp6; + struct ra_interface *ra_interfaces; struct dhcp_config *dhcp_conf; struct dhcp_opt *dhcp_opts, *dhcp_match, *dhcp_opts6, *dhcp_match6; struct dhcp_vendor *dhcp_vendors; @@ -812,6 +936,7 @@ extern struct daemon { struct pxe_service *pxe_services; struct tag_if *tag_if; struct addr_list *override_relays; + struct dhcp_relay *relay4, *relay6; int override; int enable_pxe; int doing_ra, doing_dhcp6; @@ -833,12 +958,19 @@ extern struct daemon { #ifdef OPTION6_PREFIX_CLASS struct prefix_class *prefix_classes; #endif +#ifdef HAVE_DNSSEC + struct ds_config *ds; +#endif /* globally used stuff for DNS */ char *packet; /* packet buffer */ int packet_buff_sz; /* size of above */ char *namebuff; /* MAXDNAME size buffer */ - unsigned int local_answer, queries_forwarded; +#ifdef HAVE_DNSSEC + char *keyname; /* MAXDNAME size buffer */ + char *workspacename; /* ditto */ +#endif + unsigned int local_answer, queries_forwarded, auth_answer; struct frec *frec_list; struct serverfd *sfds; struct irec *interfaces; @@ -852,13 +984,14 @@ extern struct daemon { pid_t tcp_pids[MAX_PROCS]; struct randfd randomsocks[RANDOM_SOCKS]; int v6pktinfo; + struct addrlist *interface_addrs; /* list of all addresses/prefix lengths associated with all local interfaces */ /* DHCP state */ int dhcpfd, helperfd, pxefd; #if defined(HAVE_LINUX_NETWORK) int netlinkfd; #elif defined(HAVE_BSD_NETWORK) - int dhcp_raw_fd, dhcp_icmp_fd; + int dhcp_raw_fd, dhcp_icmp_fd, routefd; #endif struct iovec dhcp_packet; char *dhcp_buff, *dhcp_buff2, *dhcp_buff3; @@ -889,13 +1022,13 @@ extern struct daemon { /* cache.c */ void cache_init(void); void log_query(unsigned int flags, char *name, struct all_addr *addr, char *arg); -char *record_source(int index); -void querystr(char *desc, char *str, unsigned short type); +char *record_source(unsigned int index); +char *querystr(char *desc, unsigned short type); struct crec *cache_find_by_addr(struct crec *crecp, struct all_addr *addr, time_t now, - unsigned short prot); + unsigned int prot); struct crec *cache_find_by_name(struct crec *crecp, - char *name, time_t now, unsigned short prot); + char *name, time_t now, unsigned int prot); void cache_end_insert(void); void cache_start_insert(void); struct crec *cache_insert(char *name, struct all_addr *addr, @@ -905,18 +1038,34 @@ void cache_add_dhcp_entry(char *host_name, int prot, s struct in_addr a_record_from_hosts(char *name, time_t now); void cache_unhash_dhcp(void); void dump_cache(time_t now); +int cache_make_stat(struct txt_record *t); char *cache_get_name(struct crec *crecp); +char *cache_get_cname_target(struct crec *crecp); struct crec *cache_enumerate(int init); + +/* blockdata.c */ +#ifdef HAVE_DNSSEC +void blockdata_init(void); +void blockdata_report(void); +struct blockdata *blockdata_alloc(char *data, size_t len); +void *blockdata_retrieve(struct blockdata *block, size_t len, void *data); +void blockdata_free(struct blockdata *blocks); +#endif + +/* domain.c */ char *get_domain(struct in_addr addr); #ifdef HAVE_IPV6 char *get_domain6(struct in6_addr *addr); #endif -#ifdef HAVE_DNSSEC -struct keydata *keydata_alloc(char *data, size_t len); -void keydata_free(struct keydata *blocks); -#endif +int is_name_synthetic(int flags, char *name, struct all_addr *addr); +int is_rev_synth(int flag, struct all_addr *addr, char *name); /* rfc1035.c */ +int extract_name(struct dns_header *header, size_t plen, unsigned char **pp, + char *name, int isExtract, int extrabytes); +unsigned char *skip_name(unsigned char *ansp, struct dns_header *header, size_t plen, int extrabytes); +unsigned char *skip_questions(struct dns_header *header, size_t plen); +unsigned char *skip_section(unsigned char *ansp, int count, struct dns_header *header, size_t plen); unsigned int extract_request(struct dns_header *header, size_t qlen, char *name, unsigned short *typep); size_t setup_reply(struct dns_header *header, size_t qlen, @@ -924,9 +1073,10 @@ size_t setup_reply(struct dns_header *header, size_t unsigned long local_ttl); int extract_addresses(struct dns_header *header, size_t qlen, char *namebuff, time_t now, char **ipsets, int is_sign, int checkrebind, - int checking_disabled); + int no_cache, int secure, int *doctored); size_t answer_request(struct dns_header *header, char *limit, size_t qlen, - struct in_addr local_addr, struct in_addr local_netmask, time_t now); + struct in_addr local_addr, struct in_addr local_netmask, + time_t now, int *ad_reqd, int *do_bit); int check_for_bogus_wildcard(struct dns_header *header, size_t qlen, char *name, struct bogus_addr *addr, time_t now); unsigned char *find_pseudoheader(struct dns_header *header, size_t plen, @@ -936,6 +1086,11 @@ unsigned int questions_crc(struct dns_header *header, size_t resize_packet(struct dns_header *header, size_t plen, unsigned char *pheader, size_t hlen); size_t add_mac(struct dns_header *header, size_t plen, char *limit, union mysockaddr *l3); +size_t add_source_addr(struct dns_header *header, size_t plen, char *limit, union mysockaddr *source); +#ifdef HAVE_DNSSEC +size_t add_do_bit(struct dns_header *header, size_t plen, char *limit); +#endif +int check_source(struct dns_header *header, size_t plen, unsigned char *pseudoheader, union mysockaddr *peer); int add_resource_record(struct dns_header *header, char *limit, int *truncp, int nameoffset, unsigned char **pp, unsigned long ttl, int *offset, unsigned short type, unsigned short class, char *format, ...); @@ -943,15 +1098,29 @@ unsigned char *skip_questions(struct dns_header *heade int extract_name(struct dns_header *header, size_t plen, unsigned char **pp, char *name, int isExtract, int extrabytes); int in_arpa_name_2_addr(char *namein, struct all_addr *addrp); +int private_net(struct in_addr addr, int ban_localhost); /* auth.c */ #ifdef HAVE_AUTH -size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, time_t now, union mysockaddr *peer_addr); +size_t answer_auth(struct dns_header *header, char *limit, size_t qlen, + time_t now, union mysockaddr *peer_addr, int local_query); +int in_zone(struct auth_zone *zone, char *name, char **cut); #endif +/* dnssec.c */ +size_t dnssec_generate_query(struct dns_header *header, char *end, char *name, int class, int type, union mysockaddr *addr); +int dnssec_validate_by_ds(time_t now, struct dns_header *header, size_t n, char *name, char *keyname, int class); +int dnssec_validate_ds(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int class); +int dnssec_validate_reply(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname, int *class, int *neganswer); +int dnssec_chase_cname(time_t now, struct dns_header *header, size_t plen, char *name, char *keyname); +int dnskey_keytag(int alg, int flags, unsigned char *rdata, int rdlen); +size_t filter_rrsigs(struct dns_header *header, size_t plen); +unsigned char* hash_questions(struct dns_header *header, size_t plen, char *name); + /* util.c */ void rand_init(void); unsigned short rand16(void); +u64 rand64(void); int legal_hostname(char *c); char *canonicalise(char *s, int *nomem); unsigned char *do_rfc1035_name(unsigned char *p, char *sval); @@ -996,6 +1165,7 @@ void read_opts (int argc, char **argv, char *compile_o char *option_string(int prot, unsigned int opt, unsigned char *val, int opt_len, char *buf, int buf_len); void reread_dhcp(void); +void read_servers_file(void); void set_option_bool(unsigned int opt); void reset_option_bool(unsigned int opt); struct hostsfile *expand_filelist(struct hostsfile *list); @@ -1008,7 +1178,7 @@ void receive_query(struct listener *listen, time_t now unsigned char *tcp_request(int confd, time_t now, union mysockaddr *local_addr, struct in_addr netmask, int auth_dns); void server_gone(struct server *server); -struct frec *get_new_frec(time_t now, int *wait); +struct frec *get_new_frec(time_t now, int *wait, int force); int send_from(int fd, int nowild, char *packet, size_t len, union mysockaddr *to, struct all_addr *source, unsigned int iface); @@ -1019,23 +1189,36 @@ int local_bind(int fd, union mysockaddr *addr, char *i int random_sock(int family); void pre_allocate_sfds(void); int reload_servers(char *fname); +void mark_servers(int flag); +void cleanup_servers(void); +void add_update_server(int flags, + union mysockaddr *addr, + union mysockaddr *source_addr, + const char *interface, + const char *domain); void check_servers(void); -int enumerate_interfaces(); +int enumerate_interfaces(int reset); void create_wildcard_listeners(void); void create_bound_listeners(int die); +void warn_bound_listeners(void); +void warn_int_names(void); int is_dad_listeners(void); int iface_check(int family, struct all_addr *addr, char *name, int *auth_dns); int loopback_exception(int fd, int family, struct all_addr *addr, char *name); +int label_exception(int index, int family, struct all_addr *addr); int fix_fd(int fd); int tcp_interface(int fd, int af); -struct in_addr get_ifaddr(char *intr); #ifdef HAVE_IPV6 int set_ipv6pktinfo(int fd); #endif #ifdef HAVE_DHCP6 void join_multicast(int dienow); #endif +#if defined(HAVE_LINUX_NETWORK) || defined(HAVE_BSD_NETWORK) +void newaddress(time_t now); +#endif + /* dhcp.c */ #ifdef HAVE_DHCP void dhcp_init(void); @@ -1049,12 +1232,6 @@ struct dhcp_context *narrow_context(struct dhcp_contex int address_allocate(struct dhcp_context *context, struct in_addr *addrp, unsigned char *hwaddr, int hw_len, struct dhcp_netid *netids, time_t now); -int config_has_mac(struct dhcp_config *config, unsigned char *hwaddr, int len, int type); -struct dhcp_config *find_config(struct dhcp_config *configs, - struct dhcp_context *context, - unsigned char *clid, int clid_len, - unsigned char *hwaddr, int hw_len, - int hw_type, char *hostname); void dhcp_read_ethers(void); struct dhcp_config *config_find_by_address(struct dhcp_config *configs, struct in_addr addr); char *host_from_dns(struct in_addr addr); @@ -1076,6 +1253,8 @@ struct dhcp_lease *lease6_find_by_addr(struct in6_addr u64 lease_find_max_addr6(struct dhcp_context *context); void lease_ping_reply(struct in6_addr *sender, unsigned char *packet, char *interface); void lease_update_slaac(time_t now); +void lease_set_iaid(struct dhcp_lease *lease, int iaid); +void lease_make_duid(time_t now); #endif void lease_set_hwaddr(struct dhcp_lease *lease, unsigned char *hwaddr, unsigned char *clid, int hw_len, int hw_type, int clid_len, time_t now, int force); @@ -1126,6 +1305,8 @@ void netlink_multicast(time_t now); void init_bpf(void); void send_via_bpf(struct dhcp_packet *mess, size_t len, struct in_addr iface_addr, struct ifreq *ifr); +void route_init(void); +void route_sock(time_t now); #endif /* bpf.c or netlink.c */ @@ -1176,7 +1357,7 @@ int get_incoming_mark(union mysockaddr *peer_addr, str #ifdef HAVE_DHCP6 void dhcp6_init(void); void dhcp6_packet(time_t now); -struct dhcp_context *address6_allocate(struct dhcp_context *context, unsigned char *clid, int clid_len, +struct dhcp_context *address6_allocate(struct dhcp_context *context, unsigned char *clid, int clid_len, int temp_addr, int iaid, int serial, struct dhcp_netid *netids, int plain_range, struct in6_addr *ans); int config_valid(struct dhcp_config *config, struct dhcp_context *context, struct in6_addr *addr); struct dhcp_context *address6_available(struct dhcp_context *context, @@ -1187,20 +1368,22 @@ struct dhcp_context *address6_valid(struct dhcp_contex struct in6_addr *taddr, struct dhcp_netid *netids, int plain_range); -struct dhcp_config *find_config6(struct dhcp_config *configs, - struct dhcp_context *context, - unsigned char *duid, int duid_len, - char *hostname); struct dhcp_config *config_find_by_address6(struct dhcp_config *configs, struct in6_addr *net, int prefix, u64 addr); void make_duid(time_t now); void dhcp_construct_contexts(time_t now); +void get_client_mac(struct in6_addr *client, int iface, unsigned char *mac, + unsigned int *maclenp, unsigned int *mactypep); #endif - + /* rfc3315.c */ #ifdef HAVE_DHCP6 unsigned short dhcp6_reply(struct dhcp_context *context, int interface, char *iface_name, - struct in6_addr *fallback, size_t sz, int is_multicast, time_t now); + struct in6_addr *fallback, struct in6_addr *ll_addr, struct in6_addr *ula_addr, + size_t sz, struct in6_addr *client_addr, time_t now); +void relay_upstream6(struct dhcp_relay *relay, ssize_t sz, struct in6_addr *peer_address, u32 scope_id); + +unsigned short relay_reply6( struct sockaddr_in6 *peer, ssize_t sz, char *arrival_interface); #endif /* dhcp-common.c */ @@ -1216,17 +1399,25 @@ void log_tags(struct dhcp_netid *netid, u32 xid); int match_bytes(struct dhcp_opt *o, unsigned char *p, int len); void dhcp_update_configs(struct dhcp_config *configs); void display_opts(void); -u16 lookup_dhcp_opt(int prot, char *name); -u16 lookup_dhcp_len(int prot, u16 val); +int lookup_dhcp_opt(int prot, char *name); +int lookup_dhcp_len(int prot, int val); char *option_string(int prot, unsigned int opt, unsigned char *val, int opt_len, char *buf, int buf_len); +struct dhcp_config *find_config(struct dhcp_config *configs, + struct dhcp_context *context, + unsigned char *clid, int clid_len, + unsigned char *hwaddr, int hw_len, + int hw_type, char *hostname); +int config_has_mac(struct dhcp_config *config, unsigned char *hwaddr, int len, int type); #ifdef HAVE_LINUX_NETWORK -void bindtodevice(int fd); +char *whichdevice(void); +void bindtodevice(char *device, int fd); #endif # ifdef HAVE_DHCP6 void display_opts6(void); # endif void log_context(int family, struct dhcp_context *context); +void log_relay(int family, struct dhcp_relay *relay); #endif /* outpacket.c */