aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/leases.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/udhcp/leases.c')
-rw-r--r--networking/udhcp/leases.c33
1 files changed, 16 insertions, 17 deletions
diff --git a/networking/udhcp/leases.c b/networking/udhcp/leases.c
index 78b0d0ade..efe67cf5d 100644
--- a/networking/udhcp/leases.c
+++ b/networking/udhcp/leases.c
@@ -29,16 +29,15 @@ static struct dyn_lease *oldest_expired_lease(void)
29} 29}
30 30
31 31
32/* Clear every lease out that chaddr OR yiaddr matches and is nonzero */ 32/* Clear out all leases with matching nonzero chaddr OR yiaddr.
33static void clear_lease(const uint8_t *chaddr, uint32_t yiaddr) 33 * If chaddr == NULL, this is a conflict lease.
34 */
35static void clear_leases(const uint8_t *chaddr, uint32_t yiaddr)
34{ 36{
35 unsigned i, j; 37 unsigned i;
36
37 for (j = 0; j < 16 && !chaddr[j]; j++)
38 continue;
39 38
40 for (i = 0; i < server_config.max_leases; i++) { 39 for (i = 0; i < server_config.max_leases; i++) {
41 if ((j != 16 && memcmp(g_leases[i].lease_mac, chaddr, 6) == 0) 40 if ((chaddr && memcmp(g_leases[i].lease_mac, chaddr, 6) == 0)
42 || (yiaddr && g_leases[i].lease_nip == yiaddr) 41 || (yiaddr && g_leases[i].lease_nip == yiaddr)
43 ) { 42 ) {
44 memset(&g_leases[i], 0, sizeof(g_leases[i])); 43 memset(&g_leases[i], 0, sizeof(g_leases[i]));
@@ -47,7 +46,9 @@ static void clear_lease(const uint8_t *chaddr, uint32_t yiaddr)
47} 46}
48 47
49 48
50/* Add a lease into the table, clearing out any old ones */ 49/* Add a lease into the table, clearing out any old ones
50 * If chaddr == NULL, this is a conflict lease.
51 */
51struct dyn_lease* FAST_FUNC add_lease( 52struct dyn_lease* FAST_FUNC add_lease(
52 const uint8_t *chaddr, uint32_t yiaddr, 53 const uint8_t *chaddr, uint32_t yiaddr,
53 leasetime_t leasetime, 54 leasetime_t leasetime,
@@ -56,12 +57,12 @@ struct dyn_lease* FAST_FUNC add_lease(
56 struct dyn_lease *oldest; 57 struct dyn_lease *oldest;
57 58
58 /* clean out any old ones */ 59 /* clean out any old ones */
59 clear_lease(chaddr, yiaddr); 60 clear_leases(chaddr, yiaddr);
60 61
61 oldest = oldest_expired_lease(); 62 oldest = oldest_expired_lease();
62 63
63 if (oldest) { 64 if (oldest) {
64 oldest->hostname[0] = '\0'; 65 memset(oldest, 0, sizeof(*oldest));
65 if (hostname) { 66 if (hostname) {
66 char *p; 67 char *p;
67 if (hostname_len > sizeof(oldest->hostname)) 68 if (hostname_len > sizeof(oldest->hostname))
@@ -74,7 +75,8 @@ struct dyn_lease* FAST_FUNC add_lease(
74 p++; 75 p++;
75 } 76 }
76 } 77 }
77 memcpy(oldest->lease_mac, chaddr, 6); 78 if (chaddr)
79 memcpy(oldest->lease_mac, chaddr, 6);
78 oldest->lease_nip = yiaddr; 80 oldest->lease_nip = yiaddr;
79 oldest->expires = time(NULL) + leasetime; 81 oldest->expires = time(NULL) + leasetime;
80 } 82 }
@@ -119,10 +121,6 @@ struct dyn_lease* FAST_FUNC find_lease_by_nip(uint32_t nip)
119/* Check if the IP is taken; if it is, add it to the lease table */ 121/* Check if the IP is taken; if it is, add it to the lease table */
120static int nobody_responds_to_arp(uint32_t nip, const uint8_t *safe_mac) 122static int nobody_responds_to_arp(uint32_t nip, const uint8_t *safe_mac)
121{ 123{
122 /* 16 zero bytes */
123 static const uint8_t blank_chaddr[16] = { 0 };
124 /* = { 0 } helps gcc to put it in rodata, not bss */
125
126 struct in_addr temp; 124 struct in_addr temp;
127 int r; 125 int r;
128 126
@@ -136,7 +134,7 @@ static int nobody_responds_to_arp(uint32_t nip, const uint8_t *safe_mac)
136 temp.s_addr = nip; 134 temp.s_addr = nip;
137 bb_info_msg("%s belongs to someone, reserving it for %u seconds", 135 bb_info_msg("%s belongs to someone, reserving it for %u seconds",
138 inet_ntoa(temp), (unsigned)server_config.conflict_time); 136 inet_ntoa(temp), (unsigned)server_config.conflict_time);
139 add_lease(blank_chaddr, nip, server_config.conflict_time, NULL, 0); 137 add_lease(NULL, nip, server_config.conflict_time, NULL, 0);
140 return 0; 138 return 0;
141} 139}
142 140
@@ -173,7 +171,8 @@ uint32_t FAST_FUNC find_free_or_expired_nip(const uint8_t *safe_mac)
173 } 171 }
174 } 172 }
175 173
176 if (oldest_lease && is_expired_lease(oldest_lease) 174 if (oldest_lease
175 && is_expired_lease(oldest_lease)
177 && nobody_responds_to_arp(oldest_lease->lease_nip, safe_mac) 176 && nobody_responds_to_arp(oldest_lease->lease_nip, safe_mac)
178 ) { 177 ) {
179 return oldest_lease->lease_nip; 178 return oldest_lease->lease_nip;