diff options
author | Michel Stam <m.stam@fugro.nl> | 2014-10-30 11:59:04 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2014-10-30 11:59:04 +0100 |
commit | 9f41271f3ce82e0f7196c2442614ef4e9d360928 (patch) | |
tree | 98dd2becad3478ada376dff4e7a02af50e84e78a /networking/udhcp/dhcpd.c | |
parent | 760d035699c4a878f9109544c1d35ea0d5f6b76c (diff) | |
download | busybox-w32-9f41271f3ce82e0f7196c2442614ef4e9d360928.tar.gz busybox-w32-9f41271f3ce82e0f7196c2442614ef4e9d360928.tar.bz2 busybox-w32-9f41271f3ce82e0f7196c2442614ef4e9d360928.zip |
udhcpd: add option for tweaking arpping
Some clients have a very short timeout for sending the DHCP
DISCOVER, shorter than the arpping timeout of 2000 milliseconds
that udhcpd uses by default.
This patch allows tweaking the timeout, or disabling of arpping
altogether, at the risk of handing out addresses which are
already in use.
function old new delta
udhcpd_main 1460 1501 +41
udhcpc_main 2814 2851 +37
packed_usage 29957 29974 +17
arpping 477 493 +16
find_free_or_expired_nip 161 174 +13
send_offer 285 292 +7
nobody_responds_to_arp 85 89 +4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 7/0 up/down: 135/0) Total: 135 bytes
Signed-off-by: Michel Stam <m.stam@fugro.nl>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking/udhcp/dhcpd.c')
-rw-r--r-- | networking/udhcp/dhcpd.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c index a1a7f6b57..4b3ed240c 100644 --- a/networking/udhcp/dhcpd.c +++ b/networking/udhcp/dhcpd.c | |||
@@ -28,6 +28,7 @@ | |||
28 | //usage: "\n -f Run in foreground" | 28 | //usage: "\n -f Run in foreground" |
29 | //usage: "\n -S Log to syslog too" | 29 | //usage: "\n -S Log to syslog too" |
30 | //usage: "\n -I ADDR Local address" | 30 | //usage: "\n -I ADDR Local address" |
31 | //usage: "\n -a MSEC Timeout for ARP ping (default 2000)" | ||
31 | //usage: IF_FEATURE_UDHCP_PORT( | 32 | //usage: IF_FEATURE_UDHCP_PORT( |
32 | //usage: "\n -P N Use port N (default 67)" | 33 | //usage: "\n -P N Use port N (default 67)" |
33 | //usage: ) | 34 | //usage: ) |
@@ -148,7 +149,8 @@ static uint32_t select_lease_time(struct dhcp_packet *packet) | |||
148 | static NOINLINE void send_offer(struct dhcp_packet *oldpacket, | 149 | static NOINLINE void send_offer(struct dhcp_packet *oldpacket, |
149 | uint32_t static_lease_nip, | 150 | uint32_t static_lease_nip, |
150 | struct dyn_lease *lease, | 151 | struct dyn_lease *lease, |
151 | uint8_t *requested_ip_opt) | 152 | uint8_t *requested_ip_opt, |
153 | unsigned arpping_ms) | ||
152 | { | 154 | { |
153 | struct dhcp_packet packet; | 155 | struct dhcp_packet packet; |
154 | uint32_t lease_time_sec; | 156 | uint32_t lease_time_sec; |
@@ -187,7 +189,7 @@ static NOINLINE void send_offer(struct dhcp_packet *oldpacket, | |||
187 | } | 189 | } |
188 | else { | 190 | else { |
189 | /* Otherwise, find a free IP */ | 191 | /* Otherwise, find a free IP */ |
190 | packet.yiaddr = find_free_or_expired_nip(oldpacket->chaddr); | 192 | packet.yiaddr = find_free_or_expired_nip(oldpacket->chaddr, arpping_ms); |
191 | } | 193 | } |
192 | 194 | ||
193 | if (!packet.yiaddr) { | 195 | if (!packet.yiaddr) { |
@@ -304,6 +306,8 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv) | |||
304 | unsigned opt; | 306 | unsigned opt; |
305 | struct option_set *option; | 307 | struct option_set *option; |
306 | char *str_I = str_I; | 308 | char *str_I = str_I; |
309 | const char *str_a = "2000"; | ||
310 | unsigned arpping_ms; | ||
307 | IF_FEATURE_UDHCP_PORT(char *str_P;) | 311 | IF_FEATURE_UDHCP_PORT(char *str_P;) |
308 | 312 | ||
309 | #if ENABLE_FEATURE_UDHCP_PORT | 313 | #if ENABLE_FEATURE_UDHCP_PORT |
@@ -314,9 +318,10 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv) | |||
314 | #if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1 | 318 | #if defined CONFIG_UDHCP_DEBUG && CONFIG_UDHCP_DEBUG >= 1 |
315 | opt_complementary = "vv"; | 319 | opt_complementary = "vv"; |
316 | #endif | 320 | #endif |
317 | opt = getopt32(argv, "fSI:v" | 321 | opt = getopt32(argv, "fSI:va:" |
318 | IF_FEATURE_UDHCP_PORT("P:") | 322 | IF_FEATURE_UDHCP_PORT("P:") |
319 | , &str_I | 323 | , &str_I |
324 | , &str_a | ||
320 | IF_FEATURE_UDHCP_PORT(, &str_P) | 325 | IF_FEATURE_UDHCP_PORT(, &str_P) |
321 | IF_UDHCP_VERBOSE(, &dhcp_verbose) | 326 | IF_UDHCP_VERBOSE(, &dhcp_verbose) |
322 | ); | 327 | ); |
@@ -336,11 +341,13 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv) | |||
336 | free(lsa); | 341 | free(lsa); |
337 | } | 342 | } |
338 | #if ENABLE_FEATURE_UDHCP_PORT | 343 | #if ENABLE_FEATURE_UDHCP_PORT |
339 | if (opt & 16) { /* -P */ | 344 | if (opt & 32) { /* -P */ |
340 | SERVER_PORT = xatou16(str_P); | 345 | SERVER_PORT = xatou16(str_P); |
341 | CLIENT_PORT = SERVER_PORT + 1; | 346 | CLIENT_PORT = SERVER_PORT + 1; |
342 | } | 347 | } |
343 | #endif | 348 | #endif |
349 | arpping_ms = xatou(str_a); | ||
350 | |||
344 | /* Would rather not do read_config before daemonization - | 351 | /* Would rather not do read_config before daemonization - |
345 | * otherwise NOMMU machines will parse config twice */ | 352 | * otherwise NOMMU machines will parse config twice */ |
346 | read_config(argv[0] ? argv[0] : DHCPD_CONF_FILE); | 353 | read_config(argv[0] ? argv[0] : DHCPD_CONF_FILE); |
@@ -498,7 +505,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv) | |||
498 | case DHCPDISCOVER: | 505 | case DHCPDISCOVER: |
499 | log1("Received DISCOVER"); | 506 | log1("Received DISCOVER"); |
500 | 507 | ||
501 | send_offer(&packet, static_lease_nip, lease, requested_ip_opt); | 508 | send_offer(&packet, static_lease_nip, lease, requested_ip_opt, arpping_ms); |
502 | break; | 509 | break; |
503 | 510 | ||
504 | case DHCPREQUEST: | 511 | case DHCPREQUEST: |