aboutsummaryrefslogtreecommitdiff
path: root/networking/udhcp/dhcpc.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2009-07-19 04:07:21 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2009-07-19 04:07:21 +0200
commit13ca4b12e2c7d022a1dcb5a4d9923bb176fe69a7 (patch)
tree3299bfdb88c697a5dabc623560fc2dcaea90e176 /networking/udhcp/dhcpc.c
parent252ccba948eb9f6372de0ddf6d61654df91ab360 (diff)
downloadbusybox-w32-13ca4b12e2c7d022a1dcb5a4d9923bb176fe69a7.tar.gz
busybox-w32-13ca4b12e2c7d022a1dcb5a4d9923bb176fe69a7.tar.bz2
busybox-w32-13ca4b12e2c7d022a1dcb5a4d9923bb176fe69a7.zip
udhcpc: simplify manual renew (make it more similar to automatic one)
function old new delta udhcp_run_script 669 673 +4 udhcpc_main 2414 2401 -13 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 1/1 up/down: 4/-13) Total: -9 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to '')
-rw-r--r--networking/udhcp/dhcpc.c75
1 files changed, 38 insertions, 37 deletions
diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index 077098f42..8b6019bc9 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -7,9 +7,7 @@
7 * 7 *
8 * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. 8 * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
9 */ 9 */
10
11#include <syslog.h> 10#include <syslog.h>
12
13/* Override ENABLE_FEATURE_PIDFILE - ifupdown needs our pidfile to always exist */ 11/* Override ENABLE_FEATURE_PIDFILE - ifupdown needs our pidfile to always exist */
14#define WANT_PIDFILE 1 12#define WANT_PIDFILE 1
15#include "common.h" 13#include "common.h"
@@ -25,14 +23,20 @@ static int sockfd = -1;
25#define LISTEN_RAW 2 23#define LISTEN_RAW 2
26static smallint listen_mode; 24static smallint listen_mode;
27 25
26/* initial state: (re)start DHCP negotiation */
28#define INIT_SELECTING 0 27#define INIT_SELECTING 0
28/* discover was sent, DHCPOFFER reply received */
29#define REQUESTING 1 29#define REQUESTING 1
30/* select/renew was sent, DHCPACK reply received */
30#define BOUND 2 31#define BOUND 2
32/* half of lease passed, want renew it by sending unicast renew requests */
31#define RENEWING 3 33#define RENEWING 3
34/* renew requests were not answered, lease is almost over, send broadcast renew */
32#define REBINDING 4 35#define REBINDING 4
33#define INIT_REBOOT 5 36/* manually requested renew (SIGUSR1) */
34#define RENEW_REQUESTED 6 37#define RENEW_REQUESTED 5
35#define RELEASED 7 38/* release, possibly manually requested (SIGUSR2) */
39#define RELEASED 6
36static smallint state; 40static smallint state;
37 41
38/* struct client_config_t client_config is in bb_common_bufsiz1 */ 42/* struct client_config_t client_config is in bb_common_bufsiz1 */
@@ -42,7 +46,10 @@ static smallint state;
42static void change_listen_mode(int new_mode) 46static void change_listen_mode(int new_mode)
43{ 47{
44 log1("Entering listen mode: %s", 48 log1("Entering listen mode: %s",
45 new_mode ? (new_mode == 1 ? "kernel" : "raw") : "none"); 49 new_mode != LISTEN_NONE
50 ? (new_mode == LISTEN_KERNEL ? "kernel" : "raw")
51 : "none"
52 );
46 53
47 listen_mode = new_mode; 54 listen_mode = new_mode;
48 if (sockfd >= 0) { 55 if (sockfd >= 0) {
@@ -349,14 +356,16 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
349 tv.tv_sec = timeout - already_waited_sec; 356 tv.tv_sec = timeout - already_waited_sec;
350 tv.tv_usec = 0; 357 tv.tv_usec = 0;
351 retval = 0; /* If we already timed out, fall through, else... */ 358 retval = 0; /* If we already timed out, fall through, else... */
352 if (tv.tv_sec > 0) { 359 if ((int)tv.tv_sec > 0) {
353 timestamp_before_wait = (unsigned)monotonic_sec(); 360 timestamp_before_wait = (unsigned)monotonic_sec();
354 log1("Waiting on select..."); 361 log1("Waiting on select...");
355 retval = select(max_fd + 1, &rfds, NULL, NULL, &tv); 362 retval = select(max_fd + 1, &rfds, NULL, NULL, &tv);
356 if (retval < 0) { 363 if (retval < 0) {
357 /* EINTR? A signal was caught, don't panic */ 364 /* EINTR? A signal was caught, don't panic */
358 if (errno == EINTR) 365 if (errno == EINTR) {
366 already_waited_sec += (unsigned)monotonic_sec() - timestamp_before_wait;
359 continue; 367 continue;
368 }
360 /* Else: an error occured, panic! */ 369 /* Else: an error occured, panic! */
361 bb_perror_msg_and_die("select"); 370 bb_perror_msg_and_die("select");
362 } 371 }
@@ -374,9 +383,8 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
374 if (packet_num < discover_retries) { 383 if (packet_num < discover_retries) {
375 if (packet_num == 0) 384 if (packet_num == 0)
376 xid = random_xid(); 385 xid = random_xid();
377 386 /* broadcast */
378 send_discover(xid, requested_ip); /* broadcast */ 387 send_discover(xid, requested_ip);
379
380 timeout = discover_timeout; 388 timeout = discover_timeout;
381 packet_num++; 389 packet_num++;
382 continue; 390 continue;
@@ -400,44 +408,33 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
400 timeout = tryagain_timeout; 408 timeout = tryagain_timeout;
401 packet_num = 0; 409 packet_num = 0;
402 continue; 410 continue;
403 case RENEW_REQUESTED:
404 case REQUESTING: 411 case REQUESTING:
405 if (packet_num < discover_retries) { 412 if (packet_num < discover_retries) {
406 /* send request packet */ 413 /* send broadcast select packet */
407 if (state == RENEW_REQUESTED) /* unicast */ 414 send_select(xid, server_addr, requested_ip);
408 send_renew(xid, server_addr, requested_ip);
409 else /* broadcast */
410 send_select(xid, server_addr, requested_ip);
411
412 timeout = discover_timeout; 415 timeout = discover_timeout;
413 packet_num++; 416 packet_num++;
414 continue; 417 continue;
415 } 418 }
416 /* timed out, go back to init state */ 419 /* Timed out, go back to init state.
417 if (state == RENEW_REQUESTED) 420 * "discover...select...discover..." loops
418 udhcp_run_script(NULL, "deconfig");
419 change_listen_mode(LISTEN_RAW);
420 /* "discover...select...discover..." loops
421 * were seen in the wild. Treat them similarly 421 * were seen in the wild. Treat them similarly
422 * to "no response to discover" case */ 422 * to "no response to discover" case */
423 if (state == REQUESTING) { 423 change_listen_mode(LISTEN_RAW);
424 state = INIT_SELECTING;
425 goto leasefail;
426 }
427 state = INIT_SELECTING; 424 state = INIT_SELECTING;
428 timeout = 0; 425 goto leasefail;
429 packet_num = 0;
430 continue;
431 case BOUND: 426 case BOUND:
432 /* Half of the lease passed, time to enter renewing state */ 427 /* Half of the lease passed, time to enter renewing state */
428 state = RENEWING;
433 change_listen_mode(LISTEN_KERNEL); 429 change_listen_mode(LISTEN_KERNEL);
434 log1("Entering renew state"); 430 log1("Entering renew state");
435 state = RENEWING;
436 /* fall right through */ 431 /* fall right through */
432 case RENEW_REQUESTED: /* manual (SIGUSR1) renew */
433 case_RENEW_REQUESTED:
437 case RENEWING: 434 case RENEWING:
438 if (timeout > 60) { 435 if (timeout > 60) {
439 /* send a request packet */ 436 /* send an unicast renew request packet */
440 send_renew(xid, server_addr, requested_ip); /* unicast */ 437 send_renew(xid, server_addr, requested_ip);
441 timeout >>= 1; 438 timeout >>= 1;
442 continue; 439 continue;
443 } 440 }
@@ -449,8 +446,8 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
449 /* Lease is *really* about to run out, 446 /* Lease is *really* about to run out,
450 * try to find DHCP server using broadcast */ 447 * try to find DHCP server using broadcast */
451 if (timeout > 0) { 448 if (timeout > 0) {
452 /* send a request packet */ 449 /* send a broadcast renew request packet */
453 send_renew(xid, 0 /*INADDR_ANY*/, requested_ip); /* broadcast */ 450 send_renew(xid, 0 /*INADDR_ANY*/, requested_ip);
454 timeout >>= 1; 451 timeout >>= 1;
455 continue; 452 continue;
456 } 453 }
@@ -476,6 +473,8 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
476 switch (udhcp_sp_read(&rfds)) { 473 switch (udhcp_sp_read(&rfds)) {
477 case SIGUSR1: 474 case SIGUSR1:
478 perform_renew(); 475 perform_renew();
476 if (state == RENEW_REQUESTED)
477 goto case_RENEW_REQUESTED;
479 /* Start things over */ 478 /* Start things over */
480 packet_num = 0; 479 packet_num = 0;
481 /* Kill any timeouts because the user wants this to hurry along */ 480 /* Kill any timeouts because the user wants this to hurry along */
@@ -562,9 +561,9 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
562 already_waited_sec = 0; 561 already_waited_sec = 0;
563 } 562 }
564 continue; 563 continue;
565 case RENEW_REQUESTED:
566 case REQUESTING: 564 case REQUESTING:
567 case RENEWING: 565 case RENEWING:
566 case RENEW_REQUESTED:
568 case REBINDING: 567 case REBINDING:
569 if (*message == DHCPACK) { 568 if (*message == DHCPACK) {
570 temp = get_option(&packet, DHCP_LEASE_TIME); 569 temp = get_option(&packet, DHCP_LEASE_TIME);
@@ -622,7 +621,9 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
622 } 621 }
623 requested_ip = packet.yiaddr; 622 requested_ip = packet.yiaddr;
624 udhcp_run_script(&packet, 623 udhcp_run_script(&packet,
625 ((state == RENEWING || state == REBINDING) ? "renew" : "bound")); 624 ((state >= RENEWING && state <= RENEW_REQUESTED)
625 ? "renew" : "bound")
626 );
626 627
627 state = BOUND; 628 state = BOUND;
628 change_listen_mode(LISTEN_NONE); 629 change_listen_mode(LISTEN_NONE);