static bool addr_is_fr_ip(struct interface *iface, struct in_addr *addr);
static void valid_until_cb(struct uloop_timeout *event);
static void handle_addrlist_change(struct interface *iface);
-static void free_dhcpv4_assignment(struct dhcpv4_assignment *a);
-static void dhcpv4_fr_start(struct dhcpv4_assignment *a);
-static void dhcpv4_fr_rand_delay(struct dhcpv4_assignment *a);
-static void dhcpv4_fr_stop(struct dhcpv4_assignment *a);
+static void free_dhcpv4_assignment(struct dhcp_assignment *a);
+static void dhcpv4_fr_start(struct dhcp_assignment *a);
+static void dhcpv4_fr_rand_delay(struct dhcp_assignment *a);
+static void dhcpv4_fr_stop(struct dhcp_assignment *a);
static void handle_dhcpv4(void *addr, void *data, size_t len,
struct interface *iface, void *dest_addr);
-static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface,
+static struct dhcp_assignment* dhcpv4_lease(struct interface *iface,
enum dhcpv4_msg msg, const uint8_t *mac, const uint32_t reqaddr,
uint32_t *leasetime, const char *hostname, const size_t hostname_len,
const bool accept_fr_nonce, bool *incl_fr_opt, uint32_t *fr_serverid);
} else if (iface->dhcpv4_assignments.next) {
while (!list_empty(&iface->dhcpv4_assignments))
free_dhcpv4_assignment(list_first_entry(&iface->dhcpv4_assignments,
- struct dhcpv4_assignment, head));
+ struct dhcp_assignment, head));
}
out:
}
}
-static struct dhcpv4_assignment *find_assignment_by_hwaddr(struct interface *iface, const uint8_t *hwaddr)
+static struct dhcp_assignment *find_assignment_by_hwaddr(struct interface *iface, const uint8_t *hwaddr)
{
- struct dhcpv4_assignment *a;
+ struct dhcp_assignment *a;
list_for_each_entry(a, &iface->dhcpv4_assignments, head)
if (!memcmp(a->hwaddr, hwaddr, 6))
return NULL;
}
-static struct dhcpv4_assignment *find_assignment_by_addr(struct interface *iface, const uint32_t addr)
+static struct dhcp_assignment *find_assignment_by_addr(struct interface *iface, const uint32_t addr)
{
- struct dhcpv4_assignment *a;
+ struct dhcp_assignment *a;
list_for_each_entry(a, &iface->dhcpv4_assignments, head)
if (a->addr == addr)
static void update_static_assignments(struct interface *iface)
{
- struct dhcpv4_assignment *a, *c;
+ struct dhcp_assignment *a, *c;
/* Cleanup static entries not belonging to the network */
list_for_each_entry_safe(a, c, &iface->dhcpv4_assignments, head) {
static bool leases_require_fr(struct interface *iface, struct odhcpd_ipaddr *addr,
uint32_t mask)
{
- struct dhcpv4_assignment *a = NULL;
+ struct dhcp_assignment *a = NULL;
struct odhcpd_ref_ip *fr_ip = NULL;
list_for_each_entry(a, &iface->dhcpv4_assignments, head) {
if (iface->dhcpv4 != MODE_SERVER || iface->dhcpv4_assignments.next == NULL)
continue;
- struct dhcpv4_assignment *a, *n;
+ struct dhcp_assignment *a, *n;
list_for_each_entry_safe(a, n, &iface->dhcpv4_assignments, head) {
if (!INFINITE_VALID(a->valid_until) && a->valid_until < now)
free_dhcpv4_assignment(a);
{
struct odhcpd_ipaddr ip;
struct odhcpd_ref_ip *a;
- struct dhcpv4_assignment *c;
+ struct dhcp_assignment *c;
uint32_t mask = iface->dhcpv4_mask.s_addr;
memset(&ip, 0, sizeof(ip));
}
}
-static void free_dhcpv4_assignment(struct dhcpv4_assignment *a)
+static void free_dhcpv4_assignment(struct dhcp_assignment *a)
{
if (a->head.next)
list_del(&a->head);
*cookie = c + len;
}
-static void dhcpv4_fr_send(struct dhcpv4_assignment *a)
+static void dhcpv4_fr_send(struct dhcp_assignment *a)
{
struct dhcpv4_message fr_msg = {
.op = DHCPV4_BOOTREPLY,
static void dhcpv4_fr_timer(struct uloop_timeout *event)
{
- struct dhcpv4_assignment *a = container_of(event, struct dhcpv4_assignment, fr_timer);
+ struct dhcp_assignment *a = container_of(event, struct dhcp_assignment, fr_timer);
if (a->fr_cnt > 0 && a->fr_cnt < 8) {
dhcpv4_fr_send(a);
dhcpv4_fr_stop(a);
}
-static void dhcpv4_fr_start(struct dhcpv4_assignment *a)
+static void dhcpv4_fr_start(struct dhcp_assignment *a)
{
uloop_timeout_set(&a->fr_timer, 1000 << a->fr_cnt);
a->fr_timer.cb = dhcpv4_fr_timer;
static void dhcpv4_fr_delay_timer(struct uloop_timeout *event)
{
- struct dhcpv4_assignment *a = container_of(event, struct dhcpv4_assignment, fr_timer);
+ struct dhcp_assignment *a = container_of(event, struct dhcp_assignment, fr_timer);
struct interface *iface = a->iface;
(iface->dhcpv4_event.uloop.fd == -1 ? dhcpv4_fr_rand_delay(a) : dhcpv4_fr_start(a));
}
-static void dhcpv4_fr_rand_delay(struct dhcpv4_assignment *a)
+static void dhcpv4_fr_rand_delay(struct dhcp_assignment *a)
{
#define MIN_DELAY 500
#define MAX_FUZZ 500
a->fr_timer.cb = dhcpv4_fr_delay_timer;
}
-static void dhcpv4_fr_stop(struct dhcpv4_assignment *a)
+static void dhcpv4_fr_stop(struct dhcp_assignment *a)
{
uloop_timeout_cancel(&a->fr_timer);
decr_ref_cnt_ip(&a->fr_ip, a->iface);
reqmsg != DHCPV4_MSG_RELEASE)
return;
- struct dhcpv4_assignment *lease = NULL;
+ struct dhcp_assignment *lease = NULL;
uint32_t serverid = iface->dhcpv4_local.s_addr;
uint32_t fr_serverid = INADDR_ANY;
}
static bool dhcpv4_assign(struct interface *iface,
- struct dhcpv4_assignment *assign, uint32_t raddr)
+ struct dhcp_assignment *assign, uint32_t raddr)
{
uint32_t start = ntohl(iface->dhcpv4_start_ip.s_addr);
uint32_t end = ntohl(iface->dhcpv4_end_ip.s_addr);
}
-static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface,
+static struct dhcp_assignment* dhcpv4_lease(struct interface *iface,
enum dhcpv4_msg msg, const uint8_t *mac, const uint32_t reqaddr,
uint32_t *leasetime, const char *hostname, const size_t hostname_len,
const bool accept_fr_nonce, bool *incl_fr_opt, uint32_t *fr_serverid)
{
- struct dhcpv4_assignment *a = find_assignment_by_hwaddr(iface, mac);
- struct dhcpv4_assignment *lease = NULL;
+ struct dhcp_assignment *a = find_assignment_by_hwaddr(iface, mac);
+ struct dhcp_assignment *lease = NULL;
time_t now = odhcpd_time();
if (a && (a->flags & OAF_BOUND) && a->fr_ip) {
(addrs)[(i)].prefix > 64)
static void dhcpv6_netevent_cb(unsigned long event, struct netevent_handler_info *info);
-static void free_dhcpv6_assignment(struct dhcpv6_assignment *c);
-static void set_border_assignment_size(struct interface *iface, struct dhcpv6_assignment *b);
+static void free_dhcpv6_assignment(struct dhcp_assignment *c);
+static void set_border_assignment_size(struct interface *iface, struct dhcp_assignment *b);
static void handle_addrlist_change(struct netevent_handler_info *info);
-static void start_reconf(struct dhcpv6_assignment *a);
-static void stop_reconf(struct dhcpv6_assignment *a);
+static void start_reconf(struct dhcp_assignment *a);
+static void stop_reconf(struct dhcp_assignment *a);
static void valid_until_cb(struct uloop_timeout *event);
static struct netevent_handler dhcpv6_netevent_handler = { .cb = dhcpv6_netevent_cb, };
int dhcpv6_setup_ia_interface(struct interface *iface, bool enable)
{
if (!enable && iface->ia_assignments.next) {
- struct dhcpv6_assignment *c;
+ struct dhcp_assignment *c;
while (!list_empty(&iface->ia_assignments)) {
- c = list_first_entry(&iface->ia_assignments, struct dhcpv6_assignment, head);
+ c = list_first_entry(&iface->ia_assignments, struct dhcp_assignment, head);
free_dhcpv6_assignment(c);
}
}
if (enable && iface->dhcpv6 == MODE_SERVER) {
- struct dhcpv6_assignment *border;
+ struct dhcp_assignment *border;
struct lease *lease;
if (!iface->ia_assignments.next)
border->length = 64;
list_add(&border->head, &iface->ia_assignments);
} else
- border = list_last_entry(&iface->ia_assignments, struct dhcpv6_assignment, head);
+ border = list_last_entry(&iface->ia_assignments, struct dhcp_assignment, head);
set_border_assignment_size(iface, border);
list_for_each_entry(lease, &leases, head) {
/* Construct entry */
size_t duid_len = lease->duid_len ? lease->duid_len : 14;
- struct dhcpv6_assignment *a = calloc(1, sizeof(*a) + duid_len);
+ struct dhcp_assignment *a = calloc(1, sizeof(*a) + duid_len);
if (!a) {
syslog(LOG_ERR, "Calloc failed for static lease assignment on %s",
iface->name);
a->valid_until = 0;
/* Assign to all interfaces */
- struct dhcpv6_assignment *c;
+ struct dhcp_assignment *c;
list_for_each_entry(c, &iface->ia_assignments, head) {
if (c->length != 128 || c->assigned > a->assigned) {
list_add_tail(&a->head, &c->head);
}
-static void free_dhcpv6_assignment(struct dhcpv6_assignment *c)
+static void free_dhcpv6_assignment(struct dhcp_assignment *c)
{
if (c->managed_sock.fd.registered) {
ustream_free(&c->managed_sock.stream);
free(c);
}
-static inline bool valid_prefix_length(const struct dhcpv6_assignment *a, const uint8_t prefix_length)
+static inline bool valid_prefix_length(const struct dhcp_assignment *a, const uint8_t prefix_length)
{
return (a->managed_size || a->length > prefix_length);
}
return m;
}
-static int send_reconf(struct dhcpv6_assignment *assign)
+static int send_reconf(struct dhcp_assignment *assign)
{
struct {
struct dhcpv6_client_header hdr;
return odhcpd_send(iface->dhcpv6_event.uloop.fd, &assign->peer, &iov, 1, iface);
}
-void dhcpv6_enum_ia_addrs(struct interface *iface, struct dhcpv6_assignment *c,
+void dhcpv6_enum_ia_addrs(struct interface *iface, struct dhcp_assignment *c,
time_t now, dhcpv6_binding_cb_handler_t func, void *arg)
{
struct odhcpd_ipaddr *addrs = (c->managed) ? c->managed : iface->addr6;
struct write_ctxt {
FILE *fp;
md5_ctx_t md5;
- struct dhcpv6_assignment *c;
+ struct dhcp_assignment *c;
struct interface *iface;
char *buf;
int buf_len;
if (ctxt.iface->dhcpv4 == MODE_SERVER &&
ctxt.iface->dhcpv4_assignments.next) {
- struct dhcpv4_assignment *c;
+ struct dhcp_assignment *c;
list_for_each_entry(c, &ctxt.iface->dhcpv4_assignments, head) {
if (!(c->flags & OAF_BOUND))
continue;
}
}
-static void __apply_lease(struct interface *iface, struct dhcpv6_assignment *a,
+static void __apply_lease(struct interface *iface, struct dhcp_assignment *a,
struct odhcpd_ipaddr *addrs, ssize_t addr_len, bool add)
{
if (a->length > 64)
}
}
-static void apply_lease(struct interface *iface, struct dhcpv6_assignment *a, bool add)
+static void apply_lease(struct interface *iface, struct dhcp_assignment *a, bool add)
{
struct odhcpd_ipaddr *addrs = (a->managed) ? a->managed : iface->addr6;
ssize_t addrlen = (a->managed) ? a->managed_size : (ssize_t)iface->addr6_len;
}
/* Set border assignment size based on the IPv6 address prefixes */
-static void set_border_assignment_size(struct interface *iface, struct dhcpv6_assignment *b)
+static void set_border_assignment_size(struct interface *iface, struct dhcp_assignment *b)
{
time_t now = odhcpd_time();
int minprefix = -1;
static void managed_handle_pd_data(struct ustream *s, _unused int bytes_new)
{
struct ustream_fd *fd = container_of(s, struct ustream_fd, stream);
- struct dhcpv6_assignment *c = container_of(fd, struct dhcpv6_assignment, managed_sock);
+ struct dhcp_assignment *c = container_of(fd, struct dhcp_assignment, managed_sock);
time_t now = odhcpd_time();
bool first = c->managed_size < 0;
static void managed_handle_pd_done(struct ustream *s)
{
struct ustream_fd *fd = container_of(s, struct ustream_fd, stream);
- struct dhcpv6_assignment *c = container_of(fd, struct dhcpv6_assignment, managed_sock);
+ struct dhcp_assignment *c = container_of(fd, struct dhcp_assignment, managed_sock);
if (!(c->flags & OAF_STATIC))
c->valid_until = odhcpd_time() + 15;
c->reconf_cnt = 1;
}
-static bool assign_pd(struct interface *iface, struct dhcpv6_assignment *assign)
+static bool assign_pd(struct interface *iface, struct dhcp_assignment *assign)
{
- struct dhcpv6_assignment *c;
+ struct dhcp_assignment *c;
if (iface->dhcpv6_pd_manager[0]) {
int fd = usock(USOCK_UNIX | USOCK_TCP, iface->dhcpv6_pd_manager, NULL);
return false;
}
-static bool assign_na(struct interface *iface, struct dhcpv6_assignment *assign)
+static bool assign_na(struct interface *iface, struct dhcp_assignment *assign)
{
/* Seed RNG with checksum of DUID */
uint32_t seed = 0;
uint32_t try;
do try = ((uint32_t)rand()) % 0x0fff; while (try < 0x100);
- struct dhcpv6_assignment *c;
+ struct dhcp_assignment *c;
list_for_each_entry(c, &iface->ia_assignments, head) {
if (c->length == 0)
continue;
static void handle_addrlist_change(struct netevent_handler_info *info)
{
struct interface *iface = info->iface;
- struct dhcpv6_assignment *c, *d, *border = list_last_entry(
- &iface->ia_assignments, struct dhcpv6_assignment, head);
+ struct dhcp_assignment *c, *d, *border = list_last_entry(
+ &iface->ia_assignments, struct dhcp_assignment, head);
struct list_head reassign = LIST_HEAD_INIT(reassign);
time_t now = odhcpd_time();
apply_lease(iface, c, true);
if (c->accept_reconf && c->reconf_cnt == 0) {
- struct dhcpv6_assignment *a;
+ struct dhcp_assignment *a;
start_reconf(c);
}
while (!list_empty(&reassign)) {
- c = list_first_entry(&reassign, struct dhcpv6_assignment, head);
+ c = list_first_entry(&reassign, struct dhcp_assignment, head);
list_del(&c->head);
if (!assign_pd(iface, c)) {
c->assigned = 0;
static void reconf_timeout_cb(struct uloop_timeout *event)
{
- struct dhcpv6_assignment *a = container_of(event, struct dhcpv6_assignment, reconf_timer);
+ struct dhcp_assignment *a = container_of(event, struct dhcp_assignment, reconf_timer);
if (a->reconf_cnt > 0 && a->reconf_cnt < DHCPV6_REC_MAX_RC) {
send_reconf(a);
stop_reconf(a);
}
-static void start_reconf(struct dhcpv6_assignment *a)
+static void start_reconf(struct dhcp_assignment *a)
{
uloop_timeout_set(&a->reconf_timer,
DHCPV6_REC_TIMEOUT << a->reconf_cnt);
send_reconf(a);
}
-static void stop_reconf(struct dhcpv6_assignment *a)
+static void stop_reconf(struct dhcp_assignment *a)
{
uloop_timeout_cancel(&a->reconf_timer);
a->reconf_cnt = 0;
time_t now = odhcpd_time();
avl_for_each_element(&interfaces, iface, avl) {
- struct dhcpv6_assignment *a, *n;
+ struct dhcp_assignment *a, *n;
if (iface->dhcpv6 != MODE_SERVER || iface->ia_assignments.next == NULL)
continue;
}
static size_t build_ia(uint8_t *buf, size_t buflen, uint16_t status,
- const struct dhcpv6_ia_hdr *ia, struct dhcpv6_assignment *a,
+ const struct dhcpv6_ia_hdr *ia, struct dhcp_assignment *a,
struct interface *iface, bool request)
{
struct dhcpv6_ia_hdr o_ia = {
}
static void dhcpv6_log(uint8_t msgtype, struct interface *iface, time_t now,
- const char *duidbuf, bool is_pd, struct dhcpv6_assignment *a, int code)
+ const char *duidbuf, bool is_pd, struct dhcp_assignment *a, int code)
{
const char *type = "UNKNOWN";
const char *status = "UNKNOWN";
duidbuf, iface->name, status, leasebuf);
}
-static bool dhcpv6_ia_on_link(const struct dhcpv6_ia_hdr *ia, struct dhcpv6_assignment *a,
+static bool dhcpv6_ia_on_link(const struct dhcpv6_ia_hdr *ia, struct dhcp_assignment *a,
struct interface *iface)
{
struct odhcpd_ipaddr *addrs = (a && a->managed) ? a->managed : iface->addr6;
if (!clid_data || !clid_len || clid_len > 130)
goto out;
- struct dhcpv6_assignment *first = NULL;
+ struct dhcp_assignment *first = NULL;
dhcpv6_for_each_option(start, end, otype, olen, odata) {
bool is_pd = (otype == DHCPV6_OPT_IA_PD);
bool is_na = (otype == DHCPV6_OPT_IA_NA);
}
/* Find assignment */
- struct dhcpv6_assignment *c, *a = NULL;
+ struct dhcp_assignment *c, *a = NULL;
list_for_each_entry(c, &iface->ia_assignments, head) {
if (((c->clid_len == clid_len && !memcmp(c->clid_data, clid_data, clid_len)) ||
(c->clid_len >= clid_len && !c->clid_data[0] && !c->clid_data[1]