From: Thomas Markwalder Date: Mon, 27 Nov 2017 18:12:24 +0000 (-0500) Subject: [master] dhclient now delays between DHCPDECLINE and DHCPDISCOVER X-Git-Tag: v4_4_0b1_f1~56 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3e88222f1c2f7a365b9fde018bb4bf86520b51d6;p=thirdparty%2Fdhcp.git [master] dhclient now delays between DHCPDECLINE and DHCPDISCOVER Merges in rt45457 --- diff --git a/RELNOTES b/RELNOTES index 990f156bb..71493c6fa 100644 --- a/RELNOTES +++ b/RELNOTES @@ -186,7 +186,17 @@ dhcp-users@lists.isc.org. - Added a new dhclient command line parameter, --prefix-len-hint . When used in conjunction with -P, it directs dhclient to use the given length as the prefix length hint when requesting prefixes. - [ISC-Bugs #43792] + [ISC-Bugs #43792] + [ISC-Bugs #35112] + [ISC-Bugs #32228] + [ISC-Bugs #29470] + +- dhclient will now wait for 10 seconds after declining an IPv4 address + before issuing a discover. This is in keeping with RFC 2131, section 3.1.5. + Prior to this dhclient did not wait at all. The amount of time dhclient + waits can be specified via a new command line parameter: + --decline-wait-time . A value of zero equates to no wait at all. + [ISC-Bugs #45457] Changes since 4.3.0 (bug fixes) diff --git a/client/dhclient.8 b/client/dhclient.8 index ab4b77d4e..1fe1f8012 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 e25ab94ba..45fbec7ab 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 } }