Upstream-Status: Pending Add a new option -D to the udhcpc client that allows for dhcp renewal to occur without having to down the interface in the process. Signed-off-by: Greg Moffatt Updated to latest Busybox 1.17.3 Signed-off-by: Mark Hatle Updated to Busybox 1.18.4 option spec is changed Signed-off-by: Qing He diff -ur busybox-1.17.3.orig/networking/udhcp/dhcpc.c busybox-1.17.3/networking/udhcp/dhcpc.c --- busybox-1.17.3.orig/networking/udhcp/dhcpc.c +++ busybox-1.17.3/networking/udhcp/dhcpc.c @@ -35,6 +35,9 @@ #endif #include +/* option whether to down the interface when reconfiguring */ +static int allow_deconfig = 1; + /* struct client_config_t client_config is in bb_common_bufsiz1 */ @@ -709,7 +712,8 @@ state = RENEW_REQUESTED; break; case RENEW_REQUESTED: /* impatient are we? fine, square 1 */ - udhcp_run_script(NULL, "deconfig"); + if (allow_deconfig) + udhcp_run_script(NULL, "deconfig"); case REQUESTING: case RELEASED: change_listen_mode(LISTEN_RAW); @@ -733,7 +737,8 @@ bb_info_msg("Unicasting a release of %s to %s", inet_ntoa(temp_addr), buffer); send_release(server_addr, requested_ip); /* unicast */ - udhcp_run_script(NULL, "deconfig"); + if (allow_deconfig) + udhcp_run_script(NULL, "deconfig"); } bb_info_msg("Entering released state"); @@ -836,6 +841,7 @@ OPT_o = 1 << 17, OPT_x = 1 << 18, OPT_f = 1 << 19, + OPT_D = 1 << 20, /* The rest has variable bit positions, need to be clever */ OPTBIT_f = 20, USE_FOR_MMU( OPTBIT_b,) @@ -861,7 +867,7 @@ #endif ; IF_LONG_OPTS(applet_long_options = udhcpc_longopts;) - opt = getopt32(argv, "CV:H:h:F:i:np:qRr:s:T:t:SA:O:ox:f" + opt = getopt32(argv, "CV:H:h:F:i:np:qRr:s:T:t:SA:O:ox:fD" USE_FOR_MMU("b") IF_FEATURE_UDHCPC_ARPING("a") IF_FEATURE_UDHCP_PORT("P:") @@ -950,6 +956,9 @@ logmode |= LOGMODE_SYSLOG; } + if (opt & OPT_D) + allow_deconfig = 0; + /* Make sure fd 0,1,2 are open */ bb_sanitize_stdio(); /* Equivalent of doing a fflush after every \n */ @@ -964,7 +973,8 @@ srand(monotonic_us()); state = INIT_SELECTING; - udhcp_run_script(NULL, "deconfig"); + if (allow_deconfig) + udhcp_run_script(NULL, "deconfig"); change_listen_mode(LISTEN_RAW); packet_num = 0; timeout = 0; @@ -1100,7 +1110,8 @@ } /* Timed out, enter init state */ bb_info_msg("Lease lost, entering init state"); - udhcp_run_script(NULL, "deconfig"); + if (allow_deconfig) + udhcp_run_script(NULL, "deconfig"); state = INIT_SELECTING; /*timeout = 0; - already is */ packet_num = 0; @@ -1246,7 +1257,8 @@ send_decline(xid, server_addr, packet.yiaddr); if (state != REQUESTING) - udhcp_run_script(NULL, "deconfig"); + if (allow_deconfig) + udhcp_run_script(NULL, "deconfig"); change_listen_mode(LISTEN_RAW); state = INIT_SELECTING; requested_ip = 0; @@ -1292,7 +1304,8 @@ bb_info_msg("Received DHCP NAK"); udhcp_run_script(&packet, "nak"); if (state != REQUESTING) - udhcp_run_script(NULL, "deconfig"); + if (allow_deconfig) + udhcp_run_script(NULL, "deconfig"); change_listen_mode(LISTEN_RAW); sleep(3); /* avoid excessive network traffic */ state = INIT_SELECTING;