treewide: unify dhcpv6 and dhcpv4 assignments
authorHans Dedecker <dedeckeh@gmail.com>
Tue, 11 Dec 2018 13:13:30 +0000 (14:13 +0100)
committerHans Dedecker <dedeckeh@gmail.com>
Fri, 8 Feb 2019 13:07:21 +0000 (14:07 +0100)
Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
src/dhcpv4.c
src/dhcpv4.h
src/dhcpv6-ia.c
src/dhcpv6.h
src/odhcpd.h
src/ubus.c

index e29f49063f4c4409e0e9406781d8c3f3530532b3..e63deb958144930e2ee4a803670dcf02be8f6365 100644 (file)
@@ -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) {
index f48c005e7387a3295097d94cb865b3b130509f2c..96bd068327c2fc27cc86a891bdc1a34be25bf20e 100644 (file)
@@ -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;
index af3b72031a1eed5c67ea58fbd9ea8a35e09d9789..95f43070ef79f13e666b064826f5ff0318ff6660 100644 (file)
      (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]
index 7e2f93632d0c3480974f87079560df8af09dd142..1ed7d6d128843173489d578ef5ef6374cbdef961 100644 (file)
@@ -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);
index f32f34b035e644b6c710bd893e553974ca87d6a5..e7fcd8210db4d954452a3d987edb25688e764181 100644 (file)
@@ -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;
 
index eb6e84513595884304c4d603f372a35cb66be921..e1fb30e29daf40c47ed549d041fd27741287b0b5 100644 (file)
@@ -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) &&