struct list_head head;
struct list_head lease_list;
+ void (*dhcp_free_cb)(struct dhcp_assignment *a);
+
struct interface *iface;
struct lease *lease;
size_t addr6_len;
// RA runtime data
+ struct odhcpd_event router_event;
struct uloop_timeout timer_rs;
// DHCPv6 runtime data
// NDP runtime data
struct odhcpd_event ndp_event;
+ int ndp_ping_fd;
// IPv4 runtime data
struct odhcpd_ipaddr *addr4;
#define RA_MANAGED_MFLAG 1
#define RA_MANAGED_NO_AFLAG 2
+inline static void free_assignment(struct dhcp_assignment *a)
+{
+ if (a->head.next)
+ list_del(&a->head);
+
+ if (a->lease_list.next)
+ list_del(&a->lease_list);
+
+ if (a->dhcp_free_cb)
+ a->dhcp_free_cb(a);
+
+ free(a->hostname);
+ free(a);
+}
// Exported main functions
int odhcpd_register(struct odhcpd_event *event);
int odhcpd_get_interface_config(const char *ifname, const char *what);
int odhcpd_get_mac(const struct interface *iface, uint8_t mac[6]);
struct interface* odhcpd_get_interface_by_index(int ifindex);
-struct interface* odhcpd_get_master_interface(void);
int odhcpd_urandom(void *data, size_t len);
void odhcpd_run(void);
const struct in_addr *addr, const char *name, const char *interface);
#endif
-void dhcpv4_free_assignment(struct dhcp_assignment *a);
-
ssize_t dhcpv6_ia_handle_IAs(uint8_t *buf, size_t buflen, struct interface *iface,
const struct sockaddr_in6 *addr, const void *data, const uint8_t *end);
int dhcpv6_ia_init(void);
void dhcpv6_ia_enum_addrs(struct interface *iface, struct dhcp_assignment *c, time_t now,
dhcpv6_binding_cb_handler_t func, void *arg);
void dhcpv6_ia_write_statefile(void);
-void dhcpv6_ia_free_assignment(struct dhcp_assignment *c);
int netlink_add_netevent_handler(struct netevent_handler *hdlr);
ssize_t netlink_get_interface_addrs(const int ifindex, bool v6,