From: Marek Lindner <[email protected]>

The lease timeout accepted by udhcpc can currently be any value between 16s
and 268435455s (~8.5 years). This maximum limit can be too much for mobile
setups with changing DHCP servers. Usually these settings will then be
lowered on the DHCP server. But the user may not have access over the DHCP
server and thus has to avoid these large lease timeouts purely on the client
side.

The new command line parameter lease-max-sec allow to set this maximum
limit. By default it will be set to 0 and not used at all.

Signed-off-by: Marek Lindner <[email protected]>
Signed-off-by: Sven Eckelmann <[email protected]>
---
Not sure if someone works with similar setups.  Maybe someone still has
interests in this patch (or in a variant of it)...
---
 networking/udhcp/dhcpc.c | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c
index 10b9e0f..13efe18 100644
--- a/networking/udhcp/dhcpc.c
+++ b/networking/udhcp/dhcpc.c
@@ -68,6 +68,7 @@ static const char udhcpc_longopts[] ALIGN1 =
        "foreground\0"     No_argument       "f"
        "background\0"     No_argument       "b"
        "broadcast\0"      No_argument       "B"
+       "lease-max-sec\0"  Required_argument "l"
        IF_FEATURE_UDHCPC_ARPING("arping\0"     Optional_argument "a")
        IF_FEATURE_UDHCP_PORT("client-port\0"   Required_argument "P")
        ;
@@ -95,8 +96,9 @@ enum {
        OPT_x = 1 << 18,
        OPT_f = 1 << 19,
        OPT_B = 1 << 20,
+       OPT_l = 1 << 21,
 /* The rest has variable bit positions, need to be clever */
-       OPTBIT_B = 20,
+       OPTBIT_l = 21,
        USE_FOR_MMU(             OPTBIT_b,)
        IF_FEATURE_UDHCPC_ARPING(OPTBIT_a,)
        IF_FEATURE_UDHCP_PORT(   OPTBIT_P,)
@@ -1185,6 +1187,7 @@ static void client_background(void)
 //usage:     "\n       -t,--retries N          Send up to N discover packets 
(default 3)"
 //usage:     "\n       -T,--timeout SEC        Pause between packets (default 
3)"
 //usage:     "\n       -A,--tryagain SEC       Wait if lease is not obtained 
(default 20)"
+//usage:     "\n       -l,--lease-max-sec SEC  Limit lease timeout to SEC"
 //usage:     "\n       -n,--now                Exit if lease is not obtained"
 //usage:     "\n       -q,--quit               Exit after obtaining lease"
 //usage:     "\n       -R,--release            Release IP on exit"
@@ -1266,6 +1269,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
        int tryagain_timeout = 20;
        int discover_timeout = 3;
        int discover_retries = 3;
+       uint32_t lease_max_timeout = 0;
        uint32_t server_addr = server_addr; /* for compiler */
        uint32_t requested_ip = 0;
        uint32_t xid = xid; /* for compiler */
@@ -1291,7 +1295,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
        /* O,x: list; -T,-t,-A take numeric param */
        IF_UDHCP_VERBOSE(opt_complementary = "vv";)
        IF_LONG_OPTS(applet_long_options = udhcpc_longopts;)
-       opt = getopt32(argv, "CV:H:h:F:i:np:qRr:s:T:+t:+SA:+O:*ox:*fB"
+       opt = getopt32(argv, "CV:H:h:F:i:np:qRr:s:T:+t:+SA:+O:*ox:*fBl:+"
                USE_FOR_MMU("b")
                IF_FEATURE_UDHCPC_ARPING("a::")
                IF_FEATURE_UDHCP_PORT("P:")
@@ -1302,6 +1306,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                , &discover_timeout, &discover_retries, &tryagain_timeout /* 
T,t,A */
                , &list_O
                , &list_x
+               , &lease_max_timeout /* l */
                IF_FEATURE_UDHCPC_ARPING(, &str_a)
                IF_FEATURE_UDHCP_PORT(, &str_P)
                IF_UDHCP_VERBOSE(, &dhcp_verbose)
@@ -1735,11 +1740,20 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
                                temp = udhcp_get_option(&packet, 
DHCP_LEASE_TIME);
                                if (!temp) {
                                        bb_error_msg("no lease time with ACK, 
using 1 hour lease");
+
                                        lease_seconds = 60 * 60;
+                                       if (lease_max_timeout > 0 && 
lease_seconds > lease_max_timeout) {
+                                               lease_seconds = 
lease_max_timeout;
+                                       }
                                } else {
                                        /* it IS unaligned sometimes, don't 
"optimize" */
                                        move_from_unaligned32(lease_seconds, 
temp);
                                        lease_seconds = ntohl(lease_seconds);
+
+                                       if (lease_max_timeout > 0 && 
lease_seconds > lease_max_timeout) {
+                                               lease_seconds = 
lease_max_timeout;
+                                       }
+
                                        /* paranoia: must not be too small and 
not prone to overflows */
                                        if (lease_seconds < 0x10)
                                                lease_seconds = 0x10;
-- 
2.10.2

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to