#!/bin/sh

v6WAN_MODE=$(uci -q get ipv6.wan.mode)
WAN_IPv4=$(uci -q  get -P /var/state network.wan.ipaddr)
v6rd_mode=$(uci -q get ipv6.wan_6rd.v6rd_mode)

case $INTERFACE in
	"wan")
		case $ACTION in
			"ifup")
				ip tunnel del tun6in4 > /dev/null 2>&1
				if [ "$v6WAN_MODE" == "6to4" ]; then
					/sbin/6to4.sh start & > /dev/null 2>&1
				else
					/sbin/6to4.sh stop & > /dev/null 2>&1
				fi
				
				if [ "$v6WAN_MODE" == "6rd" -a "$v6rd_mode" == "static6rd" -a "$WAN_IPv4" ]; then
					v6rd_BRIPv4Address=$(uci -q get ipv6.wan_6rd.v6rd_border_relay_addr)
					v6rd_IPv4MaskLen=$(uci -q get ipv6.wan_6rd.v6rd_mask_len)
					v6rd_IPv6Prefix=$(uci -q get ipv6.wan_6rd.v6rd_prefix)
					v6rd_IPv6PrefixLen=$(uci -q get ipv6.wan_6rd.v6rd_prefix_len)

					ip6rd $WAN_IPv4 $v6rd_IPv4MaskLen $v6rd_IPv6PrefixLen $v6rd_IPv6Prefix $v6rd_BRIPv4Address
				fi
				
				if [ "$v6WAN_MODE" == "static_6in4" -a "$WAN_IPv4" ]; then		
					v6in4_server_ipv4_ip=$(uci -q get ipv6.wan_static_6in4.v6in4_server_ipv4_ip)
					v6in4_IPv6_IP=$(uci -q get ipv6.wan_static_6in4.v6in4_IPv6_IP)
					v6in4_IPv6_IP_prefix_len=$(uci -q get ipv6.wan_static_6in4.v6in4_IPv6_IP_prefix_len)
					v6in4_lan_prefix=$(uci -q get ipv6.wan_static_6in4.v6in4_lan_prefix)
					v6in4_lan_prefix_len=$(uci -q get ipv6.wan_static_6in4.v6in4_lan_prefix_len)
					v6in4_ttl=$(uci -q get ipv6.wan_static_6in4.v6in4_ttl)
					v6in4_PREFIX=$(uci get -q ipv6.wan_static_6in4.v6in4_lan_mask)
					v6in4_PREFIX_LEN=$(uci get -q ipv6.wan_static_6in4.v6in4_lan_mask_len)
					v6in4_EUI64=$(uci -q get ipv6.lan.link_addr |sed 's/fe80:://')

					ip tunnel add tun6in4 mode sit remote $v6in4_server_ipv4_ip local $WAN_IPv4 ttl $v6in4_ttl
					ip link set tun6in4 up
					ip addr add $v6in4_IPv6_IP/$v6in4_IPv6_IP_prefix_len dev tun6in4
					ip addr add $v6in4_PREFIX$v6in4_EUI64/$v6in4_PREFIX_LEN dev br-lan
					ip -6 route delete 2001::/3
					ip route add 2001::/3 dev tun6in4
					ip -f inet6 addr
				fi
			;;
			"ifdown")
				/sbin/6to4.sh stop & > /dev/null 2>&1
				ip tunnel del tun6in4 > /dev/null 2>&1
			;;			
			*)
				return 0
			;;
		esac
	;;
	"3gwan")
		case $ACTION in
			"ifup")
				ip tunnel del tun6in4 > /dev/null 2>&1
				if [ "$v6WAN_MODE" == "6to4" ]; then
					/sbin/6to4.sh start & > /dev/null 2>&1
				else
					/sbin/6to4.sh stop & > /dev/null 2>&1
				fi
				
				if [ "$v6WAN_MODE" == "6rd" -a "$v6rd_mode" == "static6rd" -a "$WAN_IPv4" ]; then
					ip6rd $WAN_IPv4 $v6rd_IPv4MaskLen $v6rd_IPv6PrefixLen $v6rd_IPv6Prefix $v6rd_BRIPv4Address
				fi
				
				if [ "$v6WAN_MODE" == "static_6in4" -a "$WAN_IPv4" ]; then		
					ip tunnel add tun6in4 mode sit remote $v6in4_server_ipv4_ip local $WAN_IPv4 ttl $v6in4_ttl
					ip link set tun6in4 up
					ip addr add $v6in4_IPv6_IP/$v6in4_IPv6_IP_prefix_len dev tun6in4
					ip addr add $v6in4_PREFIX:10/$v6in4_PREFIX_LEN dev br-lan
					ip -6 route delete 2001::/3
					ip route add 2001::/3 dev tun6in4
					ip -f inet6 addr
				fi		
			;;
			"ifdown")
				/sbin/6to4.sh stop & > /dev/null 2>&1
				ip tunnel del tun6in4 > /dev/null 2>&1
			;;
			*)
				return 0
			;;
		esac
	;;
	"lan")
		case $ACTION in
			"ifup")
				if [ "$v6WAN_MODE" == "6to4" ]; then
					#set LAN IPv6 Prefix
					LAN_IPv6=$(ifconfig tun6to4 | grep "inet6 addr" | grep -v -E "fe80::|/128" | sed -e "s/^.*inet6 addr: //" -e "s/ Scope.*\$//")
					if [ $LAN_IPv6 ]; then
						ifconfig br-lan $LAN_IPv6
					fi
				fi				
			;;
			*)
				return 0
			;;
		esac
	;;
	*)
		return 0
	;;
esac