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

DHCPNAME="/tmp/dhcp_name.conf"
setup_hostname() # $1: apmode/brmode/extmode/factory
{
	local hostname

	case "$1" in
	apmode) hostname=$($CONFIG get ap_netbiosname)
		;;
	brmode)	hostname=$($CONFIG get bridge_netbiosname)
		;;
	*) hostname="$($CONFIG get netbiosname)" ;;
	esac
	[ -z "$hostname" ] && hostname="$($CONFIG get Device_name)"

	echo "$hostname" > /proc/sys/kernel/hostname
	echo "$hostname" > $DHCPNAME
}

setup_interface_static() # $1: apmode/brmode/extmode/factory
{
	case "$1" in
	apmode)
		ifconfig brwan up; ifconfig brwan 0.0.0.0; ifconfig brwan down
		ifconfig br0 $($CONFIG get ap_ipaddr) netmask $($CONFIG get ap_netmask)
		route add default gw $($CONFIG get ap_gateway)
		echo "nameserver $($CONFIG get ap_ether_dns1)" > /tmp/resolv.conf
		echo "nameserver $($CONFIG get ap_ether_dns2)" >> /tmp/resolv.conf
		;;
	brmode)
		#fix normal->apmode static, udhcpc can't kill issue
		ifconfig brwan up; ifconfig brwan 0.0.0.0; ifconfig brwan down
		killall udhcpc
		ifconfig br0 $($CONFIG get bridge_ipaddr) netmask $($CONFIG get bridge_netmask)
		route add default gw $($CONFIG get bridge_gateway)
		echo "nameserver $($CONFIG get bridge_ether_dns1)" > /tmp/resolv.conf
		echo "nameserver $($CONFIG get bridge_ether_dns2)" >> /tmp/resolv.conf
		/sbin/eth_handle restart
		;;
	extmode)
		ifconfig br0 $($CONFIG get extender_ipaddr) netmask $($CONFIG get extender_netmask)
		route add default gw $($CONFIG get extender_gateway)
		echo "nameserver $($CONFIG get extender_ether_dns1)" > /tmp/resolv.conf
		echo "nameserver $($CONFIG get extender_ether_dns2)" >> /tmp/resolv.conf
		;;
	factory)
		ifconfig br0 $($CONFIG get lan_ipaddr) netmask $($CONFIG get lan_netmask)
		;;
	esac
	/sbin/ledcontrol -n wan -c green -s on
}

setup_interface_dhcp() # $1: apmode/brmode/extmode
{
	hostname=$(cat /proc/sys/kernel/hostname)

	ifconfig brwan up; ifconfig brwan 0.0.0.0; ifconfig brwan down
	# hostapd always need a lan ip to up.
	[ "$1" = "apmode" ] && ifconfig br0 $($CONFIG get lan_ipaddr)

	case "$1" in
	apmode) 
		echo "ap mode start udhcp" 
		sleep 10
		killall udhcpc
		/sbin/udhcpc -a -b -i br0 -h $DHCPNAME -r $($CONFIG get ap_dhcp_ipaddr) &
		;; 
	brmode) 
		/sbin/udhcpc -a -b -i br0 -h $DHCPNAME -r $($CONFIG get ap_dhcp_ipaddr) &
		sleep 10
		/sbin/eth_handle restart
		/etc/init.d/net-br-dhcpc-helper & 
		;;
	extmode) 
		/sbin/udhcpc -a -b -i br0 -h $DHCPNAME -r $($CONFIG get ap_dhcp_ipaddr) &
		sleep 10
		/etc/init.d/net-br-dhcpc-helper & ;;
	esac
}

setup_interface() # $1: apmode/brmode/extmode/factory
{
	local dhcp=1

	case "$1" in
	apmode) [ "$($CONFIG get ap_ether_ip_assign)" = "0" ] && dhcp=0 ;;
	brmode) [ "$($CONFIG get bridge_ether_ip_assign)" = "0" ] && dhcp=0 ;;
	extmode) [ "$($CONFIG get extender_ether_ip_assign)" = "0" ] && dhcp=0 ;;
	factory) dhcp=0 ;;
	esac

	[ "$dhcp" = "1" ] && setup_interface_dhcp $1 || setup_interface_static $1
}

add_ebtable_rule() #fix the Issue: LAN pc can not access www.routerlogin.com in apmode 
{
	fc disable 
	fc flush
	fc enable
	fc config --accel-mode 0
	ebtables -A FORWARD -p IPv4 --ip-protocol 17 --ip-source-port 53 -j SKIPLOG
	ebtables -A FORWARD -p ipv6 --ip6-protocol 17 --ip6-source-port 53 -j SKIPLOG
}

del_ebtable_rule() 
{
	fc disable 
	fc flush
	fc enable
	fc config --accel-mode 1
	ebtables -D FORWARD -p IPv4 --ip-protocol 17 --ip-source-port 53 -j SKIPLOG
	ebtables -D FORWARD -p ipv6 --ip6-protocol 17 --ip6-source-port 53 -j SKIPLOG
}

start0() # $1: boot/start
{
	local opmode=$($CONFIG get i_opmode)

	# Stop Traffic Meter
	/sbin/cmd_traffic_meter stop
	/usr/bin/killall tfm_led

	setup_hostname $opmode

	ifconfig eth1 up
	ifconfig eth0 up
	ifconfig eth2 up
	ifconfig eth3 up
	ifconfig eth4 up
	ifconfig eth5 up
	ifconfig br0 up

	# For RAX60 which supports WAN Preference that "Internet Port" can be
	# changed from Web GUI.
	# Sync "wan_preference" to kernel for identifying real "Internet Port"
	local wan_preference=$($CONFIG get wan_preference)
	local wan_pref_porc="/proc/simple_config/wan_preference"
	[ -e $wan_pref_porc ] && echo $wan_preference > $wan_pref_porc

	/etc/init.d/wlan-common start &

	# Pull low PHY 9 seconds then pull high PHY to let wired client re-obtain IP address
	# echo -n '911111' > /proc/switch_phy && sleep 10
	/sbin/eth_handle restart
	setup_interface $opmode 

	/sbin/cmd_ebtables start
	/etc/init.d/netscan $1      # daemon for getting attached devices
	/etc/init.d/lltd $1          # Link Layer Topology Discovery Daemon
	/etc/init.d/telnet $1        # telnet daemon for Router Debugging Mode ...
	/usr/sbin/update_smb
	/sbin/cmddlna ip_restart &   # dlan daemon
	/etc/init.d/upnp $1
	if [ "$opmode" = "apmode" ]; then
 	    brctl stp br0 1
	fi
	if [ "$opmode" = "apmode" ] || [ "$opmode" = "brmode" ]; then
	    /etc/init.d/iqos stop
	fi
	add_ebtable_rule
}

start()
{
	start0 start
	/etc/init.d/ntpclient restart
	/etc/init.d/cron restart
	/etc/init.d/dnsmasq start
}

stop()
{
	# wan service
	/etc/init.d/dnsmasq stop
	/etc/init.d/cron stop
	/etc/init.d/ntpclient stop

	# lan service
#	/etc/init.d/samba stop
	/etc/init.d/upnp stop
	/etc/init.d/telnet stop
	/etc/init.d/lltd stop
	/etc/init.d/netscan stop
	/sbin/cmd_ebtables stop
	if [ "$($CONFIG get i_opmode)" = "apmode" ]; then
 	    brctl stp br0 0
	fi

	/sbin/ledcontrol -n wan -c amber -s on
	killall net-br-dhcpc-helper
	killall zcip
	killall -SIGUSR2 udhcpc; killall udhcpc; killall udhcpc; sleep 1

	ifconfig br0 down
	ifconfig eth0 down
	ifconfig eth1 down
	ifconfig eth2 down
	ifconfig eth3 down
	ifconfig eth4 down
	ifconfig eth5 down
	del_ebtable_rule
}

restart()
{
	stop
	start
}

boot()
{
	/sbin/ledcontrol -n wan -c amber -s on
	start0 boot
}

