struct interface;
struct nl_sock;
extern struct vlist_tree leases;
+extern struct config config;
struct odhcpd_event {
struct uloop_fd uloop;
void (*recv_msgs)(struct odhcpd_event *e);
};
+typedef int (*send_reply_cb_t)(const void *buf, size_t len,
+ const struct sockaddr *dest, socklen_t dest_len,
+ void *opaque);
+
typedef void (*dhcpv6_binding_cb_handler_t)(struct in6_addr *addr, int prefix,
uint32_t pref, uint32_t valid,
void *arg);
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 {
char *dhcp_cb;
char *dhcp_statefile;
int log_level;
-} config;
+};
struct lease {
unsigned int flags;
uint32_t leasetime;
char *hostname;
+ char *reqopts;
#define hwaddr mac
uint8_t mac[6];
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;
// NDP runtime data
struct odhcpd_event ndp_event;
+ int ndp_ping_fd;
// IPv4 runtime data
struct odhcpd_ipaddr *addr4;
bool master;
bool ignore;
bool always_rewrite_dns;
+ bool dns_service;
+
+ // NDP
+ int learn_routes;
+
+ // RA
+ uint8_t ra_flags;
+ bool ra_slaac;
bool ra_not_onlink;
bool ra_advrouter;
bool ra_useleasetime;
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;
uint32_t ra_hoplimit;
int ra_mtu;
+ // DHCP
+ uint32_t dhcp_leasetime;
+
// DHCPv4
struct in_addr dhcpv4_start;
struct in_addr dhcpv4_end;
size_t dhcpv4_router_cnt;
struct in_addr *dhcpv4_dns;
size_t dhcpv4_dns_cnt;
- uint32_t dhcpv4_leasetime;
bool dhcpv4_forcereconf;
// DNS
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)
{
- if (a->head.next)
- list_del(&a->head);
-
- if (a->lease_list.next)
- list_del(&a->lease_list);
+ 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);
int odhcpd_deregister(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);
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);
int dhcpv4_init(void);
int dhcpv4_setup_interface(struct interface *iface, bool enable);
+void dhcpv4_handle_msg(void *addr, void *data, size_t len,
+ struct interface *iface, _unused void *dest_addr,
+ send_reply_cb_t send_reply, void *opaque);
#endif
int router_setup_interface(struct interface *iface, bool enable);
int dhcpv6_setup_interface(struct interface *iface, bool enable);