#!/bin/sh /etc/rc.common

. /etc/net6conf/6data.conf

export w6_type="$wan6_type"

outfile=/tmp/ipv6_auto_output
if [ "$wan6_type" = "autoDetect" ]; then
	case `cat ${outfile}` in
		"6to4 Tunnel")
			export w6_type="6to4"
		;;
		"6rd Tunnel")
			export w6_type="6rd"
		;;
		"DHCP")
			export w6_type="dhcp"
		;;
		"Auto Config")
		        export w6_type="autoConfig"
		;;							
		"Pass Through")
			export w6_type="bridge"
		;;
		*)
		;;
	esac
else
	export w6_type="$wan6_type"
fi

radvd_write_config() {
	local DHCPS_ENABLE=$1
	local PREFIX=$2
	local PRELEN=$3
	local VALID_TIME=$4
	local PREFER_TIME=$5
	local DNS=$6
	local IPV6_ADDR
	local PD_INFO
	local OLD_PREFIX
	local OLD_PRELEN
	local OLD_PD_INFO

	wan_type=`$CONFIG get wan_proto`
	if [ "x$wan_type" = "xpppoe" ]; then
		wan_mtu=`$CONFIG get wan_pppoe_mtu`
	elif [ "x$wan_type" = "xl2tp" ]; then 
		wan_mtu=`$CONFIG get wan_l2tp_mtu`
	elif [ "x$wan_type" = "xpptp" ]; then
		wan_mtu=`$CONFIG get wan_pptp_mtu`
	elif [ "x$wan_type" = "xmulpppoe1" ]; then
		wan_mtu=`$CONFIG get wan_mulpppoe_mtu`
	else
		if [ "x$w6_type" = "xpppoe" ];then
			dhcp_mtu=`$CONFIG get wan_dhcp_mtu`
			wan_mtu=$(($dhcp_mtu - 8))
		else
			wan_mtu=`$CONFIG get wan_dhcp_mtu`
		fi
	fi

	#for 6to4 and 6rd, the header still have ipv4  
	if [ "x$w6_type" = "x6rd" -o "x$w6_type" = "x6to4" ];then
		wan_mtu=$(($wan_mtu - 20))
	fi


	printf 'interface %s {\n' "$bridge"
	printf '\tAdvSendAdvert on;\n'
	printf '\tIgnoreIfMissing on;\n'
	printf '\tAdvCurHopLimit 64;\n'
	printf '\tMinRtrAdvInterval 198;\n'
	printf '\tMaxRtrAdvInterval 600;\n'
	printf '\tAdvOtherConfigFlag on;\n'
	printf '\tAdvDefaultLifetime 1800;\n'
	printf '\tAdvReachableTime 0;\n'
	printf '\tAdvRetransTimer 0;\n'
	printf '\tAdvDefaultPreference low;\n'
	printf '\tAdvHomeAgentFlag off;\n'
	printf '\tAdvLinkMTU %s;\n' "$wan_mtu"
	if [ "$DHCPS_ENABLE" = "0" ]; then
		printf '\tAdvManagedFlag off;\n'
	else
		printf '\tAdvManagedFlag on;\n'
	fi

	if [ "x$PREFIX" != "x" -a "x$PRELEN" != "x" -a "x$DHCPS_ENABLE" = "x0" ]; then
		printf '\tprefix %s/%s {\n' "$PREFIX" "$PRELEN"
		printf '\t\tAdvOnLink on;\n'
		if [ "$DHCPS_ENABLE" = "0" ]; then
			printf '\t\tAdvAutonomous on;\n'
		else
			printf '\t\tAdvAutonomous off;\n'
		fi

		if [ "x$w6_type" = "xdhcp" -o "x$w6_type" = "xpppoe" -o "x$w6_type" = "xautoConfig" -o "x$w6_type" = "xdslite" -o "x$w6_type" = "xv6plus" -o "x`$CONFIG get enable_ds`" = "x1" ]; then
			printf '\t\tAdvValidLifetime %s;\n' "$VALID_TIME"
			printf '\t\tAdvPreferredLifetime %s;\n' "$PREFER_TIME"
		else
			printf '\t\tAdvValidLifetime 2400;\n'
			printf '\t\tAdvPreferredLifetime 1800;\n'
			VALID_TIME=2400
			PREFER_TIME=1800
		fi
		printf '\t};\n'

		# To fix Bug 24414 [IPv6-Auto Config] When the LAN prefix is changed, an implementation MUST 
		# send out MAX_FINAL_RTR_ADVERTISEMENTS Router Advertisements.
		# Here we write old pd info to radvd.conf.
		PD_INFO=$VALID_TIME" "$PREFER_TIME" "$PREFIX" "$PRELEN
		[ -s $OLD_PD ] && OLD_PD_INFO="`cat $OLD_PD`"
		OLD_PREFIX=`$ECHO "$OLD_PD_INFO" | awk '{print $3}'`
		OLD_PRELEN=`$ECHO "$OLD_PD_INFO" | awk '{print $4}'`
		if [ "x$OLD_PD_INFO" != "x" -a "${OLD_PREFIX}${OLD_PRELEN}" != "${PREFIX}${PRELEN}" ]; then
			# Sanity check the prefix_len
			if [ "$OLD_PRELEN" -ge "0" ] && [ "$OLD_PRELEN" -le "128" ]; then
				printf '\tprefix %s/%s {\n' "$OLD_PREFIX" "$OLD_PRELEN"
				printf '\t\tAdvOnLink off;\n'
				printf '\t\tAdvAutonomous on;\n'
				printf '\t\tAdvValidLifetime 0;\n'
				printf '\t\tAdvPreferredLifetime 0;\n'
				printf '\t};\n'
			fi
		fi
		$ECHO $PD_INFO >$OLD_PD
	fi
	# To fix bug 22829,spec 2.0: The router's Auto Config function on the LAN has to include the RDNSS option in the RA's and it
	# uses the router's unicast link-local IPv6 address as the recursive DNS server.
	IPV6_ADDR=$(/sbin/ifconfig $bridge | grep 'Scope:Link' | awk -F/ '{print$1}' | awk -F'inet6 addr:' '{print$2}');
	printf '\tRDNSS %s {\n' "$IPV6_ADDR"
	printf '\t\tAdvRDNSSPreference 8;\n'
	printf '\t\tAdvRDNSSLifetime 1200;\n'
	printf '\t};\n'
	printf '};\n'
}

dhcp6s_write_config() {
	local lease_time=$1
	local pre_time=$4
	local prefix=$2
	local prelen=$3
	local pd_info
	local old_pd_info
	local old_prefix
	local old_prelen

	local br6localaddr=`ifconfig $bridge |grep "inet6" |grep "Link" |awk '{print $3}' | cut -f1 -d'/'`
	printf 'option domain-name-servers %s;\n' "$br6localaddr"

	if [ -e $DHCP6S_DSN ]; then
		local line
		while read line; do
			printf '%s\n' "$line"
		done < $DHCP6S_DSN
	fi

	if [ "$lease_time" -gt "0" ]; then
		printf 'interface %s {\n' "$bridge"
		printf '\tallow rapid-commit;\n'
		printf '\taddress-pool pool_netgear %s %s;\n' "$pre_time" "$lease_time"
		printf '};\n'
		printf 'pool pool_netgear {\n'
		printf '\trange %s2 to %s40;\n' "$prefix" "$prefix"
		printf '};\n'
		pd_info=$lease_time" "$pre_time" "$prefix" "$prelen
		[ -s $OLD_IPV6_PD ] && old_pd_info="`cat $OLD_IPV6_PD`"
		old_prefix=`echo "$old_pd_info" | awk '{print $3}'`
		old_prelen=`echo "$old_pd_info" | awk '{print $4}'`
		if [ -s $OLD_IPV6_PD ] && [ "${old_prefix}${old_prelen}" != "${prefix}${prelen}" ]; then
			new_pd=1
		fi
		echo $pd_info > $OLD_IPV6_PD
	fi
}

#I just to check prefix+eui64, not IA_NA v6 address
generate_ndproxy_prefix()  {
	local v6addr=$(/sbin/ifconfig $WAN | awk '/Scope:Global/{print $3}')
	local wan_prefix_org=$(6rdcalc "$v6addr" "0.0.0.0/32")
	local wan_prefix=${wan_prefix_org%%::/*}
	local wan_prefix_len=${wan_prefix_org##*/}
	local lan_prefix=`expr $wan_prefix_len + 16`
	
	printf "$DHCP6S_DEFAULT_TIME  $DHCP6S_PREFER_TIME  %s  %s" $wan_prefix:1:: $lan_prefix
}

generate_mape_lan_prefix()  {
   local mape_wan_prefix_len=$(/sbin/ifconfig $WAN | awk '/Scope:Global/{print $3}' | awk -F / '{print $2}' | head -n 1)
   local mape_wan_prefix=$(/sbin/ifconfig $WAN | awk '/Scope:Global/{print $3}' | awk -F / '{print $1}' | head -n 1)
   mape_wan_prefix=$(6rdcalc "$mape_wan_prefix/$mape_wan_prefix_len" "0.0.0.0/32")
   local mape_prefix_for_lan=${mape_wan_prefix%%::/*}
   local mape_prefix_len_for_lan=${mape_wan_prefix##*/}
   mape_prefix_for_lan="$mape_prefix_for_lan:1::"
   mape_prefix_len_for_lan=`expr $mape_prefix_len_for_lan + 16`

   printf "$DHCP6S_DEFAULT_TIME  $DHCP6S_PREFER_TIME  %s  %s" $mape_prefix_for_lan $mape_prefix_len_for_lan
}

get_prefix_dhcp() {
	local wait_time="5"
	while [ "$wait_time" -gt "0" ]; do
		sleep 1
		# file $DHCPS_PD store the ipv6 prefix from upper dhcpv6 server with 3 field 
		# "lease_time	prefix	prefix_len"
		# Spec Rev.10 P337,the subnet prefix of the router's LAN is unknown until the IPv6 WAN connection is brought up successfully.
		local wan6_ip=`ifconfig $WAN |grep "inet6 addr" |grep -v "Link" |awk '{print $3}'`
		if [ "x$w6_type" != "xdhcp" ] || [ -e $SRVC_RELOAD_FILE ] || [ "x$wan6_ip" != "x" ]; then
			[ -s $DHCP6S_PD ] && cat $DHCP6S_PD && return 0
		fi

		wait_time=$(( $wait_time - 1 ))
	done

	# Can't get the IPv6 Prefix
	printf ""
	return 1
}

get_prefix_6to4() {
	local localip4=`ifconfig $WAN4 |grep "inet addr" |cut -f2 -d: |cut -f1 -d' '`
	# print the prefix, with 3 field
	# "lease_time	prefix	prefix_len"
	if [ "x$localip4" != "x" ]; then
		printf "$DHCP6S_DEFAULT_TIME	$DHCP6S_PREFER_TIME	2002:%02x%02x:%02x%02x:$IPV6_SIDE_ID::	64" `$ECHO $localip4 | sed 's/\./ /g'`
	fi
}

get_prefix_fixed() {
	local lanip6=`$CONFIG get ipv6_fixed_lan_ip`
	local prelen=`$CONFIG get ipv6_fixed_lan_prefix_len`
	local prefix=$(6rdcalc "$lanip6/$prelen" "0.0.0.0/32")
	local prefix_fixed=${prefix%%/*}

	printf "$DHCP6S_DEFAULT_TIME  $DHCP6S_PREFER_TIME  %s  %s" $prefix_fixed $prelen
}

get_prefix_6rd() {
	local prefix=`$CONFIG get ipv6_6rd_prefix`
	local prelen=`$CONFIG get ipv6_6rd_prelen`

	printf "$DHCP6S_DEFAULT_TIME  $DHCP6S_PREFER_TIME  %s  %s" $prefix $prelen
}

get_prefix() {
	local prefix
	case "$w6_type" in
	dhcp) prefix=`get_prefix_dhcp`
	;;
	6to4) prefix=`get_prefix_6to4`
	;;
	fixed) prefix=`get_prefix_fixed`
	;;
	6rd) prefix=`get_prefix_6rd`
	;;
	pppoe) prefix=`get_prefix_dhcp`
	;;
	autoConfig | dslite | v6plus) prefix=`get_prefix_dhcp`
	;;
	*) ;;
	esac

    if [ "x$w6_type" = "xdslite" -o "x`$CONFIG get enable_ds`" = "x1" ] && [ "x`$CONFIG get enable_nd`" = "x1" ]; then
         prefix=`generate_ndproxy_prefix`
        #$CONFIG set ndproxy_enable=1
	elif [ "x$w6_type" = "xv6plus" ]; then
		resolveip -t 1 ntt.setup >/dev/null
		local have_ntt_hgw=$?
		local mape_get_addr=$(/sbin/ifconfig $WAN | awk '/Scope:Global/{print $3}')
		if [ "$have_ntt_hgw" = "0" ]; then
			[ -n "$prefix" ] && JP_HIKARI= || JP_HIKARI=0
		elif [ -n "$prefix" ]; then
			JP_HIKARI=1
		elif [ -n "$mape_get_addr" ]; then
			JP_HIKARI=0
		fi
		if [ $JP_HIKARI -eq 0 ]; then
			[ -z "$prefix" ] && {
				prefix=`generate_mape_lan_prefix`
			}
		elif [ $JP_HIKARI -eq 1 ]; then
			if [ -n "$prefix" ]; then
				local map_wan_prefix=`echo "$prefix" | awk '{print $3}'`
				local map_wan_prefix_len=`echo "$prefix" | awk '{print $4}'`
				local map_wanlinkip=$(ifconfig $WAN | grep "fe80" | awk '{print $3}' | awk -F/ '{print $1}')
				local map_eui64=$(geteui64 $map_wanlinkip)
				if [ $map_wan_prefix_len -lt 64 ]; then
					local glip=`generate_ipv6_lan_ip $map_wan_prefix $map_eui64 64`
					$IP -6 addr add $glip/64 dev $WAN
				else
					local glip=`generate_ipv6_lan_ip $map_wan_prefix $map_eui64 $map_wan_prefix_len`
					$IP -6 addr add $glip/$map_wan_prefix_len dev $WAN
				fi
				prefix=`generate_mape_lan_prefix`
			fi
		fi
    fi
 
	printf "$prefix"
}

get_dns() {
	local dns
	if [ -e $IPV6_DNS ]; then
		dns=`cat $IPV6_DNS | awk '{print $2 }'`
		dns=`$ECHO $dns`
	fi

	printf "$dns"
}

format_prefix_mask() {
	local prefix=$1
	local prelen=$2
	local fields=$(($prelen / 16))
	local modfld=$(($prelen % 16))

	local i=1
	while [ "$i" -le "$fields" ]
	do
		printf "FFFF:"
		i=$(($i + 1))
	done

	if [ "$modfld" != "0" ]; then
		local len_val=$(((1 << $modfld) - 1))
		printf "%x::\n" $(($len_val << (16 - $modfld)))
	else
		printf ":\n"
	fi
}

generate_ipv6_lan_ip()
{
	local prefix=$1
	local eui64=$2
	local p_len=$3

	local num=$(((128 - $p_len) / 16))
	local eui1=`$ECHO $eui64 | cut -f1 -d:`
	local eui2=`$ECHO $eui64 | cut -f2 -d:`
	local eui3=`$ECHO $eui64 | cut -f3 -d:`
	local eui4=`$ECHO $eui64 | cut -f4 -d:`

	if [ "$num" -gt "4" ]; then
		printf '%s%s' $prefix $eui64
		return
	else
		local num1=`$ECHO -n $prefix | sed 's/[^:]//g' | wc -c`
		local p_num=$(($p_len / 16))
		if [ "$num1" -gt "$p_num" ]; then
			prefix=`$ECHO -n $prefix | sed 's/::/:/g'`
		fi
	fi

	case $num in
		1)
		printf '%s%s' $prefix $eui4
		;;
		2)
		printf '%s%s:%s' $prefix $eui3 $eui4
		;;
		3)
		printf '%s%s:%s:%s' $prefix $eui2 $eui3 $eui4
		;;
		4)
		printf '%s%s' $prefix $eui64
		;;
		*)
		;;
	esac
}

write_config() {
	local DHCP6S_ENABLE=`$CONFIG get ipv6_dhcps_enable`
	local prefixinfo=`get_prefix`
	local rdns=`get_dns`

	if [ "x$prefixinfo" = "x" -a "x$w6_type" = "xdhcp" -a -s $DHCP6S_PD ]; then
		prefixinfo=`get_prefix`
	fi

	#default the prefix netmask file.
	$CONFIG set ipv6_rule_prefix=NULL
	$CONFIG set ipv6_rule_premask=NULL

	if [ "x$prefixinfo" = "x" ]; then
		$ECHO "6service: Wait timeout and can't get IPv6 Prefix"
		$ECHO "          The prefix information for LAN host is unkown"

		# Write Config File
		radvd_write_config "$DHCP6S_ENABLE" "" "" "" "" "$rdns" > $RADVD_CONF
		dhcp6s_write_config "" "" "" "" > $DHCP6S_CONF
	else
		$ECHO "6service: Got the IPv6 Prefix" > /dev/console
		# Get valid_lifetime, prefer lifetime,prefix and prefix_len
		local lease_time=`$ECHO "$prefixinfo" | awk '{print $1}'`
		local prefer_time=`$ECHO "$prefixinfo" | awk '{print $2}'`
		local prefix=`$ECHO "$prefixinfo" | awk '{print $3}'`
		local prefix_len=`$ECHO "$prefixinfo" | awk '{print $4}'`
		local prefixmask=`format_prefix_mask "$prefix" "64"`
		$CONFIG set ipv6_rule_prefix=$prefix
		$CONFIG set ipv6_rule_premask=$prefixmask

		# Write Config File
		if [ "x$prefix_len" = "x0" ] || [ "$prefix_len" -gt "64" ]; then
			radvd_write_config "$DHCP6S_ENABLE" "" "" "" "" "$rdns" > $RADVD_CONF
		else
			radvd_write_config "$DHCP6S_ENABLE" "$prefix" "64" "$lease_time" "$prefer_time" "$rdns" > $RADVD_CONF
		fi
		dhcp6s_write_config "$lease_time" "$prefix" "$prefix_len" "$prefer_time" > $DHCP6S_CONF
		# NOTE, Only when WAN Connection Type is DHCP, PPPoE or AutoConf, set the LAN IPv6
		if [ "$w6_type" = "dhcp" -o "$w6_type" = "pppoe" -o "$w6_type" = "autoConfig" -o "$w6_type" = "dslite" -o "$w6_type" = "v6plus" -o "x`$CONFIG get enable_ds`" = "x1" ]; then
			local lan_prefix=$prefix
			local lanlinkip=$(ifconfig $bridge | grep "fe80" | awk '{print $3}' | awk -F/ '{print $1}')
			local eui64=$(geteui64 $lanlinkip)
			if [ $prefix_len -lt 64 ]; then
				local glip=`generate_ipv6_lan_ip $lan_prefix $eui64 64`
				$IP -6 addr add $glip/64 dev $bridge
			else
				local glip=`generate_ipv6_lan_ip $lan_prefix $eui64 $prefix_len`
				$IP -6 addr add $glip/$prefix_len dev $bridge
			fi
		fi
		start_guest_lanrestrict
		/etc/init.d/ndppd.init stop
		/etc/init.d/ndppd.init start
	fi
}

start_radvd() {
	# Wait for a few second to let kernel enable addr,so that the sock of radvd can up completely.This fix bug35529. 
	if [ "x$w6_type" = "xfixed" ] || [ "x$w6_type" = "x6to4" ]; then
		sleep 2
	fi
	# Start RA
	/usr/sbin/radvd -C $RADVD_CONF
}

stop_radvd() {
	killall radvd
}

switch_port_power_off()
{
	local eth_handle_path=$(which eth_handle)
	if [ -n "$eth_handle_path" ]; then
		$eth_handle_path restart 6
	else
		$ECHO -n 3 > /proc/switch_phy
	fi
}

start_dhcp6s() {
	local DHCP6S_ENABLE=`$CONFIG get ipv6_dhcps_enable`
	local OLD_DHCP6S_ENABLE=`$CONFIG get old_ipv6_dhcps_enable`
	$ECHO "start dhcp6s"
	if [ "x$DHCP6S_ENABLE" = "x1" ]; then
		/usr/sbin/dhcp6s -3 -c "$DHCP6S_CONF" "$bridge"
	else
		/usr/sbin/dhcp6s -3 -c "$DHCP6S_CONF" -i "$bridge"
	fi

	if [ "x$OLD_DHCP6S_ENABLE" = "x" ]; then
		$CONFIG set "old_ipv6_dhcps_enable=$DHCP6S_ENABLE"
	fi

	# SPEC DHCPV6 SERVER:
	# (8)	When the DHCP server function is changed from enabled to disabled or from disabled to enabled,
	#	an implementation MUST pull-down the Ethernet PHY of LAN for 3 seconds and pull it back to high.
	#	This is to force LAN PC's to re-acquire their IPv6 assignments.
	if [ -s $OLD_IPV6_PD -a "x$DHCP6S_ENABLE" != "x$OLD_DHCP6S_ENABLE" ] || [ "$new_pd" = "1" -a "x$DHCP6S_ENABLE" = "x1" ]; then
		switch_port_power_off
		if [ "x$DHCP6S_ENABLE" != "x$OLD_DHCP6S_ENABLE" ]; then
			$CONFIG set "old_ipv6_dhcps_enable=$DHCP6S_ENABLE"
		fi
	fi
}

stop_dhcp6s() {
	killall dhcp6s
}

start_dslite() {
	/etc/net6conf/dslite run &
}

stop_dslite() {
	/etc/net6conf/dslite stop
	/etc/init.d/ndppd.init stop
}

start_mape() {
	/etc/net6conf/v6plus_client start &
}

stop_mape() {
	/etc/net6conf/v6plus_client stop
}

start() {
	local old_pd_info
	[ -s $OLD_IPV6_PD ] && old_pd_info="`cat $OLD_IPV6_PD`"

	# If IPv6 WAN Connection Type is PassThrough, do not need start service
	if [ "$w6_type" = "bridge" ]; then
		if [ "x$old_pd_info" != "xbridge" ]; then
			switch_port_power_off
			echo "bridge" > $OLD_IPV6_PD
			return
		else
			echo "bridge" > $OLD_IPV6_PD
			return
		fi
	fi

	#First to create ipip6 tunnel and then to start Lan IPv6 services
	start_dslite
	
	start_mape

	write_config

	start_radvd

	start_dhcp6s

	# According to NTGR request,
	# dhcp/autoconf/autodect/6to4/6rd/fixed/pppoe should has option for
	# ripng, quagga script will check config "ipv6_ripng"
	local logo_test=`$CONFIG get endis_ipv6_logo_test`
	if [ "x`$CONFIG get ipv6_ripng`" != "x" ]; then
		if [ "x$w6_type" != "xbridge" -a "x$w6_type" != "xdisabled" -a "x$w6_type" != "xdslite" -a "x$w6_type" != "xv6plus" -a "x`$CONFIG get enable_ds`" != "x1" ] || [ "x$w6_type" = "xfixed" -a "x$logo_test" != "x1" ]; then
			/etc/init.d/quagga restart ripngd
		else
			/etc/init.d/quagga stop ripngd
		fi
	else
		if [ "x$w6_type" != "xbridge" -a "x$w6_type" != "xdisabled" -a "x$w6_type" != "xdslite" -a "x$w6_type" != "xv6plus" -a "x`$CONFIG get enable_ds`" != "x1" ] || [ "x$w6_type" = "xfixed" -a "x$logo_test" != "x1" ]; then
			/etc/init.d/ripngd restart
			/etc/init.d/zebra restart
		else
			/etc/init.d/zebra stop
			/etc/init.d/ripngd stop
		fi
	fi
}

stop() {
	stop_dslite
	stop_mape
	stop_radvd
	stop_dhcp6s
	if [ "x`$CONFIG get ipv6_ripng`" != "x" ]; then
		/etc/init.d/quagga stop ripngd
	else
		/etc/init.d/zebra stop
		/etc/init.d/ripngd stop
	fi
}

restart() {
	stop
	start
}

reload() {
	PID_file=/var/run/6service.pid
	test -f $PID_file && {
		kill $(cat $PID_file)
		$ECHO "stop previous service reload process"
	}
	$ECHO "$$" > $PID_file

	touch $SRVC_RELOAD_FILE

	stop_dslite
	start_dslite

	write_config

	#make dhcpv6 server apply the new config file
	$ECHO "6service reload now"
	/usr/sbin/dhcp6ctl -S reload
	#make radvd apply the new config file
	killall -SIGHUP radvd

	if [ "x`$CONFIG get ipv6_dhcps_enable`" = "x1" ]; then
		# lease changed, pull low LAN port for 3 seconds to force LAN PC's to re-acquire their IPv6 assignments
		switch_port_power_off
	fi

	##Workaround for RAX-114 comcast issue 6&8:radvd always start fail during boot up
	local cnt
	for cnt in `seq 1 5`
	do
		if [ "x`ps |grep radvd|grep -v grep`" = "x" ]; then
			start_radvd
			[ $cnt -lt 5 ] && sleep 2
		else
			break
		fi
	done

	rm -f $SRVC_RELOAD_FILE
	rm -f $PID_file

	#Wait 2s to write new prefix value to config by 6service reload
	sleep 2
	/usr/sbin/net-wall -6 restart > /dev/console
}

case "$1" in
	start)
	lock
	start
	unlock
	;;
	stop)
	lock
	stop
	unlock
	;;
	restart)
	lock
	restart
	unlock
	;;
	reload)
	lock
	reload
	unlock
	;;
esac
