From 3e88222f1c2f7a365b9fde018bb4bf86520b51d6 Mon Sep 17 00:00:00 2001 From: Thomas Markwalder Date: Mon, 27 Nov 2017 13:12:24 -0500 Subject: [master] dhclient now delays between DHCPDECLINE and DHCPDISCOVER Merges in rt45457 --- client/dhclient.8 | 11 +++++++++++ client/dhclient.c | 33 +++++++++++++++++++++++++++------ 2 files changed, 38 insertions(+), 6 deletions(-) (limited to 'client') diff --git a/client/dhclient.8 b/client/dhclient.8 index ab4b77d4..1fe1f801 100644 --- a/client/dhclient.8 +++ b/client/dhclient.8 @@ -142,6 +142,10 @@ dhclient - Dynamic Host Configuration Protocol Client .I length ] [ +.B --decline-wait-time +.I seconds +] +[ .B -v ] [ @@ -365,6 +369,13 @@ client id in this fashion is discouraged. .BI \-I Use the standard DDNS scheme from RFCs 4701 & 4702. .TP +.TP +.BI \--decline-wait-time \ seconds +Specify the time (in seconds) that an IPv4 client should wait after +declining an address before issuing a discover. The default is +10 seconds as recommended by RFC 2131, Section 3.1.5. A value of +zero equates to no wait at all. +.PP .BI \--version Print version number and exit. .PP diff --git a/client/dhclient.c b/client/dhclient.c index e25ab94b..45fbec7a 100644 --- a/client/dhclient.c +++ b/client/dhclient.c @@ -68,6 +68,8 @@ int duid_type = 0; int duid_v4 = 0; int std_dhcid = 0; +int decline_wait_time = 10; /* Default to 10 secs per, RFC 2131, 3.1.5 */ + /* ASSERT_STATE() does nothing now; it used to be assert (state_is == state_shouldbe). */ #define ASSERT_STATE(state_is, state_shouldbe) {} @@ -159,17 +161,19 @@ static const char use_v6command[] = "Command not used for DHCPv4: %s"; #ifdef DHCPv6 #ifdef DHCP4o6 #define DHCLIENT_USAGE0 \ -"[-4|-6] [-SNTPRI1dvrxi] [-nw] -4o6 ] [-p ]\n" \ -" [-D LL|LLT] [--dad-wait-time seconds]\n" \ -" [--prefix-len-hint length]\n" +"[-4|-6] [-SNTPRI1dvrxi] [-nw] -4o6 ] [-p ] [-D LL|LLT]\n" \ +" [--dad-wait-time ] [--prefix-len-hint ]\n" \ +" [--decline-wait-time ]\n" #else /* DHCP4o6 */ #define DHCLIENT_USAGE0 \ "[-4|-6] [-SNTPRI1dvrxi] [-nw] [-p ] [-D LL|LLT]\n" \ -" [--dad-wait-time seconds] [--prefix-len-hint length]\n" +" [--dad-wait-time ] [--prefix-len-hint ]\n" \ +" [--decline-wait-time ]\n" #endif #else /* DHCPv6 */ #define DHCLIENT_USAGE0 \ -"[-I1dvrxi] [-nw] [-p ] [-D LL|LLT] \n" +"[-I1dvrxi] [-nw] [-p ] [-D LL|LLT] \n" \ +" [--decline-wait-time ]\n" #endif #define DHCLIENT_USAGEC \ @@ -507,6 +511,18 @@ main(int argc, char **argv) { argv[i]); } #endif /* DHCPv6 */ + } else if (!strcmp(argv[i], "--decline-wait-time")) { + if (++i == argc) { + usage(use_noarg, argv[i-1]); + } + + errno = 0; + decline_wait_time = (int)strtol(argv[i], &s, 10); + if (errno || (*s != '\0') || + (decline_wait_time < 0)) { + usage("Invalid value for " + "--decline-wait-time: %s", argv[i]); + } } else if (!strcmp(argv[i], "-D")) { duid_v4 = 1; if (++i == argc) @@ -1511,7 +1527,10 @@ void bind_lease (client) #endif finish(2); } else { - state_init(client); + struct timeval tv; + tv.tv_sec = cur_tv.tv_sec + decline_wait_time; + tv.tv_usec = cur_tv.tv_usec; + add_timeout(&tv, state_init, client, 0, 0); return; } } @@ -3985,8 +4004,10 @@ void script_init(struct client_state *client, const char *reason, client_envadd (client, "", "reason", "%s", reason); client_envadd (client, "", "pid", "%ld", (long int)getpid ()); +#if defined(DHCPv6) client_envadd (client, "", "dad_wait_time", "%ld", (long int)dad_wait_time); +#endif } } -- cgit v1.2.1