diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2009-06-16 10:20:27 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2009-06-16 10:20:27 +0200 |
commit | 47f2d7ef7d4dbeea19a55f9d73ef826f9d06650f (patch) | |
tree | a84db8f0215526b9728f2f2b94214100e853a98c /networking/udhcp/leases.c | |
parent | 1f363a086779152ab04067e81484b8bb69e4af72 (diff) | |
download | busybox-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.c | 12 |
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 */ |
121 | static int nobody_responds_to_arp(uint32_t addr) | 121 | static 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. */ |
143 | uint32_t FAST_FUNC find_free_or_expired_address(void) | 145 | uint32_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 | } |