]> git.ipfire.org Git - thirdparty/dhcp.git/commitdiff
[master] dhclient now delays between DHCPDECLINE and DHCPDISCOVER
authorThomas Markwalder <tmark@isc.org>
Mon, 27 Nov 2017 18:12:24 +0000 (13:12 -0500)
committerThomas Markwalder <tmark@isc.org>
Mon, 27 Nov 2017 18:12:24 +0000 (13:12 -0500)
    Merges in rt45457

RELNOTES
client/dhclient.8
client/dhclient.c

index 990f156bb3ff8575a17684c95cd7b79f31e7b213..71493c6faa329ce5eb14aec465e256536964bdb8 100644 (file)
--- a/RELNOTES
+++ b/RELNOTES
@@ -186,7 +186,17 @@ dhcp-users@lists.isc.org.
 - Added a new dhclient command line parameter, --prefix-len-hint <length>.
   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 <seconds>.  A value of zero equates to no wait at all.
+  [ISC-Bugs #45457]
 
                        Changes since 4.3.0 (bug fixes)
 
index ab4b77d4e7d94576df053e1d699d0b61dc3cb67b..1fe1f801234cf45d9ddb7084a50b70eb4a7ce1af 100644 (file)
@@ -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
index e25ab94baedc816320c81673ab97380e59b97a20..45fbec7ab7015a89365f8fd5f3dfa2850049e017 100644 (file)
@@ -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 <port>] [-p <port>]\n" \
-"                [-D LL|LLT] [--dad-wait-time seconds]\n" \
-"                [--prefix-len-hint length]\n"
+"[-4|-6] [-SNTPRI1dvrxi] [-nw] -4o6 <port>] [-p <port>] [-D LL|LLT]\n" \
+"                [--dad-wait-time <seconds>] [--prefix-len-hint <length>]\n" \
+"                [--decline-wait-time <seconds>]\n"
 #else /* DHCP4o6 */
 #define DHCLIENT_USAGE0 \
 "[-4|-6] [-SNTPRI1dvrxi] [-nw] [-p <port>] [-D LL|LLT]\n" \
-"                [--dad-wait-time seconds] [--prefix-len-hint length]\n"
+"                [--dad-wait-time <seconds>] [--prefix-len-hint <length>]\n" \
+"                [--decline-wait-time <seconds>]\n"
 #endif
 #else /* DHCPv6 */
 #define DHCLIENT_USAGE0 \
-"[-I1dvrxi] [-nw] [-p <port>] [-D LL|LLT] \n"
+"[-I1dvrxi] [-nw] [-p <port>] [-D LL|LLT] \n" \
+"                [--decline-wait-time <seconds>]\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
        }
 }