From 427472e980cd6254a5e4ef37209b327e15af259b Mon Sep 17 00:00:00 2001 From: Mark Hatle Date: Thu, 3 Feb 2011 19:29:50 -0600 Subject: busybox: Support DHCP refresh without restarting the interface When the kernel is started using ip=dhcp, we want a way to be able to run the udhcp client within busybox and not reset the interface. When using the '-D' option to udhcpc, the defconfig script will be skipped allowing the refresh without changing the network settings. Also provide an initscript that can be used to detect ip=dhcp on the kernel command line, if detected it will refresh the lease and set the proper resolve.conf and related files, but not reset the interface. Original code in Wind River Linux by Greg Moffatt Signed-off-by: Mark Hatle --- .../busybox-udhcpc-no_deconfig.patch | 110 +++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 meta/recipes-core/busybox/busybox-1.17.3/busybox-udhcpc-no_deconfig.patch (limited to 'meta/recipes-core/busybox/busybox-1.17.3') diff --git a/meta/recipes-core/busybox/busybox-1.17.3/busybox-udhcpc-no_deconfig.patch b/meta/recipes-core/busybox/busybox-1.17.3/busybox-udhcpc-no_deconfig.patch new file mode 100644 index 000000000..cdf56b826 --- /dev/null +++ b/meta/recipes-core/busybox/busybox-1.17.3/busybox-udhcpc-no_deconfig.patch @@ -0,0 +1,110 @@ +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 + +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 << 18, + OPT_x = 1 << 19, + OPT_f = 1 << 20, ++ OPT_D = 1 << 21, + /* 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, "c:CV:H:h:F:i:np:qRr:s:T:t:SA:O:ox:f" ++ opt = getopt32(argv, "c: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; -- cgit v1.2.3