aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/leases.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-06-16 10:20:27 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2009-06-16 10:20:27 +0200
commit47f2d7ef7d4dbeea19a55f9d73ef826f9d06650f (patch)
treea84db8f0215526b9728f2f2b94214100e853a98c /networking/udhcp/leases.c
parent1f363a086779152ab04067e81484b8bb69e4af72 (diff)
downloadbusybox-w32-47f2d7ef7d4dbeea19a55f9d73ef826f9d06650f.tar.gz
busybox-w32-47f2d7ef7d4dbeea19a55f9d73ef826f9d06650f.tar.bz2
busybox-w32-47f2d7ef7d4dbeea19a55f9d73ef826f9d06650f.zip
udhcpd: don't fail ARP check if returned MAC matches client's one
Also, do not unicast replies to yiaddr. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking/udhcp/leases.c')
-rw-r--r--networking/udhcp/leases.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/networking/udhcp/leases.c b/networking/udhcp/leases.c
index e17fb9e3f..b2cdd1942 100644
--- a/networking/udhcp/leases.c
+++ b/networking/udhcp/leases.c
@@ -118,7 +118,7 @@ struct dhcpOfferedAddr* FAST_FUNC find_lease_by_yiaddr(uint32_t yiaddr)
118 118
119 119
120/* check is an IP is taken, if it is, add it to the lease table */ 120/* check is an IP is taken, if it is, add it to the lease table */
121static int nobody_responds_to_arp(uint32_t addr) 121static int nobody_responds_to_arp(uint32_t addr, const uint8_t *safe_mac)
122{ 122{
123 /* 16 zero bytes */ 123 /* 16 zero bytes */
124 static const uint8_t blank_chaddr[16] = { 0 }; 124 static const uint8_t blank_chaddr[16] = { 0 };
@@ -127,7 +127,9 @@ static int nobody_responds_to_arp(uint32_t addr)
127 struct in_addr temp; 127 struct in_addr temp;
128 int r; 128 int r;
129 129
130 r = arpping(addr, server_config.server, server_config.arp, server_config.interface); 130 r = arpping(addr, safe_mac,
131 server_config.server, server_config.arp,
132 server_config.interface);
131 if (r) 133 if (r)
132 return r; 134 return r;
133 135
@@ -140,7 +142,7 @@ static int nobody_responds_to_arp(uint32_t addr)
140 142
141 143
142/* Find a new usable (we think) address. */ 144/* Find a new usable (we think) address. */
143uint32_t FAST_FUNC find_free_or_expired_address(void) 145uint32_t FAST_FUNC find_free_or_expired_address(const uint8_t *chaddr)
144{ 146{
145 uint32_t addr; 147 uint32_t addr;
146 struct dhcpOfferedAddr *oldest_lease = NULL; 148 struct dhcpOfferedAddr *oldest_lease = NULL;
@@ -163,7 +165,7 @@ uint32_t FAST_FUNC find_free_or_expired_address(void)
163 165
164 lease = find_lease_by_yiaddr(net_addr); 166 lease = find_lease_by_yiaddr(net_addr);
165 if (!lease) { 167 if (!lease) {
166 if (nobody_responds_to_arp(net_addr)) 168 if (nobody_responds_to_arp(net_addr, chaddr))
167 return net_addr; 169 return net_addr;
168 } else { 170 } else {
169 if (!oldest_lease || lease->expires < oldest_lease->expires) 171 if (!oldest_lease || lease->expires < oldest_lease->expires)
@@ -172,7 +174,7 @@ uint32_t FAST_FUNC find_free_or_expired_address(void)
172 } 174 }
173 175
174 if (oldest_lease && lease_expired(oldest_lease) 176 if (oldest_lease && lease_expired(oldest_lease)
175 && nobody_responds_to_arp(oldest_lease->yiaddr) 177 && nobody_responds_to_arp(oldest_lease->yiaddr, chaddr)
176 ) { 178 ) {
177 return oldest_lease->yiaddr; 179 return oldest_lease->yiaddr;
178 } 180 }