summaryrefslogtreecommitdiff
path: root/client
diff options
context:
space:
mode:
authorThomas Markwalder <tmark@isc.org>2017-11-27 13:12:24 -0500
committerThomas Markwalder <tmark@isc.org>2017-11-27 13:12:24 -0500
commit3e88222f1c2f7a365b9fde018bb4bf86520b51d6 (patch)
tree6433435961fc83006b28c841b67ff16c7236a3f4 /client
parentc0e9661e70446890df9cdc3f5df48ab98b466600 (diff)
downloadisc-dhcp-3e88222f1c2f7a365b9fde018bb4bf86520b51d6.tar.gz
[master] dhclient now delays between DHCPDECLINE and DHCPDISCOVER
Merges in rt45457
Diffstat (limited to 'client')
-rw-r--r--client/dhclient.811
-rw-r--r--client/dhclient.c33
2 files changed, 38 insertions, 6 deletions
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 <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
}
}