#define ALL_IPV6_ROUTERS {{{0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02}}}
+#define IN6_IS_ADDR_ULA(a) (((a)->s6_addr32[0] & htonl(0xfe000000)) == htonl(0xfc000000))
struct interface;
+struct nl_sock;
extern struct list_head leases;
struct odhcpd_event {
struct uloop_fd uloop;
void (*handle_dgram)(void *addr, void *data, size_t len,
struct interface *iface, void *dest_addr);
- void (*handle_error)(int error);
+ void (*handle_error)(struct odhcpd_event *e, int error);
+ void (*recv_msgs)(struct odhcpd_event *e);
};
bool legacy;
char *dhcp_cb;
char *dhcp_statefile;
+ int log_level;
} config;
struct list_head ia_assignments;
struct odhcpd_ipaddr ia_addr[RELAYD_MAX_ADDRS];
size_t ia_addr_len;
- bool ia_reconf;
// DHCPv4
struct odhcpd_event dhcpv6_event;
bool always_rewrite_dns;
bool ra_not_onlink;
bool ra_advrouter;
+ bool ra_useleasetime;
bool no_dynamic_dhcp;
+ // RA
int learn_routes;
int default_router;
int managed;
int route_preference;
int ra_maxinterval;
+ int ra_mininterval;
+ int ra_lifetime;
// DHCPv4
struct in_addr dhcpv4_start;
// Exported main functions
-int odhcpd_open_rtnl(void);
int odhcpd_register(struct odhcpd_event *event);
+int odhcpd_deregister(struct odhcpd_event *event);
void odhcpd_process(struct odhcpd_event *event);
+struct nl_sock *odhcpd_create_nl_socket(int protocol);
ssize_t odhcpd_send(int socket, struct sockaddr_in6 *dest,
struct iovec *iov, size_t iov_len,
const struct interface *iface);
ssize_t odhcpd_get_interface_addresses(int ifindex,
struct odhcpd_ipaddr *addrs, size_t cnt);
-int odhcpd_get_linklocal_interface_address(int ifindex, struct in6_addr *lladdr);
+int odhcpd_get_interface_dns_addr(const struct interface *iface,
+ struct in6_addr *addr);
struct interface* odhcpd_get_interface_by_name(const char *name);
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_setup_route(const struct in6_addr *addr, int prefixlen,
+int odhcpd_setup_route(const struct in6_addr *addr, const int prefixlen,
const struct interface *iface, const struct in6_addr *gw,
- int metric, bool add);
+ const uint32_t metric, const bool add);
+int odhcpd_setup_proxy_neigh(const struct in6_addr *addr,
+ const struct interface *iface, const bool add);
void odhcpd_run(void);
time_t odhcpd_time(void);
int config_parse_interface(void *data, size_t len, const char *iname, bool overwrite);
+void ndp_handle_addr6_dump(void);
+void ndp_rqs_addr6_dump(void);
+
#ifdef WITH_UBUS
int init_ubus(void);
const char* ubus_get_ifname(const char *name);