summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Markwalder <tmark@isc.org>2019-06-07 08:58:20 -0400
committerThomas Markwalder <tmark@isc.org>2019-06-07 08:58:20 -0400
commitebe4f7ae427fa91f561a0b6e5f242de08d319a16 (patch)
treee525dbfecb6e626a82596a1bae4ee00ecb5c6e5f
parentddb508ac083dae4ff83279dd240bad7f73a97b7d (diff)
parent5918b493440f02987eca01fafc7630f365beb343 (diff)
downloadisc-dhcp-ebe4f7ae427fa91f561a0b6e5f242de08d319a16.tar.gz
[master] Added ping-timeout-ms parameter
Merge branch '10-make-ping-check-timeout-configurable-in-ms-thus-allowing-timeouts-1s'
-rw-r--r--includes/dhcpd.h6
-rw-r--r--server/dhcp.c51
-rw-r--r--server/dhcpd.conf.518
-rw-r--r--server/stables.c1
4 files changed, 62 insertions, 14 deletions
diff --git a/includes/dhcpd.h b/includes/dhcpd.h
index 92f77f22..2907fcfa 100644
--- a/includes/dhcpd.h
+++ b/includes/dhcpd.h
@@ -816,16 +816,20 @@ struct lease_state {
#define SV_LOCAL_ADDRESS6 97
#define SV_BIND_LOCAL_ADDRESS6 98
#define SV_PING_CLTT_SECS 99
+#define SV_PING_TIMEOUT_MS 100
#if !defined (DEFAULT_PING_TIMEOUT)
# define DEFAULT_PING_TIMEOUT 1
#endif
+#if !defined (DEFAULT_PING_TIMEOUT_MS)
+# define DEFAULT_PING_TIMEOUT_MS 0
+#endif
+
#if !defined (DEFAULT_PING_CLTT_SECS)
# define DEFAULT_PING_CLTT_SECS 60 /* in seconds */
#endif
-
#if !defined (DEFAULT_DELAYED_ACK)
# define DEFAULT_DELAYED_ACK 0 /* default 0 disables delayed acking */
#endif
diff --git a/server/dhcp.c b/server/dhcp.c
index 5af022fb..0529662c 100644
--- a/server/dhcp.c
+++ b/server/dhcp.c
@@ -3,7 +3,7 @@
DHCP Protocol engine. */
/*
- * Copyright (c) 2004-2018 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 2004-2019 by Internet Systems Consortium, Inc. ("ISC")
* Copyright (c) 1995-2003 by Internet Software Consortium
*
* This Source Code Form is subject to the terms of the Mozilla Public
@@ -3609,10 +3609,13 @@ int do_ping_check(struct packet* packet, struct lease_state* state,
struct lease* lease, TIME original_cltt,
int same_client) {
TIME ping_timeout = DEFAULT_PING_TIMEOUT;
+ TIME ping_timeout_ms = DEFAULT_PING_TIMEOUT_MS;
struct option_cache *oc = NULL;
struct data_string ds;
struct timeval tv;
int ignorep;
+ int timeout_secs;
+ int timeout_ms;
// Don't go any further if lease is active or static.
if (lease->binding_state == FTS_ACTIVE || lease->flags & STATIC_LEASE) {
@@ -3658,6 +3661,7 @@ int do_ping_check(struct packet* packet, struct lease_state* state,
/* Determine whether to use configured or default ping timeout. */
memset(&ds, 0, sizeof(ds));
+
oc = lookup_option (&server_universe, state->options, SV_PING_TIMEOUT);
if (oc &&
(evaluate_option_cache (&ds, packet, lease, 0,
@@ -3670,26 +3674,51 @@ int do_ping_check(struct packet* packet, struct lease_state* state,
data_string_forget (&ds, MDL);
}
+ oc = lookup_option (&server_universe, state->options, SV_PING_TIMEOUT_MS);
+ if (oc &&
+ (evaluate_option_cache (&ds, packet, lease, 0,
+ packet->options, state->options,
+ &lease->scope, oc, MDL))) {
+ if (ds.len == sizeof (u_int32_t)) {
+ ping_timeout_ms = getULong (ds.data);
+ }
+
+ data_string_forget (&ds, MDL);
+ }
+
+ /*
+ * Set the timeout for the ping to the current timeval plus
+ * the configured time out. Use ping-timeout-ms if it is > 0.
+ * This overrides ping-timeout allowing users to specify it in
+ * milliseconds.
+ */
+ if (ping_timeout_ms > 0) {
+ timeout_secs = ping_timeout_ms / 1000;
+ timeout_ms = ping_timeout_ms % 1000;
+ } else {
+ timeout_secs = ping_timeout;
+ timeout_ms = 0;
+
+ }
+
+ tv.tv_sec = cur_tv.tv_sec + timeout_secs;
+ tv.tv_usec = cur_tv.tv_usec + (timeout_ms * 1000);
+
#ifdef DEBUG
log_debug ("Pinging:%s, state: %d, same client? %s, "
- " orig_cltt %s, elasped: %ld" ,
+ " orig_cltt %s, elasped: %ld, timeout in: %d.%d secs" ,
piaddr(lease->ip_addr),
lease->binding_state,
(same_client ? "y" : "n"),
(original_cltt ? print_time(original_cltt) : "0"),
- (original_cltt ? (long)(cur_time - original_cltt) : 0));
+ (original_cltt ? (long)(cur_time - original_cltt) : 0),
+ timeout_secs, timeout_ms);
+
#endif
- /*
- * Set a timeout for 'ping-timeout' seconds from NOW, including
- * current microseconds. As ping-timeout defaults to 1, the
- * exclusion of current microseconds causes a value somewhere
- * /between/ zero and one.
- */
- tv.tv_sec = cur_tv.tv_sec + ping_timeout;
- tv.tv_usec = cur_tv.tv_usec;
add_timeout (&tv, lease_ping_timeout, lease, (tvref_t)lease_reference,
(tvunref_t)lease_dereference);
+
return (1);
}
diff --git a/server/dhcpd.conf.5 b/server/dhcpd.conf.5
index bd471998..7bd99b8e 100644
--- a/server/dhcpd.conf.5
+++ b/server/dhcpd.conf.5
@@ -1,6 +1,6 @@
.\" dhcpd.conf.5
.\"
-.\" Copyright (c) 2004-2018 by Internet Systems Consortium, Inc. ("ISC")
+.\" Copyright (c) 2004-2019 by Internet Systems Consortium, Inc. ("ISC")
.\" Copyright (c) 1996-2003 by Internet Software Consortium
.\"
.\" This Source Code Form is subject to the terms of the Mozilla Public
@@ -3070,7 +3070,21 @@ you to configure how many seconds the DHCP server should wait for an
ICMP Echo response to be heard, if no ICMP Echo response has been received
before the timeout expires, it assigns the address. If a response \fIis\fR
heard, the lease is abandoned, and the server does not respond to the client.
-If no value is set, ping-timeout defaults to 1 second.
+If no value is set, ping-timeout defaults to 1 second. (See also ping-timeout-ms
+below)
+.RE
+.PP
+The
+.I ping-timeout-ms
+statement
+.RS 0.25i
+.PP
+.B ping-timeout-ms
+.I milliseconds\fR\fB;\fR
+.PP
+Allows you to specify the ping timeout in milliseconds rather than
+seconds. If this value is greater than zero, the server will use it
+in place of ping-timeout. The default value is zero.
.RE
.PP
The
diff --git a/server/stables.c b/server/stables.c
index 75847270..1a08201e 100644
--- a/server/stables.c
+++ b/server/stables.c
@@ -292,6 +292,7 @@ static struct option server_options[] = {
{ "local-address6", "6", &server_universe, SV_LOCAL_ADDRESS6, 1 },
{ "bind-local-address6", "f", &server_universe, SV_BIND_LOCAL_ADDRESS6, 1 },
{ "ping-cltt-secs", "T", &server_universe, SV_PING_CLTT_SECS, 1 },
+ { "ping-timeout-ms", "T", &server_universe, SV_PING_TIMEOUT_MS, 1 },
{ NULL, NULL, NULL, 0, 0 }
};