diff options
Diffstat (limited to 'networking/udhcp/leases.c')
-rw-r--r-- | networking/udhcp/leases.c | 33 |
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. |
33 | static void clear_lease(const uint8_t *chaddr, uint32_t yiaddr) | 33 | * If chaddr == NULL, this is a conflict lease. |
34 | */ | ||
35 | static 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 | */ | ||
51 | struct dyn_lease* FAST_FUNC add_lease( | 52 | struct 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 */ |
120 | static int nobody_responds_to_arp(uint32_t nip, const uint8_t *safe_mac) | 122 | static 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; |