treewide: add netlink file
[project/odhcpd.git] / src / dhcpv4.c
index 826a1f8..c8be632 100644 (file)
@@ -44,7 +44,7 @@ static void dhcpv4_fr_stop(struct dhcpv4_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,
-               enum dhcpv4_msg msg, const uint8_t *mac, struct in_addr reqaddr,
+               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);
 
@@ -58,13 +58,13 @@ struct odhcpd_ref_ip {
 };
 
 /* Create socket and register events */
-int init_dhcpv4(void)
+int dhcpv4_init(void)
 {
        uloop_timeout_set(&valid_until_timeout, 1000);
        return 0;
 }
 
-int setup_dhcpv4_interface(struct interface *iface, bool enable)
+int dhcpv4_setup_interface(struct interface *iface, bool enable)
 {
        if (iface->dhcpv4_event.uloop.fd > 0) {
                uloop_fd_delete(&iface->dhcpv4_event.uloop);
@@ -293,7 +293,7 @@ static void decr_ref_cnt_ip(struct odhcpd_ref_ip **ptr, struct interface *iface)
        struct odhcpd_ref_ip *ip = *ptr;
 
        if (--ip->ref_cnt == 0) {
-               odhcpd_setup_addr(&ip->addr, iface, false, false);
+               netlink_setup_addr(&ip->addr, iface, false, false);
 
                list_del(&ip->head);
                free(ip);
@@ -354,7 +354,7 @@ void dhcpv4_addr_update(struct interface *iface)
        struct dhcpv4_assignment *c;
        uint32_t mask = iface->dhcpv4_mask.s_addr;
 
-       memset(&ip, sizeof(ip), 0);
+       memset(&ip, 0, sizeof(ip));
        ip.addr.in = iface->dhcpv4_local;
        ip.prefix = odhcpd_netmask2bitlen(false, &iface->dhcpv4_mask);
        ip.broadcast = iface->dhcpv4_bcast;
@@ -373,7 +373,7 @@ void dhcpv4_addr_update(struct interface *iface)
 
        a = list_first_entry(&iface->dhcpv4_fr_ips, struct odhcpd_ref_ip, head);
 
-       if (odhcpd_setup_addr(&a->addr, iface, false, true)) {
+       if (netlink_setup_addr(&a->addr, iface, false, true)) {
                syslog(LOG_ERR, "Failed to add ip address");
                return;
        }
@@ -602,7 +602,7 @@ static void handle_dhcpv4(void *addr, void *data, size_t len,
        uint8_t reqmsg = DHCPV4_MSG_REQUEST;
        uint8_t msg = DHCPV4_MSG_ACK;
 
-       struct in_addr reqaddr = {INADDR_ANY};
+       uint32_t reqaddr = INADDR_ANY;
        uint32_t leasetime = 0;
        size_t hostname_len = 0;
        char hostname[256];
@@ -666,7 +666,7 @@ static void handle_dhcpv4(void *addr, void *data, size_t len,
        } else if (reqmsg == DHCPV4_MSG_DISCOVER)
                msg = DHCPV4_MSG_OFFER;
        else if (reqmsg == DHCPV4_MSG_REQUEST &&
-                       ((reqaddr.s_addr && reqaddr.s_addr != lease->addr) ||
+                       ((reqaddr && reqaddr != lease->addr) ||
                         (req->ciaddr.s_addr && req->ciaddr.s_addr != lease->addr))) {
                msg = DHCPV4_MSG_NAK;
                /*
@@ -914,22 +914,14 @@ static bool dhcpv4_assign(struct interface *iface,
 
 
 static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface,
-               enum dhcpv4_msg msg, const uint8_t *mac, struct in_addr reqaddr,
+               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;
        time_t now = odhcpd_time();
 
-       struct dhcpv4_assignment *c, *a = NULL;
-       list_for_each_entry(c, &iface->dhcpv4_assignments, head) {
-               if (!memcmp(c->hwaddr, mac, 6)) {
-                       a = c;
-                       if (c->addr == reqaddr.s_addr)
-                               break;
-               }
-       }
-
        if (a && (a->flags & OAF_BOUND) && a->fr_ip) {
                *fr_serverid = a->fr_ip->addr.addr.in.s_addr;
                dhcpv4_fr_stop(a);
@@ -951,7 +943,7 @@ static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface,
                                /* Don't consider new assignment as infinite */
                                a->valid_until = now;
 
-                               assigned = dhcpv4_assign(iface, a, reqaddr.s_addr);
+                               assigned = dhcpv4_assign(iface, a, reqaddr);
                                if (assigned) {
                                        a->iface = iface;
                                        list_add(&a->head, &iface->dhcpv4_assignments);
@@ -961,7 +953,7 @@ static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface,
                                (iface->dhcpv4_start_ip.s_addr & iface->dhcpv4_mask.s_addr)) {
                        list_del(&a->head);
 
-                       assigned = dhcpv4_assign(iface, a, reqaddr.s_addr);
+                       assigned = dhcpv4_assign(iface, a, reqaddr);
                        if (assigned)
                                list_add(&a->head, &iface->dhcpv4_assignments);
                }