odhcpd: rename [lease_cfg|dhcpv4_lease]->ipaddr to ipv4
authorDavid Härdeman <[email protected]>
Mon, 10 Nov 2025 22:03:25 +0000 (23:03 +0100)
committerÁlvaro Fernández Rojas <[email protected]>
Fri, 14 Nov 2025 16:25:21 +0000 (17:25 +0100)
"ipaddr" doesn't say if it's IPv4 or IPv6, and we want to be clear in a
dual-stack codebase.

And at the same time, use a struct in_addr to store the IPv4 address,
which is just less confusing.

Finally, remove all uses of "inet_ntoa()", which is deprecated.

Signed-off-by: David Härdeman <[email protected]>
Link: https://github.com/openwrt/odhcpd/pull/306
Signed-off-by: Álvaro Fernández Rojas <[email protected]>
src/config.c
src/dhcpv4.c
src/odhcpd.h
src/statefiles.c
src/ubus.c

index 056dd4768a215f4866a84cbd5f9b16e4e7591cb5..598b1e8f6aafc720f1cd9d5bb4f5acfbc46acb9d 100644 (file)
@@ -195,7 +195,7 @@ const struct uci_blob_param_list interface_attr_list = {
 };
 
 const struct blobmsg_policy lease_cfg_attrs[LEASE_CFG_ATTR_MAX] = {
-       [LEASE_CFG_ATTR_IP] = { .name = "ip", .type = BLOBMSG_TYPE_STRING },
+       [LEASE_CFG_ATTR_IPV4] = { .name = "ip", .type = BLOBMSG_TYPE_STRING },
        [LEASE_CFG_ATTR_MAC] = { .name = "mac", .type = BLOBMSG_TYPE_ARRAY },
        [LEASE_CFG_ATTR_DUID] = { .name = "duid", .type = BLOBMSG_TYPE_ARRAY },
        [LEASE_CFG_ATTR_HOSTID] = { .name = "hostid", .type = BLOBMSG_TYPE_STRING },
@@ -670,12 +670,12 @@ int config_set_lease_cfg_from_blobmsg(struct blob_attr *ba)
                        goto err;
        }
 
-       if ((c = tb[LEASE_CFG_ATTR_IP])) {
+       if ((c = tb[LEASE_CFG_ATTR_IPV4])) {
                const char *ip = blobmsg_get_string(c);
 
                if (!strcmp(ip, "ignore"))
                        lease_cfg->ignore4 = true;
-               else if (inet_pton(AF_INET, blobmsg_get_string(c), &lease_cfg->ipaddr) < 0)
+               else if (inet_pton(AF_INET, blobmsg_get_string(c), &lease_cfg->ipv4) != 1)
                        goto err;
        }
 
@@ -691,7 +691,7 @@ int config_set_lease_cfg_from_blobmsg(struct blob_attr *ba)
                                goto err;
                }
        } else {
-               uint32_t i4a = ntohl(lease_cfg->ipaddr) & 0xff;
+               uint32_t i4a = ntohl(lease_cfg->ipv4.s_addr) & 0xff;
                lease_cfg->hostid = ((i4a / 100) << 8) | (((i4a % 100) / 10) << 4) | (i4a % 10);
        }
 
@@ -1791,8 +1791,8 @@ static void lease_cfg_change(struct lease_cfg *lease_cfg_old, struct lease_cfg *
                update = true;
        }
 
-       if (lease_cfg_old->ipaddr != lease_cfg_new->ipaddr) {
-               lease_cfg_old->ipaddr = lease_cfg_new->ipaddr;
+       if (lease_cfg_old->ipv4.s_addr != lease_cfg_new->ipv4.s_addr) {
+               lease_cfg_old->ipv4 = lease_cfg_new->ipv4;
                dhcpv4_free_lease(lease_cfg_old->dhcpv4_lease);
        }
 
@@ -1884,12 +1884,12 @@ struct lease_cfg *config_find_lease_cfg_by_hostid(const uint64_t hostid)
        return NULL;
 }
 
-struct lease_cfg *config_find_lease_cfg_by_ipaddr(const uint32_t ipaddr)
+struct lease_cfg *config_find_lease_cfg_by_ipv4(const struct in_addr ipv4)
 {
        struct lease_cfg *lease_cfg;
 
        vlist_for_each_element(&lease_cfgs, lease_cfg, node) {
-               if (lease_cfg->ipaddr == ipaddr)
+               if (lease_cfg->ipv4.s_addr == ipv4.s_addr)
                        return lease_cfg;
        }
 
index f5db4283fe23cc4fe5f1aedf8cc7fbc84d03ad36..5aa23099b4d7cf92c4df5437df6984ecccf4597e 100644 (file)
@@ -87,7 +87,7 @@ static bool leases_require_fr(struct interface *iface, struct odhcpd_ipaddr *add
        avl_for_each_element(&iface->dhcpv4_leases, lease, iface_avl) {
                if ((lease->accept_fr_nonce || iface->dhcpv4_forcereconf) &&
                    !lease->fr_ip &&
-                   ((lease->addr & mask) == (addr->addr.in.s_addr & mask))) {
+                   ((lease->ipv4.s_addr & mask) == (addr->addr.in.s_addr & mask))) {
                        if (!fr_ip) {
                                fr_ip = calloc(1, sizeof(*fr_ip));
                                if (!fr_ip)
@@ -231,7 +231,7 @@ static void dhcpv4_fr_send(struct dhcpv4_lease *lease)
        struct sockaddr_in dest = {
                .sin_family = AF_INET,
                .sin_port = htons(DHCPV4_CLIENT_PORT),
-               .sin_addr = { lease->addr },
+               .sin_addr = lease->ipv4,
        };
 
        odhcpd_urandom(&fr.xid, sizeof(fr.xid));
@@ -272,12 +272,19 @@ static void dhcpv4_fr_send(struct dhcpv4_lease *lease)
        }
 
        if (dhcpv4_send_reply(iov, ARRAY_SIZE(iov), (struct sockaddr *)&dest, sizeof(dest),
-                             &lease->iface->dhcpv4_event.uloop.fd) < 0)
+                             &lease->iface->dhcpv4_event.uloop.fd) < 0) {
+               char ipv4_str[INET_ADDRSTRLEN];
+
                error("Failed to send %s to %s - %s: %m", dhcpv4_msg_to_string(fr_msg.data),
-                     odhcpd_print_mac(lease->hwaddr, sizeof(lease->hwaddr)), inet_ntoa(dest.sin_addr));
-       else
+                     odhcpd_print_mac(lease->hwaddr, sizeof(lease->hwaddr)),
+                     inet_ntop(AF_INET, &dest, ipv4_str, sizeof(ipv4_str)));
+       } else {
+               char ipv4_str[INET_ADDRSTRLEN];
+
                debug("Sent %s to %s - %s", dhcpv4_msg_to_string(fr_msg.data),
-                     odhcpd_print_mac(lease->hwaddr, sizeof(lease->hwaddr)), inet_ntoa(dest.sin_addr));
+                     odhcpd_print_mac(lease->hwaddr, sizeof(lease->hwaddr)),
+                     inet_ntop(AF_INET, &dest, ipv4_str, sizeof(ipv4_str)));
+       }
 }
 
 static void dhcpv4_fr_stop(struct dhcpv4_lease *lease)
@@ -365,7 +372,7 @@ dhcpv4_alloc_lease(struct interface *iface, const uint8_t *hwaddr,
        if (!lease)
                return NULL;
 
-       lease->iface_avl.key = &lease->addr;
+       lease->iface_avl.key = &lease->ipv4;
        lease->hwaddr_len = hwaddr_len;
        memcpy(lease->hwaddr, hwaddr, hwaddr_len);
        if (duid_len > 0) {
@@ -379,9 +386,9 @@ dhcpv4_alloc_lease(struct interface *iface, const uint8_t *hwaddr,
 }
 
 static bool dhcpv4_insert_lease(struct avl_tree *avl, struct dhcpv4_lease *lease,
-                               uint32_t addr)
+                               struct in_addr addr)
 {
-       lease->addr = addr;
+       lease->ipv4 = addr;
        if (!avl_insert(avl, &lease->iface_avl))
                return true;
        else
@@ -389,7 +396,7 @@ static bool dhcpv4_insert_lease(struct avl_tree *avl, struct dhcpv4_lease *lease
 }
 
 static bool dhcpv4_assign(struct interface *iface, struct dhcpv4_lease *lease,
-                         uint32_t raddr)
+                         struct in_addr req_addr)
 {
        uint32_t start = ntohl(iface->dhcpv4_start_ip.s_addr);
        uint32_t end = ntohl(iface->dhcpv4_end_ip.s_addr);
@@ -398,33 +405,33 @@ static bool dhcpv4_assign(struct interface *iface, struct dhcpv4_lease *lease,
        char ipv4_str[INET_ADDRSTRLEN];
 
        /* Preconfigured IP address by static lease */
-       if (lease->addr) {
-               if (!dhcpv4_insert_lease(&iface->dhcpv4_leases, lease, lease->addr)) {
+       if (lease->ipv4.s_addr) {
+               if (!dhcpv4_insert_lease(&iface->dhcpv4_leases, lease, lease->ipv4)) {
                        error("The static IP address is already assigned: %s",
-                             inet_ntop(AF_INET, &lease->addr, ipv4_str, sizeof(ipv4_str)));
+                             inet_ntop(AF_INET, &lease->ipv4, ipv4_str, sizeof(ipv4_str)));
                        return false;
                }
 
                debug("Assigned static IP address: %s",
-                     inet_ntop(AF_INET, &lease->addr, ipv4_str, sizeof(ipv4_str)));
+                     inet_ntop(AF_INET, &lease->ipv4, ipv4_str, sizeof(ipv4_str)));
 
                iface->update_statefile = true;
                return true;
        }
 
        /* The client asked for a specific address, let's try... */
-       if (ntohl(raddr) < start || ntohl(raddr) > end) {
+       if (ntohl(req_addr.s_addr) < start || ntohl(req_addr.s_addr) > end) {
                debug("The requested IP address is outside the pool: %s",
-                     inet_ntop(AF_INET, &raddr, ipv4_str, sizeof(ipv4_str)));
-       } else if (config_find_lease_cfg_by_ipaddr(raddr)) {
+                     inet_ntop(AF_INET, &req_addr, ipv4_str, sizeof(ipv4_str)));
+       } else if (config_find_lease_cfg_by_ipv4(req_addr)) {
                debug("The requested IP address is statically assigned: %s",
-                     inet_ntop(AF_INET, &raddr, ipv4_str, sizeof(ipv4_str)));
-       } else if (!dhcpv4_insert_lease(&iface->dhcpv4_leases, lease, raddr)) {
+                     inet_ntop(AF_INET, &req_addr, ipv4_str, sizeof(ipv4_str)));
+       } else if (!dhcpv4_insert_lease(&iface->dhcpv4_leases, lease, req_addr)) {
                debug("The requested IP address is already assigned: %s",
-                     inet_ntop(AF_INET, &raddr, ipv4_str, sizeof(ipv4_str)));
+                     inet_ntop(AF_INET, &req_addr, ipv4_str, sizeof(ipv4_str)));
        } else {
                debug("Assigned the requested IP address: %s",
-                     inet_ntop(AF_INET, &lease->addr, ipv4_str, sizeof(ipv4_str)));
+                     inet_ntop(AF_INET, &lease->ipv4, ipv4_str, sizeof(ipv4_str)));
                iface->update_statefile = true;
                return true;
        }
@@ -442,14 +449,14 @@ static bool dhcpv4_assign(struct interface *iface, struct dhcpv4_lease *lease,
        /* ...and try a bunch of times to assign a randomly chosen address */
        for (uint32_t i = 0, try = (((uint32_t)rand()) % count) + start; i < count;
             ++i, try = (((try - start) + 1) % count) + start) {
-               uint32_t n_try = htonl(try);
+               struct in_addr n_try = { .s_addr = htonl(try) };
 
-               if (config_find_lease_cfg_by_ipaddr(n_try))
+               if (config_find_lease_cfg_by_ipv4(n_try))
                        continue;
 
                if (dhcpv4_insert_lease(&iface->dhcpv4_leases, lease, n_try)) {
                        debug("Assigned IP adress from pool: %s (succeeded on attempt %u of %u)",
-                             inet_ntop(AF_INET, &lease->addr, ipv4_str, sizeof(ipv4_str)),
+                             inet_ntop(AF_INET, &lease->ipv4, ipv4_str, sizeof(ipv4_str)),
                              i + 1, count);
 
                        iface->update_statefile = true;
@@ -467,7 +474,7 @@ static struct dhcpv4_lease *find_lease_by_hwaddr(struct interface *iface, const
        struct dhcpv4_lease *lease;
 
        avl_for_each_element(&iface->dhcpv4_leases, lease, iface_avl)
-               if (!memcmp(lease->hwaddr, hwaddr, 6))
+               if (!memcmp(lease->hwaddr, hwaddr, ETH_ALEN))
                        return lease;
 
        return NULL;
@@ -491,7 +498,7 @@ find_lease_by_duid_iaid(struct interface *iface, const uint8_t *duid,
 
 static struct dhcpv4_lease *
 dhcpv4_lease(struct interface *iface, enum dhcpv4_msg req_msg, const uint8_t *req_mac,
-            const uint8_t *clid, size_t clid_len, const uint32_t req_addr,
+            const uint8_t *clid, size_t clid_len, const struct in_addr req_addr,
             uint32_t *req_leasetime, const char *req_hostname, const size_t
             req_hostname_len, const bool req_accept_fr, bool *reply_incl_fr,
             uint32_t *fr_serverid)
@@ -551,11 +558,10 @@ dhcpv4_lease(struct interface *iface, enum dhcpv4_msg req_msg, const uint8_t *re
                if (!lease)
                        return NULL;
 
-               ubus_bcast_dhcp_event("dhcp.release", req_mac,
-                                     (struct in_addr *)&lease->addr,
+               ubus_bcast_dhcp_event("dhcp.release", req_mac, lease->ipv4,
                                      lease->hostname, iface->ifname);
-               dhcpv4_free_lease(lease);
-               lease = NULL;
+                dhcpv4_free_lease(lease);
+                lease = NULL;
                break;
 
        case DHCPV4_MSG_DECLINE:
@@ -564,7 +570,7 @@ dhcpv4_lease(struct interface *iface, enum dhcpv4_msg req_msg, const uint8_t *re
 
                lease->flags &= ~OAF_BOUND;
 
-               if (!(lease->flags & OAF_STATIC) || lease->lease_cfg->ipaddr != lease->addr) {
+               if (!(lease->flags & OAF_STATIC) || lease->lease_cfg->ipv4.s_addr != lease->ipv4.s_addr) {
                        memset(lease->hwaddr, 0, sizeof(lease->hwaddr));
                        lease->valid_until = now + 3600; /* Block address for 1h */
                } else {
@@ -580,12 +586,12 @@ dhcpv4_lease(struct interface *iface, enum dhcpv4_msg req_msg, const uint8_t *re
                        return NULL;
 
                /* Old lease, but with an address that is out-of-scope? */
-               if (lease && ((lease->addr & iface->dhcpv4_mask.s_addr) !=
+               if (lease && ((lease->ipv4.s_addr & iface->dhcpv4_mask.s_addr) !=
                     (iface->dhcpv4_start_ip.s_addr & iface->dhcpv4_mask.s_addr)) &&
                    !(lease->flags & OAF_STATIC)) {
                        /* Try to reassign to an address that is in-scope */
                        avl_delete(&iface->dhcpv4_leases, &lease->iface_avl);
-                       lease->addr = INADDR_ANY;
+                       lease->ipv4.s_addr = INADDR_ANY;
                        if (!dhcpv4_assign(iface, lease, req_addr)) {
                                dhcpv4_free_lease(lease);
                                lease = NULL;
@@ -603,7 +609,7 @@ dhcpv4_lease(struct interface *iface, enum dhcpv4_msg req_msg, const uint8_t *re
 
                        /* static lease => infinite (0), else a placeholder */
                        lease->valid_until = lease_cfg ? 0 : now;
-                       lease->addr = lease_cfg ? lease_cfg->ipaddr : INADDR_ANY;
+                       lease->ipv4.s_addr = lease_cfg ? lease_cfg->ipv4.s_addr : INADDR_ANY;
 
                        if (!dhcpv4_assign(iface, lease, req_addr)) {
                                dhcpv4_free_lease(lease);
@@ -779,7 +785,7 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len,
        uint8_t req_msg = DHCPV4_MSG_REQUEST;
        uint8_t *req_opts = NULL;
        size_t req_opts_len = 0;
-       uint32_t req_addr = INADDR_ANY;
+       struct in_addr req_addr = { .s_addr = INADDR_ANY };
        uint32_t req_leasetime = 0;
        char *req_hostname = NULL;
        size_t req_hostname_len = 0;
@@ -1041,8 +1047,8 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len,
                        break;
                }
 
-               if ((req_addr && req_addr != lease->addr) ||
-                   (req->ciaddr.s_addr && req->ciaddr.s_addr != lease->addr)) {
+               if ((req_addr.s_addr && req_addr.s_addr != lease->ipv4.s_addr) ||
+                   (req->ciaddr.s_addr && req->ciaddr.s_addr != lease->ipv4.s_addr)) {
                        reply_msg.data = DHCPV4_MSG_NAK;
                        /*
                         * DHCP client requested an IP which we can't offer to him. Probably the
@@ -1288,28 +1294,32 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len,
        }
 
        if (lease)
-               reply.yiaddr.s_addr = lease->addr;
+               reply.yiaddr = lease->ipv4;
 
        memcpy(reply.chaddr, req->chaddr, sizeof(reply.chaddr));
        dhcpv4_set_dest_addr(iface, reply_msg.data, req, &reply, src_addr, &dest_addr);
        dhcpv4_add_padding(iov, ARRAY_SIZE(iov));
 
-       if (send_reply(iov, ARRAY_SIZE(iov), (struct sockaddr *)&dest_addr, sizeof(dest_addr), opaque) < 0)
+       if (send_reply(iov, ARRAY_SIZE(iov), (struct sockaddr *)&dest_addr, sizeof(dest_addr), opaque) < 0) {
+               char ipv4_str[INET_ADDRSTRLEN];
+
                error("Failed to send %s to %s - %s: %m",
                      dhcpv4_msg_to_string(reply_msg.data),
                      dest_addr.sin_addr.s_addr == INADDR_BROADCAST ?
                      "ff:ff:ff:ff:ff:ff": odhcpd_print_mac(req->chaddr, req->hlen),
-                     inet_ntoa(dest_addr.sin_addr));
-       else
+                     inet_ntop(AF_INET, &dest_addr.sin_addr, ipv4_str, sizeof(ipv4_str)));
+       } else {
+               char ipv4_str[INET_ADDRSTRLEN];
+
                error("Sent %s to %s - %s",
                      dhcpv4_msg_to_string(reply_msg.data),
                      dest_addr.sin_addr.s_addr == INADDR_BROADCAST ?
                      "ff:ff:ff:ff:ff:ff": odhcpd_print_mac(req->chaddr, req->hlen),
-                     inet_ntoa(dest_addr.sin_addr));
+                     inet_ntop(AF_INET, &dest_addr.sin_addr, ipv4_str, sizeof(ipv4_str)));
+       }
 
        if (reply_msg.data == DHCPV4_MSG_ACK && lease)
-               ubus_bcast_dhcp_event("dhcp.ack", req->chaddr,
-                                     (struct in_addr *)&lease->addr,
+               ubus_bcast_dhcp_event("dhcp.ack", req->chaddr, lease->ipv4,
                                      lease->hostname, iface->ifname);
 }
 
@@ -1575,8 +1585,7 @@ static void dhcpv4_valid_until_cb(struct uloop_timeout *event)
 
                avl_for_each_element_safe(&iface->dhcpv4_leases, lease, iface_avl, tmp) {
                        if (!INFINITE_VALID(lease->valid_until) && lease->valid_until < now) {
-                               ubus_bcast_dhcp_event("dhcp.expire", lease->hwaddr,
-                                                     (struct in_addr *)&lease->addr,
+                               ubus_bcast_dhcp_event("dhcp.expire", lease->hwaddr, lease->ipv4,
                                                      lease->hostname, iface->ifname);
                                dhcpv4_free_lease(lease);
                                update_statefile = true;
index 924fbe20b74127f464efd24b934c8e443a427352..fbbba1adefa400f9c2f1130b70f42ca5eab1c5ca 100644 (file)
@@ -237,12 +237,12 @@ struct dhcpv4_lease {
        struct interface *iface;                // assignment interface, non-null
        struct lease_cfg *lease_cfg;            // host lease cfg, nullable
 
-       uint32_t addr;                          // client IP address
+       struct in_addr ipv4;                    // client IPv4 address
        unsigned int flags;                     // OAF_*
        time_t valid_until;                     // CLOCK_MONOTONIC time, 0 = inf
        char *hostname;                         // client hostname
        size_t hwaddr_len;                      // hwaddr length
-       uint8_t hwaddr[6];                      // hwaddr (only MAC supported)
+       uint8_t hwaddr[ETH_ALEN];               // hwaddr (only MAC supported)
 
        // ForceRenew Nonce - RFC6704 §3.1.2
        struct uloop_timeout fr_timer;          // FR message transmission timer
@@ -294,7 +294,7 @@ struct lease_cfg {
        struct vlist_node node;
        struct list_head dhcpv6_leases;
        struct dhcpv4_lease *dhcpv4_lease;
-       uint32_t ipaddr;
+       struct in_addr ipv4;
        uint64_t hostid;
        size_t mac_count;
        struct ether_addr *macs;
@@ -475,7 +475,7 @@ struct interface {
 extern struct avl_tree interfaces;
 
 enum {
-       LEASE_CFG_ATTR_IP,
+       LEASE_CFG_ATTR_IPV4,
        LEASE_CFG_ATTR_MAC,
        LEASE_CFG_ATTR_DUID,
        LEASE_CFG_ATTR_HOSTID,
@@ -553,7 +553,7 @@ struct lease_cfg *config_find_lease_cfg_by_duid_and_iaid(const uint8_t *duid,
                                                         const uint32_t iaid);
 struct lease_cfg *config_find_lease_cfg_by_mac(const uint8_t *mac);
 struct lease_cfg *config_find_lease_cfg_by_hostid(const uint64_t hostid);
-struct lease_cfg *config_find_lease_cfg_by_ipaddr(const uint32_t ipaddr);
+struct lease_cfg *config_find_lease_cfg_by_ipv4(const struct in_addr ipv4);
 int config_set_lease_cfg_from_blobmsg(struct blob_attr *ba);
 void config_load_ra_pio(struct interface *iface);
 void config_save_ra_pio(struct interface *iface);
@@ -564,7 +564,7 @@ const char* ubus_get_ifname(const char *name);
 void ubus_apply_network(void);
 bool ubus_has_prefix(const char *name, const char *ifname);
 void ubus_bcast_dhcp_event(const char *type, const uint8_t *mac,
-                          const struct in_addr *addr, const char *name,
+                          const struct in_addr ipv4, const char *name,
                           const char *interface);
 #else
 static inline int ubus_init(void)
@@ -579,7 +579,7 @@ static inline void ubus_apply_network(void)
 
 static inline
 void ubus_bcast_dhcp_event(const char *type, const uint8_t *mac,
-                          const struct in_addr *addr, const char *name,
+                          const struct in_addr ipv4, const char *name,
                           const char *interface)
 {
        return;
index e27a92c872360934dbc06df43332c80e522bdba4..4258cbfde21d572ff731f29895905769b47a8c76 100644 (file)
@@ -79,13 +79,12 @@ static void statefiles_write_host6_cb(struct dhcpv6_lease *lease, struct in6_add
 static bool statefiles_write_host4(struct write_ctxt *ctxt, struct dhcpv4_lease *lease)
 {
        char ipbuf[INET_ADDRSTRLEN];
-       struct in_addr addr = { .s_addr = lease->addr };
 
        if (!lease->hostname || lease->flags & OAF_BROKEN_HOSTNAME)
                return false;
 
        if (ctxt->fp) {
-               inet_ntop(AF_INET, &addr, ipbuf, sizeof(ipbuf));
+               inet_ntop(AF_INET, &lease->ipv4, ipbuf, sizeof(ipbuf));
                statefiles_write_host(ipbuf, lease->hostname, ctxt);
        }
 
@@ -214,10 +213,9 @@ static void statefiles_write_state6(struct write_ctxt *ctxt, struct dhcpv6_lease
 static void statefiles_write_state4(struct write_ctxt *ctxt, struct dhcpv4_lease *lease)
 {
        char hexhwaddr[sizeof(lease->hwaddr) * 2 + 1];
-       struct in_addr addr = { .s_addr = lease->addr };
        char ipbuf[INET6_ADDRSTRLEN];
 
-       inet_ntop(AF_INET, &addr, ipbuf, sizeof(ipbuf));
+       inet_ntop(AF_INET, &lease->ipv4, ipbuf, sizeof(ipbuf));
 
        if (statefiles_write_host4(ctxt, lease)) {
                md5_hash(ipbuf, strlen(ipbuf), &ctxt->md5);
@@ -238,7 +236,7 @@ static void statefiles_write_state4(struct write_ctxt *ctxt, struct dhcpv4_lease
                (lease->valid_until > ctxt->now ?
                 (int64_t)(lease->valid_until - ctxt->now + ctxt->wall_time) :
                 (INFINITE_VALID(lease->valid_until) ? -1 : 0)),
-               ntohl(lease->addr), ipbuf);
+               ntohl(lease->ipv4.s_addr), ipbuf);
 }
 
 /* Returns true if there are changes to be written to the hosts file(s) */
index 1301291608d09b9437b3a5e798c0e46cddf12d36..51c47083c158e0e7522016fb2604ab79fed4cbd4 100644 (file)
@@ -63,8 +63,7 @@ static int handle_dhcpv4_leases(struct ubus_context *ctx, _unused struct ubus_ob
                        blobmsg_close_array(&b, m);
 
                        buf = blobmsg_alloc_string_buffer(&b, "address", INET_ADDRSTRLEN);
-                       struct in_addr addr = {.s_addr = c->addr};
-                       inet_ntop(AF_INET, &addr, buf, INET_ADDRSTRLEN);
+                       inet_ntop(AF_INET, &c->ipv4, buf, INET_ADDRSTRLEN);
                        blobmsg_add_string_buffer(&b);
 
                        blobmsg_add_u32(&b, "valid", INFINITE_VALID(c->valid_until) ?
@@ -394,17 +393,18 @@ static const struct blobmsg_policy obj_attrs[OBJ_ATTR_MAX] = {
 };
 
 void ubus_bcast_dhcp_event(const char *type, const uint8_t *mac,
-                          const struct in_addr *addr, const char *name,
+                          const struct in_addr ipv4, const char *name,
                           const char *interface)
 {
+       char ipv4_str[INET_ADDRSTRLEN];
+
        if (!ubus || !main_object.has_subscribers)
                return;
 
        blob_buf_init(&b, 0);
        if (mac)
                blobmsg_add_string(&b, "mac", odhcpd_print_mac(mac, ETH_ALEN));
-       if (addr)
-               blobmsg_add_string(&b, "ip", inet_ntoa(*addr));
+       blobmsg_add_string(&b, "ip", inet_ntop(AF_INET, &ipv4, ipv4_str, sizeof(ipv4_str)));
        if (name)
                blobmsg_add_string(&b, "name", name);
        if (interface)