#!/bin/sh
#	@author Forrest Lin
#	@date	2013/01/24
#	@brief
#		Callback example for IPC DHCP of NDIS hosted dongle
#

NET_IF=ccmni1
CFG_FILE=/tmp/ipc_dhcp.cfg
V4CONF_FILE=/tmp/dhcpd-$NET_IF.conf
V6CONF_FILE=/tmp/dhcp6s-$NET_IF.conf
IpcDhcp4Renewal=8
IpcDhcp4Rebind=16
IpcDhcp4Lease=32

source $CFG_FILE
eval `sncfg mget IpcDhcp4Renewal IpcDhcp4Rebind IpcDhcp4Lease`

#
# IPv4 
# It is expected that invoke twice to start dhcpd under v4/v6 fallback scenario
#
if [ "$IPv4Avaliable" == "0" ] || [ "$IPv4AddrCount" == "0" ] ; then
 	#
 	# Shutdown dhcpd
 	# 
 	ifconfig $NET_IF 0.0.0.0
 	iptables -t nat -F PREROUTING
 	killall udhcpd
 	rm -f /var/run/dhcpd-$NET_IF.leases
 	rm -f /var/run/dhcpd-$NET_IF.pid
else
	#
	# Shutdown dhcpd if it is already existed
	#
	if [ -e /var/run/dhcpd-$NET_IF.pid ] ; then
	 	iptables -t nat -F PREROUTING
 		killall udhcpd
 		rm -f /var/run/dhcpd-$NET_IF.leases
 		rm -f /var/run/dhcpd-$NET_IF.pid
	fi	
	#
	# Generate dhcpd configuration
	#
	[ -z "$IPv4Gateway" ] && IPv4Gateway="169.254.62.80"
	echo "interface $NET_IF" > $V4CONF_FILE
	for addr in $IPv4Addr ; do
		eval `ipcalc -m $addr`
		NETWORK=`echo $addr | cut -d "/" -f 1`
		echo "start $NETWORK" >> $V4CONF_FILE
		echo "end $NETWORK" >> $V4CONF_FILE
		echo "opt subnet $NETMASK" >> $V4CONF_FILE
		break
	done
	echo "opt router $IPv4Gateway" >> $V4CONF_FILE
	echo "opt renewal $IpcDhcp4Renewal" >> $V4CONF_FILE
	echo "opt rebind $IpcDhcp4Rebind" >> $V4CONF_FILE
	echo "opt lease $IpcDhcp4Lease" >> $V4CONF_FILE
	for dnssrv in $IPv4DnsSrv ; do
		echo "opt dns $dnssrv" >> $V4CONF_FILE
	done
	[ -n "$IPv4Mtu" ] && echo "opt mtu $IPv4Mtu" >> $V4CONF_FILE
	echo "opt_vendor msmetric 3 4 30" >> $V4CONF_FILE
	echo "min_lease 8" >> $V4CONF_FILE
	echo "arp_timeout 0" >> $V4CONF_FILE
	echo "pidfile /var/run/dhcpd-$NET_IF.pid" >> $V4CONF_FILE
	echo "lease_file /var/run/dhcpd-$NET_IF.leases" >> $V4CONF_FILE
	
	#
	# Re-configure CCMNIx
	#
	iptables -t nat -A PREROUTING -i $NET_IF -p udp --dport 67 -j DNAT --to-destination 255.255.255.255
	ifconfig $NET_IF $IPv4Gateway netmask $NETMASK
	
	#
	# Start dhcpd
	#
	udhcpd -f -vv $V4CONF_FILE &
fi

#
# IPv6
# It is expected that invoke twice to start dhcp6s under v4/v6 fallback scenario
#
if [ "$IPv6Avaliable" == "0" ] || [ "$IPv6DnsSrvCount" == "0" ] ; then
	#
	# Shutdown dhcp6s
	# 
	killall dhcp6s
	rm -f /var/run/dhcp6s-$NET_IF.pid
else
	#
	# Shutdown dhcp6s if it is already existed
	#	
	if [ ! -e /var/run/dhcp6s-$NET_IF.pid ] ; then
		killall dhcp6s
		rm -f /var/run/dhcp6s-$NET_IF.pid
	fi
	#
	# Generate dhcp6s configuration
	#
	echo "option refreshtime 2147483647 ;" > $V6CONF_FILE
	for dnssrv in $IPv6DnsSrv ; do
		echo "option domain-name-servers $dnssrv ;" >> $V6CONF_FILE
	done

	#
	# Re-configure CCMNIx
	#
	ifconfig $NET_IF up

	#
	# Start dhcp6s
	#
	dhcp6s -P /var/run/dhcp6s-$NET_IF.pid -c $V6CONF_FILE -dDf $NET_IF &
fi

exit 0
