diff options
author | Hans Dedecker <dedeckeh@gmail.com> | 2018-12-11 14:13:30 +0100 |
---|---|---|
committer | Hans Dedecker <dedeckeh@gmail.com> | 2019-02-08 14:07:21 +0100 |
commit | 7847b27e6533824e41fbae239acfda328b9cdfa5 (patch) | |
tree | 6674993d128d1c2ed30eacf44e41203ae6f46afe | |
parent | a54cee0d033ada75724b18a9350103a02e0ba956 (diff) |
treewide: unify dhcpv6 and dhcpv4 assignments
Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
-rw-r--r-- | src/dhcpv4.c | 52 | ||||
-rw-r--r-- | src/dhcpv4.h | 21 | ||||
-rw-r--r-- | src/dhcpv6-ia.c | 76 | ||||
-rw-r--r-- | src/dhcpv6.h | 32 | ||||
-rw-r--r-- | src/odhcpd.h | 39 | ||||
-rw-r--r-- | src/ubus.c | 6 |
6 files changed, 107 insertions, 119 deletions
diff --git a/src/dhcpv4.c b/src/dhcpv4.c index e29f490..e63deb9 100644 --- a/src/dhcpv4.c +++ b/src/dhcpv4.c @@ -41,13 +41,13 @@ static void update_static_assignments(struct interface *iface); 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); @@ -163,7 +163,7 @@ int dhcpv4_setup_interface(struct interface *iface, bool enable) } 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: @@ -195,9 +195,9 @@ static void dhcpv4_netevent_cb(unsigned long event, struct netevent_handler_info } } -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)) @@ -206,9 +206,9 @@ static struct dhcpv4_assignment *find_assignment_by_hwaddr(struct interface *ifa 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) @@ -293,7 +293,7 @@ static int setup_dhcpv4_addresses(struct interface *iface) 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) { @@ -388,7 +388,7 @@ static bool addr_is_fr_ip(struct interface *iface, struct in_addr *addr) 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) { @@ -419,7 +419,7 @@ static void valid_until_cb(struct uloop_timeout *event) 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); @@ -432,7 +432,7 @@ static void handle_addrlist_change(struct interface *iface) { 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)); @@ -495,7 +495,7 @@ static char *dhcpv4_msg_to_string(uint8_t reqmsg) } } -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); @@ -523,7 +523,7 @@ static void dhcpv4_put(struct dhcpv4_message *msg, uint8_t **cookie, *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, @@ -612,7 +612,7 @@ static void dhcpv4_fr_send(struct dhcpv4_assignment *a) 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); @@ -622,7 +622,7 @@ static void dhcpv4_fr_timer(struct uloop_timeout *event) 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; @@ -633,13 +633,13 @@ static void dhcpv4_fr_start(struct dhcpv4_assignment *a) 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 @@ -653,7 +653,7 @@ static void dhcpv4_fr_rand_delay(struct dhcpv4_assignment *a) 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); @@ -753,7 +753,7 @@ static void handle_dhcpv4(void *addr, void *data, size_t len, 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; @@ -967,7 +967,7 @@ static void handle_dhcpv4(void *addr, void *data, size_t len, } 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); @@ -1027,13 +1027,13 @@ static bool dhcpv4_assign(struct interface *iface, } -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) { diff --git a/src/dhcpv4.h b/src/dhcpv4.h index f48c005..96bd068 100644 --- a/src/dhcpv4.h +++ b/src/dhcpv4.h @@ -86,27 +86,6 @@ struct dhcpv4_auth_forcerenew { uint8_t key[16]; } _packed; -struct odhcpd_ref_ip; - -struct dhcpv4_assignment { - struct list_head head; - struct interface *iface; - - struct uloop_timeout fr_timer; - struct odhcpd_ref_ip *fr_ip; - bool accept_fr_nonce; - int fr_cnt; - uint8_t key[16]; - - unsigned int flags; - - uint32_t addr; - time_t valid_until; - uint8_t hwaddr[6]; - uint32_t leasetime; - char *hostname; -}; - struct dhcpv4_option { uint8_t type; uint8_t len; diff --git a/src/dhcpv6-ia.c b/src/dhcpv6-ia.c index af3b720..95f4307 100644 --- a/src/dhcpv6-ia.c +++ b/src/dhcpv6-ia.c @@ -40,11 +40,11 @@ (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, }; @@ -64,16 +64,16 @@ int dhcpv6_ia_init(void) 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) @@ -90,7 +90,7 @@ int dhcpv6_setup_ia_interface(struct interface *iface, bool enable) 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); @@ -98,7 +98,7 @@ int dhcpv6_setup_ia_interface(struct interface *iface, bool enable) 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); @@ -125,7 +125,7 @@ int dhcpv6_setup_ia_interface(struct interface *iface, bool enable) 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); @@ -166,7 +166,7 @@ static void dhcpv6_netevent_cb(unsigned long event, struct netevent_handler_info } -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); @@ -184,7 +184,7 @@ static void free_dhcpv6_assignment(struct dhcpv6_assignment *c) 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); } @@ -208,7 +208,7 @@ static size_t get_preferred_addr(const struct odhcpd_ipaddr *addrs, const size_t return m; } -static int send_reconf(struct dhcpv6_assignment *assign) +static int send_reconf(struct dhcp_assignment *assign) { struct { struct dhcpv6_client_header hdr; @@ -272,7 +272,7 @@ static int send_reconf(struct dhcpv6_assignment *assign) 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; @@ -316,7 +316,7 @@ void dhcpv6_enum_ia_addrs(struct interface *iface, struct dhcpv6_assignment *c, 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; @@ -415,7 +415,7 @@ void dhcpv6_write_statefile(void) 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; @@ -476,7 +476,7 @@ void dhcpv6_write_statefile(void) } } -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) @@ -491,7 +491,7 @@ static void __apply_lease(struct interface *iface, struct dhcpv6_assignment *a, } } -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; @@ -500,7 +500,7 @@ static void apply_lease(struct interface *iface, struct dhcpv6_assignment *a, bo } /* 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; @@ -522,7 +522,7 @@ static void set_border_assignment_size(struct interface *iface, struct dhcpv6_as 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; @@ -594,7 +594,7 @@ static void managed_handle_pd_data(struct ustream *s, _unused int bytes_new) 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; @@ -605,9 +605,9 @@ static void managed_handle_pd_done(struct ustream *s) 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); @@ -691,7 +691,7 @@ static bool assign_pd(struct interface *iface, struct dhcpv6_assignment *assign) 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; @@ -704,7 +704,7 @@ static bool assign_na(struct interface *iface, struct dhcpv6_assignment *assign) 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; @@ -724,8 +724,8 @@ static bool assign_na(struct interface *iface, struct dhcpv6_assignment *assign) 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(); @@ -749,7 +749,7 @@ static void handle_addrlist_change(struct netevent_handler_info *info) apply_lease(iface, c, true); if (c->accept_reconf && c->reconf_cnt == 0) { - struct dhcpv6_assignment *a; + struct dhcp_assignment *a; start_reconf(c); @@ -762,7 +762,7 @@ static void handle_addrlist_change(struct netevent_handler_info *info) } 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; @@ -775,7 +775,7 @@ static void handle_addrlist_change(struct netevent_handler_info *info) 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); @@ -786,7 +786,7 @@ static void reconf_timeout_cb(struct uloop_timeout *event) 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); @@ -796,7 +796,7 @@ static void start_reconf(struct dhcpv6_assignment *a) 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; @@ -809,7 +809,7 @@ static void valid_until_cb(struct uloop_timeout *event) 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; @@ -827,7 +827,7 @@ static void valid_until_cb(struct uloop_timeout *event) } 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 = { @@ -1055,7 +1055,7 @@ static void dhcpv6_log_ia_addr(struct in6_addr *addr, int prefix, _unused uint32 } 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"; @@ -1116,7 +1116,7 @@ static void dhcpv6_log(uint8_t msgtype, struct interface *iface, time_t now, 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; @@ -1199,7 +1199,7 @@ ssize_t dhcpv6_handle_ia(uint8_t *buf, size_t buflen, struct interface *iface, 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); @@ -1243,7 +1243,7 @@ ssize_t dhcpv6_handle_ia(uint8_t *buf, size_t buflen, struct interface *iface, } /* 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] diff --git a/src/dhcpv6.h b/src/dhcpv6.h index 7e2f936..1ed7d6d 100644 --- a/src/dhcpv6.h +++ b/src/dhcpv6.h @@ -13,7 +13,6 @@ */ #pragma once -#include <libubox/ustream.h> #include "odhcpd.h" #define ALL_DHCPV6_RELAYS "ff02::1:2" @@ -138,35 +137,6 @@ struct dhcpv6_ia_addr { uint32_t valid; } _packed; -struct dhcpv6_assignment { - struct list_head head; - struct interface *iface; - - struct sockaddr_in6 peer; - time_t valid_until; - - struct uloop_timeout reconf_timer; - bool accept_reconf; - int reconf_cnt; - uint8_t key[16]; - - char *hostname; - uint32_t assigned; - uint32_t iaid; - uint8_t mac[6]; - uint8_t length; // length == 128 -> IA_NA, length <= 64 -> IA_PD - - struct odhcpd_ipaddr *managed; - ssize_t managed_size; - struct ustream_fd managed_sock; - - uint32_t leasetime; - unsigned int flags; - - uint8_t clid_len; - uint8_t clid_data[]; -}; - struct dhcpv6_cer_id { uint16_t type; uint16_t len; @@ -191,6 +161,6 @@ ssize_t dhcpv6_handle_ia(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); int dhcpv6_setup_ia_interface(struct interface *iface, bool enable); -void dhcpv6_enum_ia_addrs(struct interface *iface, struct dhcpv6_assignment *c, time_t now, +void dhcpv6_enum_ia_addrs(struct interface *iface, struct dhcp_assignment *c, time_t now, dhcpv6_binding_cb_handler_t func, void *arg); void dhcpv6_write_statefile(void); diff --git a/src/odhcpd.h b/src/odhcpd.h index f32f34b..e7fcd82 100644 --- a/src/odhcpd.h +++ b/src/odhcpd.h @@ -23,6 +23,7 @@ #include <libubox/list.h> #include <libubox/uloop.h> #include <libubox/avl.h> +#include <libubox/ustream.h> // RFC 6106 defines this router advertisement option #define ND_OPT_ROUTE_INFO 24 @@ -145,6 +146,44 @@ struct lease { }; +struct odhcpd_ref_ip; + +struct dhcp_assignment { + struct list_head head; + struct interface *iface; + + struct sockaddr_in6 peer; + time_t valid_until; + +#define fr_timer reconf_timer + struct uloop_timeout reconf_timer; +#define accept_fr_nonce accept_reconf + bool accept_reconf; +#define fr_cnt reconf_cnt + int reconf_cnt; + uint8_t key[16]; + struct odhcpd_ref_ip *fr_ip; + + uint32_t addr; + uint32_t assigned; + uint32_t iaid; + uint8_t length; // length == 128 -> IA_NA, length <= 64 -> IA_PD + + struct odhcpd_ipaddr *managed; + ssize_t managed_size; + struct ustream_fd managed_sock; + + unsigned int flags; + uint32_t leasetime; + char *hostname; +#define hwaddr mac + uint8_t mac[6]; + + uint8_t clid_len; + uint8_t clid_data[]; +}; + + struct interface { struct avl_node avl; @@ -35,7 +35,7 @@ static int handle_dhcpv4_leases(struct ubus_context *ctx, _unused struct ubus_ob void *i = blobmsg_open_table(&b, iface->ifname); void *j = blobmsg_open_array(&b, "leases"); - struct dhcpv4_assignment *c; + struct dhcp_assignment *c; list_for_each_entry(c, &iface->dhcpv4_assignments, head) { if (!INFINITE_VALID(c->valid_until) && c->valid_until < now) continue; @@ -118,8 +118,8 @@ static int handle_dhcpv6_leases(_unused struct ubus_context *ctx, _unused struct void *i = blobmsg_open_table(&b, iface->ifname); void *j = blobmsg_open_array(&b, "leases"); - struct dhcpv6_assignment *a, *border = list_last_entry( - &iface->ia_assignments, struct dhcpv6_assignment, head); + struct dhcp_assignment *a, *border = list_last_entry( + &iface->ia_assignments, struct dhcp_assignment, head); list_for_each_entry(a, &iface->ia_assignments, head) { if (a == border || (!INFINITE_VALID(a->valid_until) && |