also do not arping the IPv6 address.
if strstr $ip '*:*:*'; then
# note no ip addr flush for ipv6
ip addr add $ip/$mask ${srv:+peer $srv} dev $netif
+ wait_for_ipv6_dad $netif
else
ip addr flush dev $netif
ip addr add $ip/$mask ${srv:+peer $srv} brd + dev $netif
read layer2 < /sys/class/net/$netif/device/layer2
fi
- if [ "$layer2" != "0" ] && [ -n "$dest" ] && ! arping -q -f -w 60 -I $netif $dest ; then
- info "Resolving $dest via ARP on $netif failed"
+ if [ "$layer2" != "0" ] && [ -n "$dest" ] && ! strstr "$dest" ":"; then
+ arping -q -f -w 60 -I $netif $dest || info "Resolving $dest via ARP on $netif failed"
fi
unset layer2
return 1
}
+wait_for_ipv6_dad() {
+ local cnt=0
+ local li
+ while [ $cnt -lt 500 ]; do
+ li=$(ip -6 addr show dev $1)
+ strstr "$li" "tentative" || return 0
+ sleep 0.1
+ cnt=$(($cnt+1))
+ done
+ return 1
+}
+
wait_for_ipv6_auto() {
local cnt=0
local li