#!/bin/sh /etc/rc.common
UCI_CONFIG="network"
config_load $UCI_CONFIG

debug_option="-D"
uptime=`cat /proc/uptime | cut -d. -f 1`

#clear ip6tables LAN_2_WAN
config_get phy "$INTERFACE" physical
if [ "$phy" == "eth0" ]; then
	/usr/sbin/ip6tables -t mangle -F ${INTERFACE}_2_WAN >/dev/null 2>&1
	/usr/sbin/ip6tables -t mangle -D LAN_2_WAN -i $DEVICE -j ${INTERFACE}_2_WAN >/dev/null 2>&1
fi

#create md5ctlkey for dhcp6c
if   [ "$ACTION" = "ifup" ]; then
	[ ! -e /etc/dhcp6cctlkey ] && `dd if=/dev/urandom count=1 2> /dev/null | md5sum | cut -d" " -f1 > /etc/dhcp6cctlkey`
	config_get proto6 "$INTERFACE" proto6
	ip6linkip=`ip -6 addr show dev $DEVICE 2> /dev/null | awk '/scope link/{ printf $2 }'`	#get link local IPv6 of ?an?-?an?
	case "$proto6" in
		link-local)
			json set network.$INTERFACE proto6=link-local connectio6=up uptim6=$uptime ip6linkip=$ip6linkip ip6addr= gateway6= dns6=
		;;
		static)
			config_get ip6addr "$INTERFACE" static6_ip6addr
			config_get ip6length "$INTERFACE" static6_ip6length
			config_get gateway6 "$INTERFACE" static6_gateway6
			config_get dns6 "$INTERFACE" static6_dns6
			tid=`get_route_table_id $INTERFACE`
			[ -z "$ip6addr" -o -z "$ip6length" ] || ip -6 addr add $ip6addr/$ip6length dev $DEVICE
			[ "$gateway6" ] && ip -6 route add table $tid default via "$gateway6" dev $DEVICE
			for ns6 in $dns6; do
				echo "nameserver $ns6 #ipv6-$INTERFACE" >> /tmp/resolv.conf.auto
			done
			ip6addr=`ip -6 addr show dev $DEVICE 2> /dev/null | awk '/scope global/{ printf $2 }'`
			json set network.$INTERFACE proto6=static connectio6=up uptim6=$uptime ip6linkip=$ip6linkip ip6addr=$ip6addr gateway6=$gateway6 dns6=$dns6

			#STATIC : set src routing to ip rule
			ITF_BASE_ID=`/usr/sbin/iprule_idx.sh iface`
			ipr_id=$(($ITF_BASE_ID + $tid))
			while [ "`/usr/sbin/ip -6 rule |grep $ipr_id`" ]; do
				/usr/sbin/ip -6 rule del pref $ipr_id
			done
			/usr/sbin/ip -6 rule add pref $ipr_id from `echo $ip6addr |sed 's/\/.*//g'` table $tid
			break
		;;
		dhcp-ia_pd)
			cat > /var/dhcp6c_$INTERFACE.conf << EOF
interface $DEVICE {
        send ia-pd 0;
        script "/etc/dhcp6/dhcp6c.script";
        request domain-name-servers, domain-name;
};

id-assoc pd 0 {
  prefix-interface lo {
    sla-id 0;
  };
};

EOF
			json set network.$INTERFACE proto6=dhcp-ia_pd connectio6=up uptim6=$uptime ip6linkip=$ip6linkip ip6addr= gateway6= dns6=
			/usr/sbin/dhcp6c -c /var/dhcp6c_$INTERFACE.conf $debug_option -p /var/run/dhcp6c-$INTERFACE.pid $DEVICE
		;;
		dhcp-ia_na)
			cat > /var/dhcp6c_$INTERFACE.conf << EOF
interface $DEVICE {
        send ia-na 0;
        script "/etc/dhcp6/dhcp6c.script";
        request domain-name-servers, domain-name;
};

id-assoc na 0 {
};

EOF
			json set network.$INTERFACE proto6=dhcp-ia_na connectio6=up uptim6=$uptime ip6linkip=$ip6linkip ip6addr= gateway6= dns6=
			/usr/sbin/dhcp6c -c /var/dhcp6c_$INTERFACE.conf $debug_option -p /var/run/dhcp6c-$INTERFACE.pid $DEVICE
		;;
		dhcp-sla)
		config_get sla_wan $INTERFACE dhcp6_sla_wan
		wan_st=`json get network.$sla_wan.connectio6`
		wan_ip=`json get network.$sla_wan.ip6addr`
		iapd=`json get network.$sla_wan.iapd`
		if [ "$wan_st" != "up" -o -z "$wan_ip" -o -z "$iapd" ]; then
			lan_ip=`/usr/sbin/ip -6 addr show lan-$INTERFACE |grep global |sed -e "s/^.*inet6 //" -e "s/ scope.*\$//"`
			for ipa in $lan_ip ; do
				/usr/sbin/ip -6 addr del $ipa dev lan-$INTERFACE
			done
			json set network.$INTERFACE proto6=dhcp-sla connectio6=down uptim6=$uptime ip6linkip=$ip6linkip ip6addr= gateway6= dns6=
		else
			prelen=${iapd##*/}
			if [ "$prelen" -le 48 ]; then
				config_get sla_id $INTERFACE dhcp6_sla_id
				sla_id=$(($sla_id & 65535))
				ip6addr=`echo ${iapd%::*} | cut -d: -f1-3`
				tmp=`echo $ip6addr | tr ':' ' ' | wc -w`
				[ "$tmp" -lt 3 ] && ip6addr=${ip6addr}:
				sla_id=`printf "%x" $sla_id`
				ip6addr=${ip6addr}:${sla_id}
			elif [ "$prelen" -le 56 ]; then
				config_get sla_id $INTERFACE dhcp6_sla_id
				sla_id=$(($sla_id & 255))
				ip6addr=`echo ${iapd%::*} | cut -d: -f1-3`
				tmp=`echo $ip6addr | tr ':' ' ' | wc -w`
				if [ "$tmp" -lt 3 ]; then
					sla_id=`printf "%x" $sla_id`
					ip6addr=${ip6addr}::${sla_id}
				else
					sla_pre=`echo ${iapd%::*} | cut -d: -f4`
					sla_len=${#sla_pre}
					sla_len=$(($sla_len - 2))
					[ $sla_len -le 0 ] && sla_pre="" || sla_pre=`echo $sla_pre |cut -c1-$sla_len`
					sla_id=`printf "%02x" $sla_id`
					ip6addr=${ip6addr}:${sla_pre}${sla_id}
				fi
			else
				#added by Vincent F. 2012/08/10
				#if server already has site-local address(56~63 bit), do not set SLA ID.
				ip6addr=`echo ${iapd%::*} | cut -d: -f1-4`
			fi
			ip6addr=${ip6addr}:`echo $ip6linkip | cut -d: -f3-`
			/usr/sbin/ip -6 addr add $ip6addr dev $DEVICE

			#add LAN_2_WAN, set this 'cos sla cannot support load balance
			/usr/sbin/ip6tables -t mangle -N ${INTERFACE}_2_WAN
			/usr/sbin/ip6tables -t mangle -A LAN_2_WAN -i $DEVICE -j ${INTERFACE}_2_WAN
			tid=`/sbin/get_route_table_id $sla_wan`
			mark=`printf %x $tid`
			/usr/sbin/ip6tables -t mangle -A ${INTERFACE}_2_WAN -j MARK --set-mark 0x$mark/0xff
			json set network.$INTERFACE proto6=dhcp-sla connectio6=up uptim6=$uptime ip6linkip=$ip6linkip ip6addr=$ip6addr gateway6= dns6=
		fi
		;;
		*)
			json set network.$INTERFACE proto6=$proto6 connectio6=down uptim6=$uptime ip6linkip=$ip6linkip ip6addr= gateway6= dns6=
		;;
	esac

	#added by Vincent F. 2012/08/24
	#check LAN new ipv6 address to auto config dhcp6 server
	source /etc/dhcp6/dhcp6s_auto_cfg
	dhcp6s_auto_config $INTERFACE
else
	status=$(uci get network.$INTERFACE.status)
	if [ "$status" = "enable" ];then
		json set network.$INTERFACE connectio6=down uptim6=$uptime ip6addr= gateway6= dns6=
	fi
fi
