Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ISC Open Source Projects
dhcp
Commits
a68ec967
Commit
a68ec967
authored
Jun 05, 2017
by
Marcin Siodelski
Browse files
[master] Implemented --dad-wait-time option for dhclient.
Merged #36169
parent
c8f0b32a
Changes
8
Hide whitespace changes
Inline
Side-by-side
RELNOTES
View file @
a68ec967
...
...
@@ -133,6 +133,17 @@ by Eric Young (eay@cryptsoft.com).
default location of the server configuration file.
[ISC-Bugs #44765]
- Added --dad-wait-time parameter to dhclient. It specifies the maximum time,
in seconds, that the client process should wait for the duplicate address
detection to complete before initiating DHCP requests. This value is
propagated to the dhclient script and the script is responsible for waiting
the specified amount of time or until DAD has completed. If the script does
not support it, specifying this parameter has no effect. The default value
is 0 which specifies that the script should not wait for DAD. With this
change the following scripts have been modified to support the new parameter:
freebsd, linux, macos, netbsd, openbsd.
[ISC-Bugs #36169]
Changes since 4.3.0 (bug fixes)
- Tidy up several small tickets.
...
...
client/dhclient.8
View file @
a68ec967
...
...
@@ -134,6 +134,10 @@ dhclient - Dynamic Host Configuration Protocol Client
.B -w
]
[
.B --dad-wait-time
.I seconds
]
[
.B -v
]
[
...
...
@@ -409,6 +413,15 @@ overrides these default, with a value of either \fILL\fR or \fILLT\fR.
Restore normal address query for IPv6. This implies \fB-6\fR.
It is used to restore normal operation after using \fB-T\fR or \fB-P\fR.
Multiple addresses can be requested with multiple \fB\-N\fR flags.
.TP
.BI \--dad-wait-time \ seconds
Specify maximum time (in seconds) that the client should wait for the
duplicate address detection (DAD) to complete on an interface. This
value is propagated to the dhclient script in a dad_wait_time environment
variable. If any of the IPv6 addresses on the interface are tentative
(DAD is in progress), the script will wait for the specified number of
seconds for DAD to complete. If the script ignores this variable the
parameter has no effect.
.PP
.I Modifying default file locations:
The following options can be used to modify the locations a client uses
...
...
client/dhclient.c
View file @
a68ec967
...
...
@@ -97,6 +97,7 @@ int wanted_ia_pd = 0;
int
require_all_ias
=
0
;
/* If the user requires all of the IAs to
be available before accepting a lease
0 = no, 1 = requries */
int
dad_wait_time
=
0
;
char
*
mockup_relay
=
NULL
;
char
*
progname
=
NULL
;
...
...
@@ -153,11 +154,12 @@ static const char use_v6command[] = "Command not used for DHCPv4: %s";
#ifdef DHCPv6
#ifdef DHCP4o6
#define DHCLIENT_USAGE0 \
"[-4|-6] [-SNTPRI1dvrxi] [-nw] -4o6 <port>]\n" \
" [-
p <port>] [-D LL|LLT]
\n"
"[-4|-6] [-SNTPRI1dvrxi] [-nw] -4o6
<port>] [-p
<port>]\n" \
" [-
D LL|LLT] [--dad-wait-time seconds]
\n"
#else
/* DHCP4o6 */
#define DHCLIENT_USAGE0 \
"[-4|-6] [-SNTPRI1dvrxi] [-nw] [-p <port>] [-D LL|LLT] \n"
"[-4|-6] [-SNTPRI1dvrxi] [-nw] [-p <port>] [-D LL|LLT]\n" \
" [--dad-wait-time seconds]\n"
#endif
#else
/* DHCPv6 */
#define DHCLIENT_USAGE0 \
...
...
@@ -478,6 +480,15 @@ main(int argc, char **argv) {
local_family_set
=
1
;
local_family
=
AF_INET6
;
require_all_ias
=
1
;
}
else
if
(
!
strcmp
(
argv
[
i
],
"--dad-wait-time"
))
{
if
(
++
i
==
argc
)
{
usage
(
use_noarg
,
argv
[
i
-
1
]);
}
dad_wait_time
=
(
int
)
strtol
(
argv
[
i
],
&
s
,
10
);
if
(
errno
||
(
*
s
!=
'\0'
)
||
(
dad_wait_time
<
0
))
{
usage
(
"Invalid value for --dad-wait-time: %s"
,
argv
[
i
]);
}
#endif
/* DHCPv6 */
}
else
if
(
!
strcmp
(
argv
[
i
],
"-D"
))
{
duid_v4
=
1
;
...
...
@@ -3930,6 +3941,8 @@ void script_init (client, reason, medium)
client_envadd
(
client
,
""
,
"reason"
,
"%s"
,
reason
);
client_envadd
(
client
,
""
,
"pid"
,
"%ld"
,
(
long
int
)
getpid
());
client_envadd
(
client
,
""
,
"dad_wait_time"
,
"%ld"
,
(
long
int
)
dad_wait_time
);
}
}
...
...
client/scripts/freebsd
View file @
a68ec967
...
...
@@ -335,6 +335,42 @@ if [ ${reason} = PREINIT6 ] ; then
# XXX: Remove any stale addresses from aborted clients.
# We need to give the kernel some time to active interface
interface_up_wait_time
=
5
for
i
in
$(
seq
0
${
interface_up_wait_time
}
)
do
ifconfig
${
interface
}
|
grep
inactive
>
/dev/null 2>&1
if
[
$?
-ne
0
]
;
then
break
;
fi
sleep
1
done
# Wait for duplicate address detection for this interface if the
# --dad-wait-time parameter has been specified and is greater than
# zero.
if
[
${
dad_wait_time
}
-gt
0
]
;
then
# Check if any IPv6 address on this interface is marked as
# tentative.
ifconfig
${
interface
}
|
grep
inet6 |
grep
tentative
\
>
/dev/null 2>&1
if
[
$?
-eq
0
]
;
then
# Wait for duplicate address detection to complete or for
# the timeout specified as --dad-wait-time.
for
i
in
$(
seq
0
$dad_wait_time
)
do
# We're going to poll for the tentative flag every second.
sleep
1
ifconfig
${
interface
}
|
grep
inet6 |
grep
tentative
\
>
/dev/null 2>&1
if
[
$?
-ne
0
]
;
then
break
;
fi
done
fi
fi
exit_with_hooks 0
fi
...
...
client/scripts/linux
View file @
a68ec967
...
...
@@ -248,9 +248,44 @@ if [ x$reason = xPREINIT6 ] ; then
# Ensure interface is up.
${
ip
}
link set
${
interface
}
up
# We need to give the kernel some time to active interface
interface_up_wait_time
=
5
for
i
in
$(
seq
0
${
interface_up_wait_time
}
)
do
ifconfig
${
interface
}
|
grep
RUNNING
>
/dev/null 2>&1
if
[
$?
-eq
0
]
;
then
break
;
fi
sleep
1
done
# Remove any stale addresses from aborted clients.
${
ip
}
-f
inet6 addr flush dev
${
interface
}
scope global permanent
# Wait for duplicate address detection for this interface if the
# --dad-wait-time parameter has been specified and is greater than
# zero.
if
[
${
dad_wait_time
}
-gt
0
]
;
then
# Check if any IPv6 address on this interface is marked as
# tentative.
${
ip
}
addr show
${
interface
}
|
grep
inet6 |
grep
tentative
\
&> /dev/null
if
[
$?
-eq
0
]
;
then
# Wait for duplicate address detection to complete or for
# the timeout specified as --dad-wait-time.
for
i
in
$(
seq
0
$dad_wait_time
)
do
# We're going to poll for the tentative flag every second.
sleep
1
${
ip
}
addr show
${
interface
}
|
grep
inet6 |
grep
tentative
\
&> /dev/null
if
[
$?
-ne
0
]
;
then
break
;
fi
done
fi
fi
exit_with_hooks 0
fi
...
...
client/scripts/macos
View file @
a68ec967
...
...
@@ -144,8 +144,43 @@ if [ x$reason = xPREINIT6 ]; then
# Ensure interface is up.
ifconfig
${
interface
}
up
# We need to give the kernel some time to active interface
interface_up_wait_time
=
5
for
i
in
$(
seq
0
${
interface_up_wait_time
}
)
do
ifconfig
${
interface
}
|
grep
inactive &> /dev/null
if
[
$?
-ne
0
]
;
then
break
;
fi
sleep
1
done
# XXX: Remove any stale addresses from aborted clients.
# Wait for duplicate address detection for this interface if the
# --dad-wait-time parameter has been specified and is greater than
# zero.
if
[
${
dad_wait_time
}
-gt
0
]
;
then
# Check if any IPv6 address on this interface is marked as
# tentative.
ifconfig
${
interface
}
|
grep
inet6 |
grep
tentative
\
&> /dev/null
if
[
$?
-eq
0
]
;
then
# Wait for duplicate address detection to complete or for
# the timeout specified as --dad-wait-time.
for
i
in
$(
seq
0
$dad_wait_time
)
do
# We're going to poll for the tentative flag every second.
sleep
1
ifconfig
${
interface
}
|
grep
inet6 |
grep
tentative
\
&> /dev/null
if
[
$?
-ne
0
]
;
then
break
;
fi
done
fi
fi
exit_with_hooks 0
fi
...
...
client/scripts/netbsd
View file @
a68ec967
...
...
@@ -265,6 +265,41 @@ if [ ${reason} = PREINIT6 ] ; then
# XXX: Remove any stale addresses from aborted clients.
# We need to give the kernel some time to active interface
interface_up_wait_time
=
5
for
i
in
$(
seq
0
${
interface_up_wait_time
}
)
do
ifconfig
${
interface
}
|
grep
inactive
>
/dev/null 2>&1
if
[
$?
-ne
0
]
;
then
break
;
fi
sleep
1
done
# Wait for duplicate address detection for this interface if the
# --dad-wait-time parameter has been specified and is greater than
# zero.
if
[
${
dad_wait_time
}
-gt
0
]
;
then
# Check if any IPv6 address on this interface is marked as
# tentative.
ifconfig
${
interface
}
|
grep
inet6 |
grep
tentative
\
>
/dev/null 2>&1
if
[
$?
-eq
0
]
;
then
# Wait for duplicate address detection to complete or for
# the timeout specified as --dad-wait-time.
for
i
in
$(
seq
0
$dad_wait_time
)
do
# We're going to poll for the tentative flag every second.
sleep
1
ifconfig
${
interface
}
|
grep
inet6 |
grep
tentative
\
>
/dev/null 2>&1
if
[
$?
-ne
0
]
;
then
break
;
fi
done
fi
fi
exit_with_hooks 0
fi
...
...
client/scripts/openbsd
View file @
a68ec967
...
...
@@ -259,6 +259,41 @@ if [ ${reason} = PREINIT6 ] ; then
# XXX: Remove any stale addresses from aborted clients.
# We need to give the kernel some time to active interface
interface_up_wait_time
=
5
for
i
in
$(
seq
0
${
interface_up_wait_time
}
)
do
ifconfig
${
interface
}
|
grep
inactive
>
/dev/null 2>&1
if
[
$?
-ne
0
]
;
then
break
;
fi
sleep
1
done
# Wait for duplicate address detection for this interface if the
# --dad-wait-time parameter has been specified and is greater than
# zero.
if
[
${
dad_wait_time
}
-gt
0
]
;
then
# Check if any IPv6 address on this interface is marked as
# tentative.
ifconfig
${
interface
}
|
grep
inet6 |
grep
tentative
\
>
/dev/null 2>&1
if
[
$?
-eq
0
]
;
then
# Wait for duplicate address detection to complete or for
# the timeout specified as --dad-wait-time.
for
i
in
$(
seq
0
$dad_wait_time
)
do
# We're going to poll for the tentative flag every second.
sleep
1
ifconfig
${
interface
}
|
grep
inet6 |
grep
tentative
\
>
/dev/null 2>&1
if
[
$?
-ne
0
]
;
then
break
;
fi
done
fi
fi
exit_with_hooks 0
fi
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment