Let ifconfig wait for IPv6-address to not be tentative
After asking a NetBSD-developer, and verifying that the same applies to FreeBSD, I found out the solution (which applies on both these OSes):
The Duplicate Address Detection (DAD) will use some time detecting if the address is already in use. The amount of time it will use for this is defined in seconds in the sysctl(3) value net.inet6.ip6.dad_count. In NetBSD's /etc/rc.d/network, function network_start_ipv6_autoconf, the script waits for this amount plus one second.
When DAD finds out that the address is already in use on the network, ifconfig(8) will show the address as
duplicated. In this state it is not possible to bind to the address, similar to when the address is
A more complete and correcter solution would thus be:
ifconfig igb0 inet6 2001:db8::10/64 add dadcount=$(/sbin/sysctl -n net.inet6.ip6.dad_count 2>/dev/null) sleep $dadcount sleep 1 ifconfig igb0 | grep 2001:db8::10/64 | egrep '(duplicated|tentative)$' >&2 && exit 1 service my_service start
I have observed that FreeBSD and NetBSD behave differently when adding an address that is currently in
- FreeBSD 11 will immediatly remove the
duplicatedstate, allowing the address to be used, abeit possibly causing conflicts.
- NetBSD 7 will mark the address as
tentative, and it won't change the state from there, at least not for a couple minutes. The address must be removed and added again in order to be useable.
An address can be in several states, tentative is one of them. Having
ifconfig wait for an address to leave the state tentative is simply not in accord with the design.
You may configure to use optimistic DAD as defined in RFC 4429. The purpose is to make an address available to applications even if the DAD is not yet completed. You may need to reconfigure the kernel to utilize this feature.
Once the kernel is built to provide optimistic DAD, then you may certain sysctl-settings to enable it. From ip-sysctl.txt:
/proc/sys/net/ipv6/* Variables: ... conf/interface/*: Change special settings per interface. The functional behaviour for certain settings is different depending on whether local forwarding is enabled or not. ... optimistic_dad - BOOLEAN Whether to perform Optimistic Duplicate Address Detection (RFC 4429). 0: disabled (default) 1: enabled use_optimistic - BOOLEAN If enabled, do not classify optimistic addresses as deprecated during source address selection. Preferred addresses will still be chosen before optimistic addresses, subject to other ranking in the source address selection algorithm. 0: disabled (default) 1: enabled
That is, do something like
sysctl -w net.ipv6.conf.enp2s6.optimistic_dad=1 sysctl -w net.ipv6.conf.enp2s6.use_optimistic=1
at boot time.