aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--networking/udhcp/leases.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/networking/udhcp/leases.c b/networking/udhcp/leases.c
index c0864ed20..60e9edc68 100644
--- a/networking/udhcp/leases.c
+++ b/networking/udhcp/leases.c
@@ -12,10 +12,10 @@
12static struct dhcpOfferedAddr *oldest_expired_lease(void) 12static struct dhcpOfferedAddr *oldest_expired_lease(void)
13{ 13{
14 struct dhcpOfferedAddr *oldest = NULL; 14 struct dhcpOfferedAddr *oldest = NULL;
15// TODO: use monotonic_sec()
15 unsigned long oldest_lease = time(0); 16 unsigned long oldest_lease = time(0);
16 unsigned i; 17 unsigned i;
17 18
18
19 for (i = 0; i < server_config.max_leases; i++) 19 for (i = 0; i < server_config.max_leases; i++)
20 if (oldest_lease > leases[i].expires) { 20 if (oldest_lease > leases[i].expires) {
21 oldest_lease = leases[i].expires; 21 oldest_lease = leases[i].expires;
@@ -30,13 +30,14 @@ static void clear_lease(const uint8_t *chaddr, uint32_t yiaddr)
30{ 30{
31 unsigned i, j; 31 unsigned i, j;
32 32
33 for (j = 0; j < 16 && !chaddr[j]; j++); 33 for (j = 0; j < 16 && !chaddr[j]; j++)
34 continue;
34 35
35 for (i = 0; i < server_config.max_leases; i++) 36 for (i = 0; i < server_config.max_leases; i++)
36 if ((j != 16 && memcmp(leases[i].chaddr, chaddr, 16) != 0) 37 if ((j != 16 && memcmp(leases[i].chaddr, chaddr, 16) == 0)
37 || (yiaddr && leases[i].yiaddr == yiaddr) 38 || (yiaddr && leases[i].yiaddr == yiaddr)
38 ) { 39 ) {
39 memset(&(leases[i]), 0, sizeof(struct dhcpOfferedAddr)); 40 memset(&(leases[i]), 0, sizeof(leases[i]));
40 } 41 }
41} 42}
42 43
@@ -122,20 +123,18 @@ uint32_t find_address(int check_expired)
122 struct dhcpOfferedAddr *lease = NULL; 123 struct dhcpOfferedAddr *lease = NULL;
123 124
124 addr = server_config.start_ip; /* addr is in host order here */ 125 addr = server_config.start_ip; /* addr is in host order here */
125 for (;addr <= server_config.end_ip; addr++) { 126 for (; addr <= server_config.end_ip; addr++) {
126
127 /* ie, 192.168.55.0 */ 127 /* ie, 192.168.55.0 */
128 if (!(addr & 0xFF)) continue; 128 if (!(addr & 0xFF))
129 129 continue;
130 /* ie, 192.168.55.255 */ 130 /* ie, 192.168.55.255 */
131 if ((addr & 0xFF) == 0xFF) continue; 131 if ((addr & 0xFF) == 0xFF)
132 132 continue;
133 /* Only do if it isn't assigned as a static lease */ 133 /* Only do if it isn't assigned as a static lease */
134 ret = htonl(addr); 134 ret = htonl(addr);
135 if (!reservedIp(server_config.static_leases, ret)) { 135 if (!reservedIp(server_config.static_leases, ret)) {
136 /* lease is not taken */ 136 /* lease is not taken */
137 lease = find_lease_by_yiaddr(ret); 137 lease = find_lease_by_yiaddr(ret);
138
139 /* no lease or it expired and we are checking for expired leases */ 138 /* no lease or it expired and we are checking for expired leases */
140 if ((!lease || (check_expired && lease_expired(lease))) 139 if ((!lease || (check_expired && lease_expired(lease)))
141 && nobody_responds_to_arp(ret) /* it isn't used on the network */ 140 && nobody_responds_to_arp(ret) /* it isn't used on the network */