aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/dhcpd.c
diff options
context:
space:
mode:
authorMichel Stam <m.stam@fugro.nl>2014-10-30 11:59:04 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2014-10-30 11:59:04 +0100
commit9f41271f3ce82e0f7196c2442614ef4e9d360928 (patch)
tree98dd2becad3478ada376dff4e7a02af50e84e78a /networking/udhcp/dhcpd.c
parent760d035699c4a878f9109544c1d35ea0d5f6b76c (diff)
downloadbusybox-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.c17
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)
148static NOINLINE void send_offer(struct dhcp_packet *oldpacket, 149static 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: