# Configure radvd

set_eui64_prefix() {
	IFACE=${1}
	ORIG_IFS=${IFS}
	IFS=:
	m=($(cat /sys/class/net/${IFACE}/address))
	IFS=${ORIG_IFS}

	/sbin/ip -6 addr change $(printf "%s%x:%x:%x:%x" ${2} $((((0x${m[0]} ^ 2) << 8) + 0x${m[1]}))  0x${m[2]}ff 0xfe${m[3]} 0x${m[4]}${m[5]})/64 dev ${1} valid_lft ${3} preferred_lft ${4} mngtmpaddr 2>/dev/null || :
}


fixup_pre() {
	ORIG_IFS=${IFS}
	IFS=:;
	pre_a=(${1})
	IFS=${ORIG_IFS}

	if [ ! "${pre_a[3]}" ];then
		pre_a[3]=0
	fi

	if [ ! "${pre_a[2]}" ];then
		pre_a[2]=0
	fi

	if [ ! "${pre_a[1]}" ];then
		pre_a[1]=0
	fi

	printf "%x:%x:%x:%x::/64" 0x${pre_a[0]} 0x${pre_a[1]} 0x${pre_a[2]} $((0x${pre_a[3]} + ${2}))
}



setup_interface() {
	eval $(ipcalc -p -n ${2})
	eval $(dhcpcd -U ${dhcpcd_iface} 2>/dev/null)

	case ${1} in
		eth0.*)
			if [ -e /etc/default/vlan_${interface:5} ];then
				source /etc/default/vlan_${interface:5}
			fi;
		;;
		wlan[01])
			if [ -e /etc/default/wifi ];then
				source /etc/default/wifi
			fi;
		;;
		eth0)
			if [ -e /etc/default/static ];then
				source /etc/default/static
			fi;
		;;
	esac

	if [[ -n "${IPV6PDSUF}" && "${IPV6PDSUF}" != "0" && "${IPV6PDSUF}" != "-1" && "${NETWORK:0:-2}${IPV6PDSUF}" =~ .*:.*:.*:.* ]]; then
		/sbin/ip -6 addr change ${NETWORK:0:-2}${IPV6PDSUF}/128 dev ${1} valid_lft ${dhcp6_ia_pd1_prefix1_vltime} preferred_lft ${dhcp6_ia_pd1_prefix1_pltime} >/dev/null 2>&1 || :
	fi;

	set_eui64_prefix ${1} ${NETWORK:0:-1} ${dhcp6_ia_pd1_prefix1_vltime} ${dhcp6_ia_pd1_prefix1_pltime}
}

remove_snet_ip() {
	ORIG_IFS=${IFS}
	IFS=:
	sn=(${1})
	IFS=${ORIG_IFS}

	if [ "${sn[3]}" ];then
		sn[3]=$((0x${sn[3]} + ${2}))
	else
		sn[3]=${2}
	fi
	PREFIX=$(printf "%s:%s:%s:%x:" ${sn[0]} ${sn[1]} ${sn[2]} ${sn[3]})

	/sbin/ip -6 -s -o addr show scope global |grep ${PREFIX} |awk '{printf "ip addr del %s dev %s\n", $4, $2}'  |sh
}

cleanup_subnet() {
	SUBNETS=$((( 2 << ((64 - ${2}) -1 ))))

	SNET=0
	while [ "${SNET}" -lt "${SUBNETS}" ];do
		remove_snet_ip ${1} ${SNET}
		SNET=$((${SNET} + 1))
	done;
}

foreach_ia_na() {
	cnt=1

	while true;do
		ia_na=dhcp6_ia_na1_ia_addr${cnt}
		old_ia_na=old_${ia_na}
		new_ia_na=new_${ia_na}
		vltime=new_${ia_na}_vltime
		pltime=new_${ia_na}_pltime


		if [[ -z "${!new_ia_na}" && -z "${!old_ia_na}" ]];then
			break;
		fi;

		if [ "${1}" == "0" ];then
			if [ -n "${!old_ia_na}" ];then
				/sbin/ip -6 addr del ${!old_ia_na}/128 dev ${interface} > /dev/null 2>&1 || :
			fi;
		elif [[ -n "${!new_ia_na}" || -n ${!old_ia_na} ]];then
			if [[ -n "${!old_ia_na}" && "${!old_ia_na}" != "${!new_ia_na}" ]];then
				/sbin/ip -6 addr del ${!old_ia_na}/128 dev ${interface} > /dev/null 2>&1 || :
			fi;
			if [ -n "${!new_ia_na}" ];then
				if [[ "${!vltime}" == "0" || "${!pltime}" == "0" ]];then
					/sbin/ip -6 addr change ${!new_ia_na}/128 dev ${interface} valid_lft ${new_dhcp6_ia_pd1_prefix1_vltime} preferred_lft ${new_dhcp6_ia_pd1_prefix1_pltime}
				else
					/sbin/ip -6 addr change ${!new_ia_na}/128 dev ${interface} valid_lft ${!vltime} preferred_lft ${!pltime}
				fi
			fi
		fi;

		cnt=$(($cnt+1))
done

}

case "$reason" in
REBIND6|BOUND6|REBOOT6)
		foreach_ia_na 1
		if [ -z "${old_dhcp6_ia_pd1_prefix1}" ] ||  [ "${old_dhcp6_ia_pd1_prefix1}" != "${new_dhcp6_ia_pd1_prefix1}" ];then
			echo "Restart radvd ($reason}"
			/etc/init.d/netconf radvd
		fi;
	;;
RECONFIGURE|EXPIRE6)
		echo "${reason} OLD PRE ${old_dhcp6_ia_pd1_prefix1} NEW ${new_dhcp6_ia_pd1_prefix1}"
#		if [ -z "${old_dhcp6_ia_pd1_prefix1}" ] ||  [ "${old_dhcp6_ia_pd1_prefix1}" != "${new_dhcp6_ia_pd1_prefix1}" ];then
#			echo "Restart radvd ($reason}"
#			/etc/init.d/netconf radvd
#		fi;
	;;
RELEASE6)
		if [[ -n "${old_dhcp6_ia_pd1_prefix1}" && -n "${old_dhcp6_ia_pd1_prefix1_length}" ]];then
			cleanup_subnet ${old_dhcp6_ia_pd1_prefix1} ${old_dhcp6_ia_pd1_prefix1_length}
			echo "Restart radvd ($reason}"
			/etc/init.d/netconf radvd
		fi;
	;;
STOP6|TIMEOUT|STOPPED)
		foreach_ia_na 0
		/etc/init.d/netconf radvd
	;;
DELEGATED6)
		setup_interface ${interface} ${new_delegated_dhcp6_prefix}
	;;
DEPARTED)
		echo "${reason} OLD PRE ${old_dhcp6_ia_pd1_prefix1} NEW ${new_dhcp6_ia_pd1_prefix1}"
		foreach_ia_na 0
		echo "Restart radvd ($reason}"
		/etc/init.d/netconf radvd
	;;
esac
