X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Fodhcpd.h;h=09013c4b094b76f1555f6bbe7e951c746821329c;hb=refs%2Fheads%2Fmaster;hp=e346e97e19481e82d68d944b5db7ecdcc355e999;hpb=1f01299c677653cf6d67c82c2df7b7e028508876;p=oweals%2Fodhcpd.git diff --git a/src/odhcpd.h b/src/odhcpd.h index e346e97..09013c4 100644 --- a/src/odhcpd.h +++ b/src/odhcpd.h @@ -44,6 +44,7 @@ struct interface; struct nl_sock; extern struct vlist_tree leases; +extern struct config config; struct odhcpd_event { struct uloop_fd uloop; @@ -129,7 +130,8 @@ enum odhcpd_assignment_flags { OAF_STATIC = (1 << 2), OAF_BROKEN_HOSTNAME = (1 << 3), OAF_DHCPV4 = (1 << 4), - OAF_DHCPV6 = (1 << 5), + OAF_DHCPV6_NA = (1 << 5), + OAF_DHCPV6_PD = (1 << 6), }; struct config { @@ -138,7 +140,7 @@ struct config { char *dhcp_cb; char *dhcp_statefile; int log_level; -} config; +}; struct lease { @@ -160,6 +162,8 @@ struct dhcp_assignment { struct list_head head; struct list_head lease_list; + void (*dhcp_free_cb)(struct dhcp_assignment *a); + struct interface *iface; struct lease *lease; @@ -187,6 +191,7 @@ struct dhcp_assignment { unsigned int flags; uint32_t leasetime; char *hostname; + char *reqopts; #define hwaddr mac uint8_t mac[6]; @@ -207,7 +212,9 @@ struct interface { size_t addr6_len; // RA runtime data + struct odhcpd_event router_event; struct uloop_timeout timer_rs; + uint32_t ra_sent; // DHCPv6 runtime data struct odhcpd_event dhcpv6_event; @@ -215,6 +222,7 @@ struct interface { // NDP runtime data struct odhcpd_event ndp_event; + int ndp_ping_fd; // IPv4 runtime data struct odhcpd_ipaddr *addr4; @@ -241,6 +249,13 @@ struct interface { bool master; bool ignore; bool always_rewrite_dns; + + // NDP + int learn_routes; + + // RA + uint8_t ra_flags; + bool ra_slaac; bool ra_not_onlink; bool ra_advrouter; bool ra_useleasetime; @@ -248,11 +263,7 @@ struct interface { bool no_dynamic_dhcp; uint8_t pio_filter_length; struct in6_addr pio_filter_addr; - - // RA - int learn_routes; int default_router; - int ra_managed; int route_preference; int ra_maxinterval; int ra_mininterval; @@ -262,6 +273,9 @@ struct interface { uint32_t ra_hoplimit; int ra_mtu; + // DHCP + uint32_t dhcp_leasetime; + // DHCPv4 struct in_addr dhcpv4_start; struct in_addr dhcpv4_end; @@ -274,7 +288,6 @@ struct interface { size_t dhcpv4_router_cnt; struct in_addr *dhcpv4_dns; size_t dhcpv4_dns_cnt; - uint32_t dhcpv4_leasetime; bool dhcpv4_forcereconf; // DNS @@ -298,10 +311,31 @@ struct interface { extern struct avl_tree interfaces; -#define RA_MANAGED_NO_MFLAG 0 -#define RA_MANAGED_MFLAG 1 -#define RA_MANAGED_NO_AFLAG 2 +inline static void free_assignment(struct dhcp_assignment *a) +{ + list_del(&a->head); + list_del(&a->lease_list); + + if (a->dhcp_free_cb) + a->dhcp_free_cb(a); + + free(a->hostname); + free(a->reqopts); + free(a); +} + +inline static struct dhcp_assignment *alloc_assignment(size_t extra_len) +{ + struct dhcp_assignment *a = calloc(1, sizeof(*a) + extra_len); + + if (!a) + return NULL; + + INIT_LIST_HEAD(&a->head); + INIT_LIST_HEAD(&a->lease_list); + return a; +} // Exported main functions int odhcpd_register(struct odhcpd_event *event); @@ -316,7 +350,6 @@ int odhcpd_get_interface_dns_addr(const struct interface *iface, 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); @@ -354,11 +387,11 @@ int dhcpv6_ia_setup_interface(struct interface *iface, bool enable); 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, struct odhcpd_ipaddr **addrs); +int netlink_get_interface_proxy_neigh(int ifindex, const struct in6_addr *addr); int netlink_setup_route(const struct in6_addr *addr, const int prefixlen, const int ifindex, const struct in6_addr *gw, const uint32_t metric, const bool add); @@ -376,7 +409,6 @@ int dhcpv6_init(void); int ndp_init(void); #ifdef DHCPV4_SUPPORT int dhcpv4_init(void); -void dhcpv4_free_assignment(struct dhcp_assignment *a); int dhcpv4_setup_interface(struct interface *iface, bool enable); #endif