summaryrefslogtreecommitdiff
path: root/includes/dhcpd.h
diff options
context:
space:
mode:
Diffstat (limited to 'includes/dhcpd.h')
-rw-r--r--includes/dhcpd.h441
1 files changed, 411 insertions, 30 deletions
diff --git a/includes/dhcpd.h b/includes/dhcpd.h
index b621eb95..4277df95 100644
--- a/includes/dhcpd.h
+++ b/includes/dhcpd.h
@@ -32,6 +32,9 @@
* ``http://www.nominum.com''.
*/
+/* XXX: HACK just until the code is autoconfiscated */
+#define DHCPv6
+
#ifndef __CYGWIN32__
#include <sys/types.h>
#include <netinet/in.h>
@@ -73,10 +76,12 @@ typedef struct hash_table host_hash_t;
typedef struct hash_table class_hash_t;
#include "dhcp.h"
+#include "dhcp6.h"
#include "statement.h"
#include "tree.h"
#include "inet.h"
#include "dhctoken.h"
+#include "heap.h"
#include <isc-dhcp/result.h>
#include <omapip/omapip_p.h>
@@ -140,6 +145,10 @@ typedef struct hash_table class_hash_t;
# define VIVSO_HASH_SIZE VIVCO_HASH_SIZE
#endif
+#if !defined (VSIO_HASH_SIZE)
+# define VSIO_HASH_SIZE VIVCO_HASH_SIZE
+#endif
+
#if !defined (VIV_ISC_HASH_SIZE)
# define VIV_ISC_HASH_SIZE 3 /* An incredulously small table. */
#endif
@@ -318,6 +327,20 @@ struct packet {
int refcnt;
unsigned packet_length;
int packet_type;
+
+ unsigned char dhcpv6_msg_type; /* DHCPv6 message type */
+
+ /* DHCPv6 transaction ID */
+ unsigned char dhcpv6_transaction_id[3];
+
+ /* DHCPv6 relay information */
+ unsigned char dhcpv6_hop_count;
+ struct in6_addr dhcpv6_link_address;
+ struct in6_addr dhcpv6_peer_address;
+
+ /* DHCPv6 packet containing this one, or NULL if none */
+ struct packet *dhcpv6_container_packet;
+
int options_valid;
int client_port;
struct iaddr client_addr;
@@ -353,6 +376,12 @@ struct packet {
* to signal this in a reliable way.
*/
isc_boolean_t agent_options_stashed;
+
+ /*
+ * ISC_TRUE if packet received unicast (as opposed to multicast).
+ * Only used in DHCPv6.
+ */
+ isc_boolean_t unicast;
};
/* A network interface's MAC address. */
@@ -499,6 +528,11 @@ struct lease_state {
#define DISCOVER_RELAY 3
#define DISCOVER_REQUESTED 4
+/* DDNS_UPDATE_STYLE enumerations. */
+#define DDNS_UPDATE_STYLE_NONE 0
+#define DDNS_UPDATE_STYLE_AD_HOC 1
+#define DDNS_UPDATE_STYLE_INTERIM 2
+
/* Server option names. */
#define SV_DEFAULT_LEASE_TIME 1
@@ -553,6 +587,7 @@ struct lease_state {
#define SV_ADAPTIVE_LEASE_TIME_THRESHOLD 50
#define SV_DO_REVERSE_UPDATES 51
#define SV_FQDN_REPLY 52
+#define SV_PREFER_LIFETIME 53
#if !defined (DEFAULT_PING_TIMEOUT)
# define DEFAULT_PING_TIMEOUT 1
@@ -661,6 +696,11 @@ struct host_decl {
char *name;
struct hardware interface;
struct data_string client_identifier;
+ struct option *host_id_option;
+ struct data_string host_id;
+ /* XXXSK: fixed_addr should be an array of iaddr values,
+ not an option_cache, but it's referenced in a lot of
+ places, so we'll leave it for now. */
struct option_cache *fixed_addr;
struct group *group;
struct group_object *named_group;
@@ -715,6 +755,9 @@ struct shared_network {
struct subnet *subnets;
struct interface_info *interface;
struct pool *pools;
+ struct ipv6_pool **ipv6_pools; /* NULL-terminated array */
+ int last_ipv6_pool; /* offset of last IPv6 pool
+ used to issue a lease */
struct group *group;
#if defined (FAILOVER_PROTOCOL)
dhcp_failover_state_t *failover_peer;
@@ -730,7 +773,7 @@ struct subnet {
struct iaddr interface_address;
struct iaddr net;
struct iaddr netmask;
-
+ int prefix_len; /* XXX: currently for IPv6 only */
struct group *group;
};
@@ -804,6 +847,48 @@ struct client_lease {
struct option_state *options; /* Options supplied with lease. */
};
+/* DHCPv6 lease structures */
+struct dhc6_addr {
+ struct dhc6_addr *next;
+ struct iaddr address;
+
+ /* Address state flags. */
+ #define DHC6_ADDR_DEPREFFED 0x01
+ #define DHC6_ADDR_EXPIRED 0x02
+ u_int8_t flags;
+
+ TIME starts;
+ u_int32_t preferred_life;
+ u_int32_t max_life;
+
+ struct option_state *options;
+};
+
+struct dhc6_ia {
+ struct dhc6_ia *next;
+ unsigned char iaid[4];
+
+ TIME starts;
+ u_int32_t renew;
+ u_int32_t rebind;
+ struct dhc6_addr *addrs;
+
+ struct option_state *options;
+};
+
+struct dhc6_lease {
+ struct dhc6_lease *next;
+ struct data_string server_id;
+
+ int score;
+ u_int8_t pref;
+
+ unsigned char dhcpv6_transaction_id[3];
+ struct dhc6_ia *bindings;
+
+ struct option_state *options;
+};
+
/* Possible states in which the client can be. */
enum dhcp_state {
S_REBOOTING = 1,
@@ -879,35 +964,77 @@ struct client_config {
};
/* Per-interface state used in the dhcp client... */
+/* XXX: consider union {}'ing this for v4/v6. */
struct client_state {
struct client_state *next;
struct interface_info *interface;
char *name;
+ /* Common values. */
+ struct client_config *config; /* Client configuration. */
+ struct string_list *env; /* Client script environment. */
+ int envc; /* Number of entries in environment. */
+ struct option_state *sent_options; /* Options we sent. */
+ enum dhcp_state state; /* Current state for this interface. */
+
+
+ /* DHCPv4 values. */
struct client_lease *active; /* Currently active lease. */
struct client_lease *new; /* New lease. */
struct client_lease *offered_leases; /* Leases offered to us. */
struct client_lease *leases; /* Leases we currently hold. */
struct client_lease *alias; /* Alias lease. */
- enum dhcp_state state; /* Current state for this interface. */
struct iaddr destination; /* Where to send packet. */
u_int32_t xid; /* Transaction ID. */
u_int16_t secs; /* secs value from DHCPDISCOVER. */
TIME first_sending; /* When was first copy sent? */
TIME interval; /* What's the current resend interval? */
- int dns_update_timeout; /* Last timeout set for DNS update. */
struct string_list *medium; /* Last media type tried. */
struct dhcp_packet packet; /* Outgoing DHCP packet. */
unsigned packet_length; /* Actual length of generated packet. */
struct iaddr requested_address; /* Address we would like to get. */
- struct client_config *config; /* Client configuration. */
- struct string_list *env; /* Client script environment. */
- int envc; /* Number of entries in environment. */
+ /* DHCPv6 values. */
+ unsigned char dhcpv6_transaction_id[3];
+ u_int8_t refresh_type;
+
+ struct dhc6_lease *active_lease;
+ struct dhc6_lease *old_lease;
+ struct dhc6_lease *advertised_leases;
+ struct dhc6_lease *selected_lease;
+ struct dhc6_lease *held_leases;
+
+ TIME start_time;
+ u_int16_t elapsed;
+ int txcount;
+
+ /* See RFC3315 section 14. */
+ TIME RT;
+ TIME IRT;
+ TIME MRC;
+ TIME MRT;
+ TIME MRD;
+ TIME next_MRD;
+
+ /* Rather than a state, we use a function that shifts around
+ * depending what stage of life the v6 state machine is in.
+ * This is where incoming packets are dispatched to (sometimes
+ * a no-op).
+ */
+ void (*v6_handler)(struct packet *, struct client_state *);
+};
- struct option_state *sent_options; /* Options we sent. */
+struct envadd_state {
+ struct client_state *client;
+ const char *prefix;
+};
+
+struct dns_update_state {
+ struct client_state *client;
+ struct iaddr address;
+ int dns_update_timeout;
};
/* Information about each network interface. */
@@ -918,7 +1045,17 @@ struct interface_info {
struct shared_network *shared_network;
/* Networks connected to this interface. */
struct hardware hw_address; /* Its physical address. */
- struct in_addr primary_address; /* Primary interface address. */
+ struct in_addr *addresses; /* Addresses associated with this
+ * interface.
+ */
+ int address_count; /* Number of addresses stored. */
+ int address_max; /* Size of addresses buffer. */
+ struct in6_addr *v6addresses; /* IPv6 addresses associated with
+ this interface. */
+ int v6address_count; /* Number of IPv6 addresses associated
+ with this interface. */
+ int v6address_max; /* Maximum number of IPv6 addresses
+ we can store in current buffer. */
u_int8_t *circuit_id; /* Circuit ID associated with this
interface. */
@@ -939,6 +1076,9 @@ struct interface_info {
size_t rbuf_len; /* Length of data in buffer. */
struct ifreq *ifp; /* Pointer to ifreq struct. */
+ int configured; /* If set to 1, interface has at least
+ * one valid IP address.
+ */
u_int32_t flags; /* Control flags... */
#define INTERFACE_REQUESTED 1
#define INTERFACE_AUTOMATIC 2
@@ -1082,10 +1222,18 @@ typedef unsigned char option_mask [16];
#define _PATH_DHCLIENT_PID "/var/run/dhclient.pid"
#endif
+#ifndef _PATH_DHCLIENT6_PID
+#define _PATH_DHCLIENT6_PID "/var/run/dhclient6.pid"
+#endif
+
#ifndef _PATH_DHCLIENT_DB
#define _PATH_DHCLIENT_DB "/etc/dhclient.leases"
#endif
+#ifndef _PATH_DHCLIENT6_DB
+#define _PATH_DHCLIENT6_DB "/etc/dhclient6.leases"
+#endif
+
#ifndef _PATH_RESOLV_CONF
#define _PATH_RESOLV_CONF "/etc/resolv.conf"
#endif
@@ -1101,6 +1249,47 @@ typedef unsigned char option_mask [16];
#define MAX_TIME 0x7fffffff
#define MIN_TIME 0
+typedef struct hash_table ia_na_hash_t;
+typedef struct hash_table iaaddr_hash_t;
+
+struct iaaddr {
+ int refcnt; /* reference count */
+ struct in6_addr addr; /* IPv6 address */
+ binding_state_t state; /* state */
+ struct binding_scope *scope; /* "set var = value;" */
+ time_t valid_lifetime_end_time; /* time address expires */
+ struct ia_na *ia_na; /* IA for this address */
+ struct ipv6_pool *ipv6_pool; /* pool for this address */
+ int heap_index; /* index into heap, or -1
+ (internal use only) */
+};
+
+struct ia_na {
+ int refcnt; /* reference count */
+ struct data_string iaid_duid; /* from the client */
+ int num_iaaddr; /* number of IAADDR for this IA_NA */
+ int max_iaaddr; /* space available for IAADDR */
+ struct iaaddr **iaaddr; /* pointers to the various IAADDRs */
+};
+
+extern ia_na_hash_t *ia_active;
+
+struct ipv6_pool {
+ int refcnt; /* reference count */
+ struct in6_addr start_addr; /* first IPv6 address */
+ int bits; /* number of bits, CIDR style */
+ iaaddr_hash_t *addrs; /* non-free IAADDR */
+ int num_active; /* count of active IAADDR */
+ isc_heap_t *active_timeouts; /* timeouts for active leases */
+ isc_heap_t *inactive_timeouts; /* timeouts for expired or
+ released leases */
+ struct shared_network *shared_network; /* shared_network for
+ this pool */
+};
+
+extern struct ipv6_pool **pools;
+extern int num_pools;
+
/* External definitions... */
HASH_FUNCTIONS_DECL (group, const char *, struct group_object, group_hash_t)
@@ -1134,12 +1323,52 @@ int cons_options PROTO ((struct packet *, struct dhcp_packet *, struct lease *,
int, int, int, struct data_string *, const char *));
int fqdn_universe_decode (struct option_state *,
const unsigned char *, unsigned, struct universe *);
+struct option_cache *
+lookup_fqdn6_option(struct universe *universe, struct option_state *options,
+ unsigned code);
+void
+save_fqdn6_option(struct universe *universe, struct option_state *options,
+ struct option_cache *oc);
+void
+delete_fqdn6_option(struct universe *universe, struct option_state *options,
+ int code);
+void
+fqdn6_option_space_foreach(struct packet *packet, struct lease *lease,
+ struct client_state *client_state,
+ struct option_state *in_options,
+ struct option_state *cfg_options,
+ struct binding_scope **scope,
+ struct universe *u, void *stuff,
+ void (*func)(struct option_cache *,
+ struct packet *,
+ struct lease *,
+ struct client_state *,
+ struct option_state *,
+ struct option_state *,
+ struct binding_scope **,
+ struct universe *, void *));
+int
+fqdn6_option_space_encapsulate(struct data_string *result,
+ struct packet *packet, struct lease *lease,
+ struct client_state *client_state,
+ struct option_state *in_options,
+ struct option_state *cfg_options,
+ struct binding_scope **scope,
+ struct universe *universe);
+int
+fqdn6_universe_decode(struct option_state *options,
+ const unsigned char *buffer, unsigned length,
+ struct universe *u);
+int append_option(struct data_string *dst, struct universe *universe,
+ struct option *option, struct data_string *src);
int store_options PROTO ((int *, unsigned char *, unsigned, struct packet *,
struct lease *, struct client_state *,
struct option_state *,
struct option_state *, struct binding_scope **,
unsigned *, int, unsigned, unsigned,
int, const char *));
+int store_options6(char *, int, struct option_state *, struct packet *,
+ const int *, struct data_string *);
int format_has_text(const char *);
int format_min_length(const char *, struct option_cache *);
const char *pretty_print_option PROTO ((struct option *, const unsigned char *,
@@ -1158,9 +1387,14 @@ struct option_cache *lookup_option PROTO ((struct universe *,
struct option_cache *lookup_hashed_option PROTO ((struct universe *,
struct option_state *,
unsigned));
+struct option_cache *next_hashed_option(struct universe *,
+ struct option_state *,
+ struct option_cache *);
int save_option_buffer (struct universe *, struct option_state *,
struct buffer *, unsigned char *, unsigned,
unsigned, int);
+void build_server_oro(struct data_string *, struct option_state *,
+ const char *, int);
void save_option PROTO ((struct universe *,
struct option_state *, struct option_cache *));
void save_hashed_option PROTO ((struct universe *,
@@ -1279,6 +1513,14 @@ struct option_cache *lookup_linked_option (struct universe *,
void do_packet PROTO ((struct interface_info *,
struct dhcp_packet *, unsigned,
unsigned int, struct iaddr, struct hardware *));
+void do_packet6(struct interface_info *, const char *,
+ int, int, const struct iaddr *, isc_boolean_t);
+int packet6_len_okay(const char *, int);
+
+int add_option(struct option_state *options,
+ unsigned int option_num,
+ void *data,
+ unsigned int data_len);
int add_option(struct option_state *options,
unsigned int option_num,
@@ -1296,9 +1538,9 @@ extern const char *path_dhcpd_pid;
extern int dhcp_max_agent_option_packet_length;
-int main PROTO ((int, char **, char **));
-void postconf_initialization (int);
-void postdb_startup (void);
+int main(int, char **);
+void postconf_initialization(int);
+void postdb_startup(void);
void cleanup PROTO ((void));
void lease_pinged PROTO ((struct iaddr, u_int8_t *, int));
void lease_ping_timeout PROTO ((void *));
@@ -1344,16 +1586,23 @@ int parse_class_declaration PROTO ((struct class **, struct parse *,
void parse_shared_net_declaration PROTO ((struct parse *, struct group *));
void parse_subnet_declaration PROTO ((struct parse *,
struct shared_network *));
+void parse_subnet6_declaration PROTO ((struct parse *,
+ struct shared_network *));
void parse_group_declaration PROTO ((struct parse *, struct group *));
-int parse_fixed_addr_param PROTO ((struct option_cache **, struct parse *));
+int parse_fixed_addr_param PROTO ((struct option_cache **,
+ struct parse *, enum dhcp_token));
int parse_lease_declaration PROTO ((struct lease **, struct parse *));
void parse_address_range PROTO ((struct parse *, struct group *, int,
struct pool *, struct lease **));
+void parse_address_range6(struct parse *cfile, struct group *group);
+void parse_ia_na_declaration(struct parse *);
+void parse_server_duid(struct parse *cfile);
+void parse_server_duid_conf(struct parse *cfile);
/* ddns.c */
-int ddns_updates PROTO ((struct packet *, struct lease *, struct lease *,
- struct lease_state *));
-int ddns_removals PROTO ((struct lease *));
+int ddns_updates(struct packet *, struct lease *, struct lease *,
+ struct iaaddr *, struct iaaddr *, struct option_state *);
+int ddns_removals(struct lease *, struct iaaddr *);
/* parse.c */
void add_enumeration (struct enumeration *);
@@ -1419,7 +1668,7 @@ int parse_allow_deny PROTO ((struct option_cache **, struct parse *, int));
int parse_auth_key PROTO ((struct data_string *, struct parse *));
int parse_warn (struct parse *, const char *, ...)
__attribute__((__format__(__printf__,2,3)));
-struct expression *parse_domain_list (struct parse *cfile);
+struct expression *parse_domain_list(struct parse *cfile, int);
/* tree.c */
@@ -1528,6 +1777,7 @@ int bind_ds_value (struct binding_scope **,
int find_bound_string (struct data_string *,
struct binding_scope *, const char *);
int unset (struct binding_scope *, const char *);
+int data_string_sprintfa(struct data_string *ds, const char *fmt, ...);
/* dhcp.c */
extern int outstanding_pings;
@@ -1563,6 +1813,18 @@ void get_server_source_address(struct in_addr *from,
struct option_state *options,
struct packet *packet);
+void get_server_source_address(struct in_addr *from,
+ struct option_state *options,
+ struct packet *packet);
+
+/* dhcpv6.c */
+isc_boolean_t server_duid_isset(void);
+void copy_server_duid(struct data_string *ds, const char *file, int line);
+void set_server_duid(struct data_string *new_duid);
+isc_result_t set_server_duid_from_option(void);
+isc_result_t generate_new_server_duid(void);
+void dhcpv6(struct packet *);
+
/* bootp.c */
void bootp PROTO ((struct packet *));
@@ -1730,10 +1992,12 @@ void print_dns_status (int, ns_updque *);
#endif
const char *print_time(TIME);
+void get_hw_addr(const char *name, struct hardware *hw);
+
/* socket.c */
#if defined (USE_SOCKET_SEND) || defined (USE_SOCKET_RECEIVE) \
|| defined (USE_SOCKET_FALLBACK)
-int if_register_socket PROTO ((struct interface_info *));
+int if_register_socket(struct interface_info *, int, int);
#endif
#if defined (USE_SOCKET_FALLBACK) && !defined (USE_SOCKET_SEND)
@@ -1743,6 +2007,9 @@ ssize_t send_fallback PROTO ((struct interface_info *,
struct packet *, struct dhcp_packet *, size_t,
struct in_addr,
struct sockaddr_in *, struct hardware *));
+ssize_t send_fallback6(struct interface_info *, struct packet *,
+ struct dhcp_packet *, size_t, struct in6_addr,
+ struct sockaddr_in6 *, struct hardware *);
#endif
#ifdef USE_SOCKET_SEND
@@ -1753,6 +2020,9 @@ ssize_t send_packet PROTO ((struct interface_info *,
struct packet *, struct dhcp_packet *, size_t,
struct in_addr,
struct sockaddr_in *, struct hardware *));
+ssize_t send_packet6(struct interface_info *, struct packet *,
+ struct dhcp_packet *, size_t, struct in6_addr,
+ struct sockaddr_in6 *, struct hardware *);
#endif
#ifdef USE_SOCKET_RECEIVE
void if_reinitialize_receive PROTO ((struct interface_info *));
@@ -1761,6 +2031,8 @@ void if_deregister_receive PROTO ((struct interface_info *));
ssize_t receive_packet PROTO ((struct interface_info *,
unsigned char *, size_t,
struct sockaddr_in *, struct hardware *));
+ssize_t receive_packet6(struct interface_info *, unsigned char *, size_t,
+ struct sockaddr_in *, struct in6_addr *);
#endif
#if defined (USE_SOCKET_FALLBACK)
@@ -1907,7 +2179,9 @@ isc_result_t interface_setup (void);
void interface_trace_setup (void);
extern struct in_addr limited_broadcast;
+extern int local_family;
extern struct in_addr local_address;
+extern struct in6_addr local_address6;
extern u_int16_t local_port;
extern u_int16_t remote_port;
@@ -1920,6 +2194,9 @@ extern void (*bootp_packet_handler) PROTO ((struct interface_info *,
struct dhcp_packet *, unsigned,
unsigned int,
struct iaddr, struct hardware *));
+extern void (*dhcpv6_packet_handler)(struct interface_info *,
+ const char *, int,
+ int, const struct iaddr *, isc_boolean_t);
extern struct timeout *timeouts;
extern omapi_object_type_t *dhcp_type_interface;
#if defined (TRACING)
@@ -1930,8 +2207,8 @@ trace_type_t *outpacket_trace;
extern struct interface_info **interface_vector;
extern int interface_count;
extern int interface_max;
-isc_result_t interface_initialize (omapi_object_t *, const char *, int);
-void discover_interfaces PROTO ((int));
+isc_result_t interface_initialize(omapi_object_t *, const char *, int);
+void discover_interfaces(int);
int setup_fallback (struct interface_info **, const char *, int);
int if_readsocket PROTO ((omapi_object_t *));
void reinitialize_interfaces PROTO ((void));
@@ -1940,7 +2217,8 @@ void reinitialize_interfaces PROTO ((void));
void set_time(TIME);
struct timeval *process_outstanding_timeouts (struct timeval *);
void dispatch PROTO ((void));
-isc_result_t got_one PROTO ((omapi_object_t *));
+isc_result_t got_one(omapi_object_t *);
+isc_result_t got_one_v6(omapi_object_t *);
isc_result_t interface_set_value (omapi_object_t *, omapi_object_t *,
omapi_data_string_t *, omapi_typed_data_t *);
isc_result_t interface_get_value (omapi_object_t *, omapi_object_t *,
@@ -1970,8 +2248,10 @@ OMAPI_OBJECT_ALLOC_DECL (interface,
/* tables.c */
extern char *default_option_format;
extern struct universe dhcp_universe;
+extern struct universe dhcpv6_universe;
extern struct universe nwip_universe;
extern struct universe fqdn_universe;
+extern struct universe vsio_universe;
extern int dhcp_option_default_priority_list [];
extern int dhcp_option_default_priority_list_count;
extern const char *hardware_types [256];
@@ -2006,8 +2286,17 @@ struct iaddr broadcast_addr PROTO ((struct iaddr, struct iaddr));
u_int32_t host_addr PROTO ((struct iaddr, struct iaddr));
int addr_eq PROTO ((struct iaddr, struct iaddr));
int addr_match(struct iaddr *, struct iaddrmatch *);
-char *piaddr PROTO ((struct iaddr));
-char *piaddrmask (struct iaddr, struct iaddr, const char *, int);
+int addr_cmp(const struct iaddr *a1, const struct iaddr *a2);
+int addr_or(struct iaddr *result,
+ const struct iaddr *a1, const struct iaddr *a2);
+int addr_and(struct iaddr *result,
+ const struct iaddr *a1, const struct iaddr *a2);
+isc_result_t range2cidr(struct iaddrcidrnetlist **result,
+ const struct iaddr *lo, const struct iaddr *hi);
+isc_result_t free_iaddrcidrnetlist(struct iaddrcidrnetlist **result);
+const char *piaddr PROTO ((struct iaddr));
+char *piaddrmask(struct iaddr *, struct iaddr *);
+char *piaddrcidr(const struct iaddr *, unsigned int);
/* dhclient.c */
extern const char *path_dhclient_conf;
@@ -2015,6 +2304,7 @@ extern const char *path_dhclient_db;
extern const char *path_dhclient_pid;
extern char *path_dhclient_script;
extern int interfaces_requested;
+extern struct data_string default_duid;
extern struct client_config top_level_config;
@@ -2054,6 +2344,9 @@ void write_lease_option (struct option_cache *, struct packet *,
struct binding_scope **, struct universe *, void *);
int write_client_lease PROTO ((struct client_state *,
struct client_lease *, int, int));
+isc_result_t write_client6_lease(struct client_state *client,
+ struct dhc6_lease *lease,
+ int rewrite, int sync);
int dhcp_option_ev_name (char *, size_t, struct option *);
void script_init PROTO ((struct client_state *, const char *,
@@ -2077,8 +2370,23 @@ void do_release PROTO ((struct client_state *));
int dhclient_interface_shutdown_hook (struct interface_info *);
int dhclient_interface_discovery_hook (struct interface_info *);
isc_result_t dhclient_interface_startup_hook (struct interface_info *);
+void dhclient_schedule_updates(struct client_state *client,
+ struct iaddr *addr, int offset);
void client_dns_update_timeout (void *cp);
-isc_result_t client_dns_update (struct client_state *client, int, int);
+isc_result_t client_dns_update(struct client_state *client, int, int,
+ struct iaddr *);
+
+void dhcpv4_client_assignments(void);
+void dhcpv6_client_assignments(void);
+
+/* dhc6.c */
+void dhc6_lease_destroy(struct dhc6_lease *lease, char *file, int line);
+void start_init6(struct client_state *client);
+void start_confirm6(struct client_state *client);
+void start_selecting6(struct client_state *client);
+isc_result_t write_client6_lease(struct client_state *client,
+ struct dhc6_lease *lease,
+ int rewrite, int sync);
/* db.c */
int write_lease PROTO ((struct lease *));
@@ -2096,6 +2404,7 @@ int commit_leases PROTO ((void));
void db_startup PROTO ((int));
int new_lease_file PROTO ((void));
int group_writer (struct group_object *);
+int write_ia_na(const struct ia_na *);
/* packet.c */
u_int32_t checksum PROTO ((unsigned char *, unsigned, u_int32_t));
@@ -2226,11 +2535,11 @@ void forget_zone (struct dns_zone **);
void repudiate_zone (struct dns_zone **);
void cache_found_zone (ns_class, char *, struct in_addr *, int);
int get_dhcid (struct data_string *, int, const u_int8_t *, unsigned);
-isc_result_t ddns_update_a(struct data_string *, struct iaddr,
- struct data_string *, unsigned long, unsigned,
- unsigned);
-isc_result_t ddns_remove_a (struct data_string *,
- struct iaddr, struct data_string *);
+isc_result_t ddns_update_fwd(struct data_string *, struct iaddr,
+ struct data_string *, unsigned long, unsigned,
+ unsigned);
+isc_result_t ddns_remove_fwd(struct data_string *,
+ struct iaddr, struct data_string *);
#endif /* NSUPDATE */
/* resolv.c */
@@ -2591,11 +2900,14 @@ isc_result_t enter_class PROTO ((struct class *, int, int));
isc_result_t delete_class PROTO ((struct class *, int));
isc_result_t enter_host PROTO ((struct host_decl *, int, int));
isc_result_t delete_host PROTO ((struct host_decl *, int));
+void change_host_uid(struct host_decl *host, const char *data, int len);
int find_hosts_by_haddr PROTO ((struct host_decl **, int,
const unsigned char *, unsigned,
const char *, int));
int find_hosts_by_uid PROTO ((struct host_decl **, const unsigned char *,
unsigned, const char *, int));
+int find_hosts_by_option(struct host_decl **, struct packet *,
+ struct option_state *, const char *, int);
int find_host_for_network PROTO ((struct subnet **, struct host_decl **,
struct iaddr *, struct shared_network *));
void new_address_range PROTO ((struct parse *, struct iaddr, struct iaddr,
@@ -2605,12 +2917,12 @@ isc_result_t dhcp_lease_free (omapi_object_t *, const char *, int);
isc_result_t dhcp_lease_get (omapi_object_t **, const char *, int);
int find_grouped_subnet PROTO ((struct subnet **, struct shared_network *,
struct iaddr, const char *, int));
-int find_subnet (struct subnet **, struct iaddr, const char *, int);
+int find_subnet(struct subnet **, struct iaddr, const char *, int);
void enter_shared_network PROTO ((struct shared_network *));
void new_shared_network_interface PROTO ((struct parse *,
struct shared_network *,
const char *));
-int subnet_inner_than PROTO ((struct subnet *, struct subnet *, int));
+int subnet_inner_than(const struct subnet *, const struct subnet *, int);
void enter_subnet PROTO ((struct subnet *));
void enter_lease PROTO ((struct lease *));
int supersede_lease PROTO ((struct lease *, struct lease *, int, int, int));
@@ -2631,6 +2943,7 @@ void uid_hash_delete PROTO ((struct lease *));
void hw_hash_add PROTO ((struct lease *));
void hw_hash_delete PROTO ((struct lease *));
int write_leases PROTO ((void));
+int write_leases6(void);
int lease_enqueue (struct lease *);
isc_result_t lease_instantiate(const void *, unsigned, void *);
void expire_all_pools PROTO ((void));
@@ -2812,3 +3125,71 @@ OMAPI_OBJECT_ALLOC_DECL (dhcp_failover_link, dhcp_failover_link_t,
#endif /* FAILOVER_PROTOCOL */
const char *binding_state_print (enum failover_state);
+
+
+/* mdb6.c */
+HASH_FUNCTIONS_DECL(ia_na, unsigned char *, struct ia_na, ia_na_hash_t);
+HASH_FUNCTIONS_DECL(iaaddr, struct in6_addr *, struct iaaddr, iaaddr_hash_t);
+
+isc_result_t iaaddr_allocate(struct iaaddr **iaaddr,
+ const char *file, int line);
+isc_result_t iaaddr_reference(struct iaaddr **iaaddr, struct iaaddr *src,
+ const char *file, int line);
+isc_result_t iaaddr_dereference(struct iaaddr **iaaddr,
+ const char *file, int line);
+
+isc_result_t ia_na_make_key(struct data_string *key, u_int32_t iaid,
+ const char *duid, unsigned int duid_len,
+ const char *file, int line);
+isc_result_t ia_na_allocate(struct ia_na **ia_na, u_int32_t iaid,
+ const char *duid, unsigned int duid_len,
+ const char *file, int line);
+isc_result_t ia_na_reference(struct ia_na **ia_na, struct ia_na *src,
+ const char *file, int line);
+isc_result_t ia_na_dereference(struct ia_na **ia_na,
+ const char *file, int line);
+isc_result_t ia_na_add_iaaddr(struct ia_na *ia_na, struct iaaddr *iaaddr,
+ const char *file, int line);
+void ia_na_remove_iaaddr(struct ia_na *ia_na, struct iaaddr *iaaddr,
+ const char *file, int line);
+
+isc_result_t ipv6_pool_allocate(struct ipv6_pool **pool,
+ const struct in6_addr *start_addr, int bits,
+ const char *file, int line);
+isc_result_t ipv6_pool_reference(struct ipv6_pool **pool,
+ struct ipv6_pool *src,
+ const char *file, int line);
+isc_result_t ipv6_pool_dereference(struct ipv6_pool **pool,
+ const char *file, int line);
+isc_result_t activate_lease6(struct ipv6_pool *pool,
+ struct iaaddr **addr,
+ unsigned int *attempts,
+ const struct data_string *uid,
+ time_t valid_lifetime_end_time);
+isc_result_t add_lease6(struct ipv6_pool *pool,
+ struct iaaddr *addr,
+ time_t valid_lifetime_end_time);
+isc_result_t renew_lease6(struct ipv6_pool *pool, struct iaaddr *addr);
+isc_result_t expire_lease6(struct iaaddr **addr,
+ struct ipv6_pool *pool, time_t now);
+isc_result_t release_lease6(struct ipv6_pool *pool, struct iaaddr *addr);
+isc_result_t decline_lease6(struct ipv6_pool *pool, struct iaaddr *addr);
+isc_boolean_t lease6_exists(const struct ipv6_pool *pool,
+ const struct in6_addr *addr);
+isc_result_t mark_address_unavailble(struct ipv6_pool *pool,
+ const struct in6_addr *addr);
+
+isc_result_t add_ipv6_pool(struct ipv6_pool *pool);
+isc_result_t find_ipv6_pool(struct ipv6_pool **pool,
+ const struct in6_addr *addr);
+isc_boolean_t ipv6_addr_in_pool(const struct in6_addr *addr,
+ const struct ipv6_pool *pool);
+
+void expire_leases(time_t now);
+isc_result_t renew_leases(struct ia_na *ia_na);
+isc_result_t release_leases(struct ia_na *ia_na);
+isc_result_t decline_leases(struct ia_na *ia_na);
+
+void mark_hosts_unavailable(void);
+void mark_interfaces_unavailable(void);
+