#!/bin/sh
#
# Start the network....

SD_MNT=/media/mmcblk0p1
QSPIRFS="mtd:qspi-rootfs /"

RUNNINGAPPSDIR=/ross/app/bin
RUNNINGAPPSDIRCONFIGPATH=/ross/etc/runningAppsPath

if [ -f "$RUNNINGAPPSDIRCONFIGPATH" ]; then
	RADPATH=$(cat $RUNNINGAPPSDIRCONFIGPATH)
	if [ -d "$RADPATH" ]; then
		RUNNINGAPPSDIR=$RADPATH
	fi
fi

error() {
	echo "$1"
	exit
}

enable_public_ip() {
	echo -n "Enabling public IP..."
	if test "$USE_DHCP" = 1 ; then
		echo "DHCP Enabled"
		# Attempt to get IP via DHCP with a 5-second timeout and 2 retries
		udhcpc -b -i eth0 -T 5 -t 2

		# Check if IP address was assigned
		IP_ADDRESS=$(ip addr show eth0 | grep 'inet ' | awk '{print $2}')

		if [ -z "$IP_ADDRESS" ]; then
			echo "No IP address assigned, setting up static IP..."
			setup_static_ip
		else
			echo "DHCP succeeded, IP assigned: $IP_ADDRESS"
		fi
	else
		echo "DHCP disabled ... setting up static IP ..."
		setup_static_ip
	fi
	echo "OK"
}

setup_static_ip() {
	test "$IPADDR" || IPADDR=192.168.20.140
	test "$NETMASK" || NETMASK=255.255.255.0
	test "$GATEWAY" || GATEWAY=192.168.20.1

	eval `ipcalc -n -p -b $IPADDR $NETMASK`

	#echo "ip address" $IPADDR
	#echo "netmask" $NETMASK
	#echo "gateway" $GATEWAY
	#echo "broadcast" $BROADCAST
	#echo "network" $NETWORK
	#echo "prefix" $PREFIX

	ifconfig eth0 $IPADDR netmask $NETMASK broadcast $BROADCAST up
	# flush route table
	ip route flush table main
	route add -net $NETWORK/$PREFIX dev eth0
	if test "$GATEWAY" -a "$GATEWAY" != "0.0.0.0" ; then
		route add default gw $GATEWAY
	fi
	route add -net 224.0.0.0/4 dev eth0

	if ! pidof lcdcontroller > /dev/null ; then
		"$RUNNINGAPPSDIR"/lcdcontroller -m "$IPADDR" -c FFFFFF
	fi
}

start() {
	echo "Starting network..."

	NETCONF=/ross/etc/network.conf
	# If RFS is SD, use network.conf in SD card. For
	# compatibility with Rev2 FR12, check RFS mount
	# in /proc/mounts
	is_qspiboot=$(grep $QSPIRFS /proc/mounts)
	if [[ -z "$is_qspiboot" ]]; then
		if test -e $SD_MNT/network.conf; then
			NETCONF=$SD_MNT/network.conf
		fi
	fi

	if test -e $NETCONF; then
		source $NETCONF
	fi

	# Default to use DHCP
	test "$USE_DHCP" || USE_DHCP=1

	enable_public_ip

	INTERNAL_NET_IFACE=eth0.1

	echo "Setting up internal network $INTERNAL_NET_IFACE"
	ip link add link eth0 name $INTERNAL_NET_IFACE type vlan id 1
	ip addr add 192.168.12.1/24 brd + dev $INTERNAL_NET_IFACE
	ip link set dev $INTERNAL_NET_IFACE qlen 2000
	ip link set dev $INTERNAL_NET_IFACE mtu 1500
	ip link set $INTERNAL_NET_IFACE up

	# set tcp keepalive timeout to 15 minutes + retries
	echo 900 > /proc/sys/net/ipv4/tcp_keepalive_time
	echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl
	echo 5 > /proc/sys/net/ipv4/tcp_keepalive_probes

	echo "OK"
	echo -n "`cut -f1 -d. /proc/uptime`" > /tmp/boottime-network
}
stop() {
	echo -n "Stopping network..."
	pid=`pidof udhcpc`
	test "$pid" && kill $pid
	echo "OK"
}
restart() {
	stop
	start
}

case "$1" in
  start)
	start
	;;
  stop)
	stop
	;;
  restart|reload)
	restart
	;;
  *)
	echo $"Usage: $0 {start|stop|restart}"
	exit 1
esac

exit $?
