#!/bin/sh

# Source function library
. /etc/init.d/functions

PATH=/sbin:/bin:/usr/sbin:/usr/bin
DESC=udhcpc
DAEMON=udhcpc
IFACE=eth0
PIDFILE_BASE=/var/run/udhcpc
PIDFILE=${PIDFILE_BASE}.${IFACE}.pid

export PATH

if [ -e /etc/default/vlans ];then
	source /etc/default/vlans
fi;

if [ -e /etc/default/ppp ];then
	source /etc/default/ppp
	EXT_DHCP=${DHCP};
else
	ENABLE=0;
	EXT_DHCP="0";
fi;

if [ -e /etc/default/static ];then
	source /etc/default/static
else
	IPV6ULA=""
fi;

set -e

config_ipv6_rt() {
	if [ ! -d /proc/sys/net/ipv6/conf/${1} ];then
		return 0
	fi;

	if [ "${2}" == "1" ];then
		echo 1 >/proc/sys/net/ipv6/conf/${1}/forwarding
		if [ "${3}" == "1" ];then
			echo 2 >/proc/sys/net/ipv6/conf/${1}/accept_ra
			echo 1 >/proc/sys/net/ipv6/conf/${1}/accept_redirects
		else
			echo 1 >/proc/sys/net/ipv6/conf/${1}/accept_ra
			echo 0 >/proc/sys/net/ipv6/conf/${1}/accept_redirects
		fi
	else
		echo 0 >/proc/sys/net/ipv6/conf/${1}/forwarding
		echo 1 >/proc/sys/net/ipv6/conf/${1}/accept_ra
		echo 1 >/proc/sys/net/ipv6/conf/${1}/accept_redirects
	fi
	echo 0 >/proc/sys/net/ipv6/conf/${1}/accept_ra_from_local
	echo 1 >/proc/sys/net/ipv6/conf/${1}/accept_ra_defrtr
	echo 2 >/proc/sys/net/ipv6/conf/${1}/use_tempaddr
}

setul_ula_addr() {
	if [ ! "${2}" ];then
		return;
	fi

	if [[ "${2}" =~ .*":".* ]]; then
		if [  "${2:0:1}" == ":" ];then
			/sbin/ip addr add ${IPV6ULA}${2}/64 dev ${1} | :
		else
			/sbin/ip addr add ${IPV6ULA}:${2}/64 dev ${1} | :
		fi
	fi
}

configure_vlan() {
	if [ -e /etc/default/vlan_${1} ];then
		IPV6ADDR=""
		IPV6PREFIX=""
		IPV6ULANET=""
		source /etc/default/vlan_${1}
	else
		return 0;
	fi;

	if [ ! -d /sys/class/net/${IFACE}.${1} ];then
		/sbin/ip link add link ${IFACE} name ${IFACE}.${1} type vlan id ${1}
		/sbin/ip link set ${IFACE}.${1} up
	fi;

	if [ "${DHCP}" == "1" ] || [ "${2}" == "1" ];then
		start-stop-daemon --start -p ${PIDFILE_BASE}.${IFACE}_${1}.pid $DAEMON -- -R -b -p ${PIDFILE_BASE}.${IFACE}_${1}.pid -i ${IFACE}.${1}
	else
		interface=${IFACE}.${1} /etc/udhcpc.d/90comb-static renew | :
	fi;

	echo $((1024 + (2 * ${METRIC}))) >/proc/sys/net/ipv6/conf/${IFACE}.${1}/ra_defrtr_metric |:

	config_ipv6_rt ${IFACE}.${1} ${IPV6-0} ${IPV6RA-0} 0

	/sbin/ip -6 addr flush scope global dev ${IFACE}.${1}
	setul_ula_addr ${IFACE}.${1} ${IPV6ULANET}
	for ipaddr in ${IPV6ADDR};do
		/sbin/ip addr add ${ipaddr} dev ${IFACE}.${1} | :
	done
}

configure_lan() {
	if [ -e /etc/default/static ];then
		IPV6ADDR=""
		IPV6PREFIX=""
		IPV6ULANET=""
		source /etc/default/static
	else
		return 0;
	fi;

	config_ipv6_rt ${1} ${2} ${3} 0

	/sbin/ip -6 addr flush scope global dev ${1}
	setul_ula_addr ${1} ${IPV6ULANET}
	for ipaddr in ${IPV6ADDR};do
		/sbin/ip addr add ${ipaddr} dev ${1}
	done
}

case $1 in
	start)
		echo -n "Starting $DESC: "
		if [ "${ENABLE-0}" == "1" ] && [ ! "${VLAN}" ];then
			if [ "${DHCP-1}" == "1" ];then
				start-stop-daemon --start -p $PIDFILE $DAEMON -- -R -b -p /var/run/udhcpc.${IFACE}.pid -i ${IFACE}
			else
				interface=${IFACE} /etc/udhcpc.d/90comb-static renew | :
				interface=${IFACE} /etc/udhcpc.d/99kernel-pnp renew | :
			fi;
		else
			start-stop-daemon --start -p $PIDFILE $DAEMON -- -R -b -p /var/run/udhcpc.${IFACE}.pid -i ${IFACE}
		fi;

		configure_lan ${IFACE} ${IPV6-0} ${IPV6RA-0}

		if [ "${VLANS}" ];then
			for vlanid in ${VLANS};do
				if [ "${ENABLE}" == "1" ] && [ "${vlanid}" == "${VLAN}" ];then
					continue;
				fi;
				(configure_vlan ${vlanid})
			done;
			if [ "${ENABLE}" == "1" ] && [ "${VLAN}" ];then
				(configure_vlan ${VLAN} ${EXT_DHCP})
			fi;
		fi;
	;;
	stop)
		echo -n "Stopping $DESC: "
		if [ -e $PIDFILE ];then
			start-stop-daemon --stop -s SIGKILL -p $PIDFILE $DAEMON
			rm $PIDFILE
			ifconfig ${IFACE}:dhcp down >/dev/null 2>&1| :
			/sbin/ip -6 addr flush scope global dev ${IFACE} | :
		fi;
		if [ "${VLANS}" ];then
			for vlanid in ${VLANS};do
				if [ "${ENABLE}" == "1" ] && [ "${vlanid}" == "${VLAN}" ];then
					continue;
				fi;
				if [ -e ${PIDFILE_BASE}.${IFACE}_${vlanid}.pid ];then
					start-stop-daemon --stop -s SIGKILL -p ${PIDFILE_BASE}.${IFACE}_${vlanid}.pid
					rm ${PIDFILE_BASE}.${IFACE}_${vlanid}.pid
					ifconfig ${IFACE}.${vlanid}:dhcp down >/dev/null 2>&1| :
					/sbin/ip -6 addr flush scope global dev ${IFACE}.${vlanid} | :
				fi;
			done;
			if [ "${ENABLE}" == "1" ] && [ "${VLAN}" ] && [ -e ${PIDFILE_BASE}.${IFACE}_${VLAN}.pid ];then
				start-stop-daemon --stop -s SIGKILL -p ${PIDFILE_BASE}.${IFACE}_${VLAN}.pid
				rm ${PIDFILE_BASE}.${IFACE}_${VLAN}.pid
				ifconfig ${IFACE}.${VLAN}:dhcp down >/dev/null 2>&1| :
				/sbin/ip -6 addr flush scope global dev ${IFACE}.${VLAN} | :
			fi;
		fi;
	;;
	restart|force-reload)
		$0 stop
		sleep 1
		$0 start
	;;
	vlan)
		if [ -e ${PIDFILE_BASE}.${IFACE}_${2}.pid ];then
			start-stop-daemon --stop -s SIGKILL -p ${PIDFILE_BASE}.${IFACE}_${2}.pid
			rm ${PIDFILE_BASE}.${IFACE}_${2}.pid
			/sbin/ip -6 addr flush scope global dev ${IFACE}.${2} | :
			/sbin/ip -4 addr flush scope global dev ${IFACE}.${2} | :
		fi;
		if [ "${ENABLE}" == "1" ] && [ "${VLAN}" == "${2}" ];then
			(configure_vlan ${VLAN} ${EXT_DHCP})
		else
			(configure_vlan ${2})
		fi;
	;;
	status)
		status ${DAEMON} || exit $?
	;;
	*)
		N=/etc/init.d/udhcpc
		echo "Usage: $N {start|stop|restart|force-reload|status|vlan <id>}" >&2
		exit 1
	;;
esac

exit 0
