#ifndef nitems
#define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
#endif
#define _PATH_LOCKFILE "/dev/dhcp6leased.lock"
#define _PATH_CONF_FILE "/etc/dhcp6leased.conf"
#define _PATH_CTRL_SOCKET "/dev/dhcp6leased.sock"
#define DHCP6LEASED_USER "_dhcp6leased"
#define DHCP6LEASED_RTA_LABEL "dhcp6leased"
#define CLIENT_PORT 546
#define SERVER_PORT 547
#define _PATH_LEASE "/var/db/dhcp6leased/"
#define _PATH_UUID _PATH_LEASE"uuid"
#define UUID_SIZE 16
#define UUID_STR_SIZE sizeof("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n")
#define DUID_UUID_TYPE 4
#define XID_SIZE 3
#define SERVERID_SIZE 130
#define MAX_IA 32
#define LEASE_SIZE 4096
#define LEASE_IA_PD_PREFIX "ia_pd "
#define DHCP6LEASED_MAX_DNSSL 1025
#define MAX_RDNS_COUNT 8
#define MAX_DHCP_ROUTES 256
#define OPENBSD_ENTERPRISENO 30155
#define DHCPSOLICIT 1
#define DHCPADVERTISE 2
#define DHCPREQUEST 3
#define DHCPCONFIRM 4
#define DHCPRENEW 5
#define DHCPREBIND 6
#define DHCPREPLY 7
#define DHCPRELEASE 8
#define DHCPDECLINE 9
#define DHCPRECONFIGURE 10
#define DHCPINFORMATIONREQUEST 11
#define DHCPRELAYFORW 12
#define DHCPRELAYREPL 13
#define DHO_CLIENTID 1
#define DHO_SERVERID 2
#define DHO_ORO 6
#define DHO_ELAPSED_TIME 8
#define DHO_STATUS_CODE 13
#define DHO_RAPID_COMMIT 14
#define DHO_VENDOR_CLASS 16
#define DHO_IA_PD 25
#define DHO_IA_PREFIX 26
#define DHO_SOL_MAX_RT 82
#define DHO_INF_MAX_RT 83
#define DHCP_STATUS_SUCCESS 0
#define DHCP_STATUS_UNSPECFAIL 1
#define DHCP_STATUS_NOADDRSAVAIL 2
#define DHCP_STATUS_NOBINDING 3
#define DHCP_STATUS_NOTONLINK 4
#define DHCP_STATUS_USEMULTICAST 5
#define DHCP_STATUS_NOPREFIXAVAIL 6
#define IGN_ROUTES 1
#define IGN_DNS 2
#define MAX_SERVERS 16
#define IMSG_DATA_SIZE(imsg) ((imsg).hdr.len - IMSG_HEADER_SIZE)
#define DHCP_SNAME_LEN 64
#define DHCP_FILE_LEN 128
struct dhcp_hdr {
uint8_t msg_type;
uint8_t xid[XID_SIZE];
} __packed;
struct dhcp_option_hdr {
uint16_t code;
uint16_t len;
} __packed;
struct dhcp_duid {
uint16_t type;
uint8_t uuid[UUID_SIZE];
} __packed;
struct dhcp_iapd {
uint32_t iaid;
uint32_t t1;
uint32_t t2;
} __packed;
struct dhcp_vendor_class {
uint32_t enterprise_number;
uint16_t vendor_class_len;
} __packed;
struct dhcp_iaprefix {
uint32_t pltime;
uint32_t vltime;
uint8_t prefix_len;
struct in6_addr prefix;
} __packed;
struct imsgev {
struct imsgbuf ibuf;
void (*handler)(int, short, void *);
struct event ev;
short events;
};
struct dhcp_route {
struct in_addr dst;
struct in_addr mask;
struct in_addr gw;
};
enum imsg_type {
IMSG_NONE,
IMSG_CTL_LOG_VERBOSE,
IMSG_CTL_SHOW_INTERFACE_INFO,
IMSG_CTL_SEND_REQUEST,
IMSG_CTL_RELOAD,
IMSG_CTL_END,
IMSG_RECONF_CONF,
IMSG_RECONF_IFACE,
IMSG_RECONF_IFACE_IA,
IMSG_RECONF_IFACE_PD,
IMSG_RECONF_IFACE_IA_END,
IMSG_RECONF_IFACE_END,
IMSG_RECONF_END,
IMSG_SEND_SOLICIT,
IMSG_SEND_REQUEST,
IMSG_SEND_RENEW,
IMSG_SEND_REBIND,
IMSG_SOCKET_IPC,
IMSG_OPEN_UDPSOCK,
IMSG_UDPSOCK,
IMSG_ROUTESOCK,
IMSG_UUID,
IMSG_CONTROLFD,
IMSG_STARTUP,
IMSG_UPDATE_IF,
IMSG_REMOVE_IF,
IMSG_DHCP,
IMSG_CONFIGURE_ADDRESS,
IMSG_DECONFIGURE_ADDRESS,
IMSG_CONFIGURE_REJECT_ROUTE,
IMSG_DECONFIGURE_REJECT_ROUTE,
IMSG_REQUEST_REBOOT,
IMSG_WRITE_LEASE,
};
struct prefix {
struct in6_addr prefix;
int prefix_len;
uint32_t vltime;
uint32_t pltime;
};
struct ctl_engine_info {
uint32_t if_index;
int running;
int link_state;
char state[sizeof("IF_INIT_REBOOT")];
struct timespec request_time;
uint32_t lease_time;
uint32_t t1;
uint32_t t2;
struct prefix pds[MAX_IA];
};
struct iface_pd_conf {
SIMPLEQ_ENTRY(iface_pd_conf) entry;
char name[IF_NAMESIZE];
struct in6_addr prefix_mask;
int prefix_len;
};
struct iface_ia_conf {
SIMPLEQ_ENTRY(iface_ia_conf) entry;
SIMPLEQ_HEAD(iface_pd_conf_head, iface_pd_conf) iface_pd_list;
int id;
int prefix_len;
};
struct iface_conf {
SIMPLEQ_ENTRY(iface_conf) entry;
SIMPLEQ_HEAD(iface_ia_conf_head,
iface_ia_conf) iface_ia_list;
uint32_t ia_count;
char name[IF_NAMESIZE];
};
struct dhcp6leased_conf {
SIMPLEQ_HEAD(iface_conf_head, iface_conf) iface_list;
int rapid_commit;
};
struct imsg_ifinfo {
uint32_t if_index;
int rdomain;
int running;
int link_state;
struct prefix pds[MAX_IA];
};
struct imsg_dhcp {
uint32_t if_index;
ssize_t len;
uint8_t packet[1500];
};
struct imsg_req_dhcp {
uint32_t if_index;
int elapsed_time;
uint8_t xid[XID_SIZE];
int serverid_len;
uint8_t serverid[SERVERID_SIZE];
struct prefix pds[MAX_IA];
};
struct imsg_lease_info {
uint32_t if_index;
struct prefix pds[MAX_IA];
};
void imsg_event_add(struct imsgev *);
int imsg_compose_event(struct imsgev *, uint16_t, uint32_t,
pid_t, int, void *, uint16_t);
void config_clear(struct dhcp6leased_conf *);
struct dhcp6leased_conf *config_new_empty(void);
void merge_config(struct dhcp6leased_conf *, struct
dhcp6leased_conf *);
const char *sin6_to_str(struct sockaddr_in6 *);
const char *dhcp_message_type2str(int);
struct iface_conf *find_iface_conf(struct iface_conf_head *, char *);
int *changed_ifaces(struct dhcp6leased_conf *, struct
dhcp6leased_conf *);
void print_config(struct dhcp6leased_conf *, int);
struct file {
TAILQ_ENTRY(file) entry;
FILE *stream;
char *name;
size_t ungetpos;
size_t ungetsize;
u_char *ungetbuf;
int eof_reached;
int lineno;
int errors;
};
struct dhcp6leased_conf *parse_config(const char *);
struct file *pushfile(const char *, int);
int popfile(void);
int kw_cmp(const void *, const void *);
int lgetc(int);
void lungetc(int);
int findeol(void);
void parse_lease(const char*, struct imsg_ifinfo *);