link_set_up() {
ip_link_set dev "${interface}" up
}
link_set_mtu() {
[ -n "${1}" ] || return 0
ip_link_set dev "${interface}" mtu "${1}"
}
# shellcheck disable=SC2039
_ip_addr_flush() {
"${ip}" -6 addr flush "${@}"
}
ipv6_addr_flush() {
_ip_addr_flush "$@"
}
add_ipv6_addr_with_DAD() {
local _i
"${ip}" -6 addr replace "${new_ip6_address}/${new_ip6_prefixlen}" \
dev "${interface}" scope global valid_lft "${new_max_life}" \
preferred_lft "${new_preferred_life}"
if [ "${dad_wait_time}" -le 0 ]; then
return 0
fi
for _i in $(/data/dhcp6/busybox seq 1 "${dad_wait_time}"); do
/data/dhcp6/busybox sleep 1
if [ -z "${tentative}" ]; then
if [ -n "${addr}" ]; then
return 0
else
exit_with_hooks 3
fi
fi
done
return 0
}
# shellcheck disable=SC2039
init_if_metric() {
local _if_metric
_if_metric="${IF_METRIC}"
if [ "${new_routers%% *}" != "${new_routers}" ]; then
_if_metric="${_if_metric:-1}"
fi
if_metric="${_if_metric}"
echo "${_if_metric}"
}
case "${reason}" in
PREINIT)
echo
;;
PREINIT6)
#print_dhcp_info
interface_up_wait_time=5
for _i in $(/data/dhcp6/busybox seq 0 ${interface_up_wait_time}); do
if /data/dhcp6/busybox ifconfig "${interface}" | grep RUNNING >/dev/null 2>&1; then
break
fi
/data/dhcp6/busybox sleep 1
done; unset -v _i
ipv6_addr_flush dev "${interface}" scope global permanent
if [ "${dad_wait_time}" -gt 0 ]; then
if ipv6_addr_has_tentative "${interface}" inet6; then
for _i in $(seq 0 "${dad_wait_time}"); do
/data/dhcp6/busybox sleep 1
if ! ipv6_addr_has_tentative "${interface}" inet6; then
break
fi
done; unset -v _i
fi
fi
;;
BOUND6|RENEW6|REBIND6)
if [ "${new_ip6_address}" ] && [ "${new_ip6_prefixlen}" ]; then
add_ipv6_addr_with_DAD
fi
;;
DEPREF6)
if [ -z "${cur_ip6_prefixlen}" ]; then
exit_with_hooks 2
fi
"${ip}" -6 addr change "${cur_ip6_address}/${cur_ip6_prefixlen}" \
dev "${interface}" scope global preferred_lft 0
;;
EXPIRE6|RELEASE6|STOP6)
if [ -z "${old_ip6_address}" ] || [ -z "${old_ip6_prefixlen}" ]; then
exit_with_hooks 2
fi
ipv6_addr_del "${old_ip6_address}/${old_ip6_prefixlen}"