X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fodhcpd.git;a=blobdiff_plain;f=src%2Fdhcpv4.c;h=1fac8a1ccf53748775b479211f046e9dcb880f6a;hp=62ddab866ea5cc608f1596e7a99130db0f77818a;hb=78aef4acbc692ef61169e3f26bb69d0f3574b1cd;hpb=b40f7fa3f3b48b574f513df1105d700c070aa335 diff --git a/src/dhcpv4.c b/src/dhcpv4.c index 62ddab8..1fac8a1 100644 --- a/src/dhcpv4.c +++ b/src/dhcpv4.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include #include @@ -155,17 +156,22 @@ int setup_dhcpv4_interface(struct interface *iface, bool enable) a->addr = ntohl(lease->ipaddr.s_addr); memcpy(a->hwaddr, lease->mac.ether_addr_octet, sizeof(a->hwaddr)); memcpy(a->hostname, lease->hostname, hostlen); + a->valid_until = LONG_MAX; // Assign to all interfaces struct dhcpv4_assignment *c; list_for_each_entry(c, &iface->dhcpv4_assignments, head) { if (c->addr > a->addr) { list_add_tail(&a->head, &c->head); + break; } else if (c->addr == a->addr) { // Already an assignment with that number break; } } + if (&c->head == &iface->dhcpv4_assignments) { + list_add(&a->head, &iface->dhcpv4_assignments); + } if (!a->head.next) free(a); @@ -175,7 +181,7 @@ int setup_dhcpv4_interface(struct interface *iface, bool enable) struct dhcpv4_assignment *a, *n; list_for_each_entry_safe(a, n, &iface->dhcpv4_assignments, head) { if ((htonl(a->addr) & smask->sin_addr.s_addr) != - (saddr->sin_addr.s_addr & smask->sin_addr.s_addr)) { + (iface->dhcpv4_start.s_addr & smask->sin_addr.s_addr)) { list_del(&a->head); free(a); } @@ -471,9 +477,10 @@ static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface, struct dhcpv4_assignment *c, *n, *a = NULL; list_for_each_entry_safe(c, n, &iface->dhcpv4_assignments, head) { - if (c->addr == raddr && !memcmp(c->hwaddr, mac, 6)) { + if (!memcmp(c->hwaddr, mac, 6)) { a = c; - break; + if (c->addr == raddr) + break; } else if (c->valid_until < now) { list_del(&c->head); free(c);