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

debug_option="-D"

#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 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
			[ -z "$ip6addr" -o -z "$ip6length" ] || ip -6 addr add $ip6addr/$ip6length dev $DEVICE
			[ -z "$gateway6" ] || ip -6 route add 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 ip6linkip=$ip6linkip ip6addr=$ip6addr gateway6=$gateway6 dns6=$dns6
		;;
		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 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 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
		iapd=`json get network.$sla_wan.iapd`
		[ -z "$iapd" ] || {
			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
		}
		json set network.$INTERFACE proto6=dhcp-sla ip6linkip=$ip6linkip ip6addr=$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
fi
