#!/bin/sh
# Copyright (C) 2006 OpenWrt.org
####### Error code table
#101: ERROR: ifup or another ifdown is running, abort

[ "$1" = "-a" ] || {	#skip lock check when boot
	##### Abort if ifup of the iface is running
	physical=`uci get network.$1.physical`
	if [ "$physical" != "eth0" ] ;then
		now=$(cat /proc/uptime | awk 'FS="[.]+" {print $1}')
		runtime=$(uci -q -P /var/state get network.$1.ifup_running)
		if [ -n "$runtime" ]; then
			DIFF=$(($now - $runtime))
			INTERVAL=60
			[ "$1" == "usb1" -o "$1" == "usb2" ] && INTERVAL=90
			if [ $DIFF -le $INTERVAL ]; then
				logger -p 160.5 "$1 ifup($$): another ifup $1 is running.......abort"
				exit 101
			else
				uci revert -P /var/state/ network.$1.ifup_running
			fi
		fi
	fi

	##### HA_backup won't up any interface
	ucarp_status=`uci get ucarp_mode.general.status`
	ucarp_state=`json get ucarp.state`
	[ "$ucarp_status" = "enable" -a "$ucarp_state" = "backup" ] && {
		logger -p 160.5 "$1 ifup($$): HA hot-standby role is backup, abort"
		return
	}
	##### Load balance failover 
	bak_down=`json -f /var/cd_status get interface.$1.bak_down`
	[ "$bak_down" = "1" ] && {
		logger -p 160.5 "$1 ifup($$): failover role is backup and in down status, abort"
		return
	}
	
	##### G40733: HA master won't up any interface when HA_LAN_DOWN event occurs
	[ -f "/tmp/HA_ifdown_lock" ] && {
		conn_dect_pid=`cat /var/run/conn_dect.pid`
		if [ -n "$conn_dect_pid" ] ;then
			cmd_line=`cat /proc/$conn_dect_pid/cmdline`
			echo "$cmd_line" | grep "^/bin/sh/sbin/conn_dect$" >/dev/null 2>/dev/null
			if [ "$?" = "0" ] ;then
				logger -p 160.5 "$1 ifup($$): High Availibility(master):HA_LAN_DOWN event detected, abort"
				return
			else
				rm -f "/tmp/HA_ifdown_lock"
				logger -p 160.5 "$1 ifup($$): break lock because conn_dect process crashed, continue ifup process"
			fi
		fi
	}
	
	##### update ifup running lock
	uci -q -P /var/state set network.$1.ifup_running=$now
}

logger -p 160.5 "========== $@ ifup($$): IFDOWN PART"
. /sbin/ifdown "$@" "ifup"

##### waiting before enter critical section if ifdown(called by other place) is running
now=$(cat /proc/uptime | awk 'FS="[.]+" {print $1}')
runtime=$(uci -q -P /var/state get network.$1.ifdown_running)
while [ $now -ge 100 -a -n "$runtime" ]
do
	DIFF=$(($now - $runtime))
	INTERVAL=20
	if [ $DIFF -le $INTERVAL ]; then
		logger -p 160.5 "$1 ifup($$): another ifdown is running.......abort"
		exit 101
	else
		#logger -p 160.5 "$1 ifup($$): another ifdown has exceeded $INTERVAL secs, unlock"
		uci revert -P /var/state/ network.$1.ifdown_running
		break
	fi
done

logger -p 160.5 "========== $1 ifup($$): SETUP INTERFACE PART"
######## critical section start ########
config_get status "$@" status
case "$status" in
enable|1)
	config_get iftype "$1" type
	#config_get ifname "$1" device
	ifname=$(uci -q get network.$1.device) ## Don't commit it
	[ -z "$ifname" ] && config_get ifname "$1" device

	for dev in $ifname; do
		setup_interface "$dev" "$1"
	done
	;;
*)
	;;
esac
######## critical section end ########
