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

START=21

. $IPKG_INSTROOT/lib/network/config.sh

WAN_PHYSICAL=eth2
LAN_PHYSICAL=eth0

cal_wan_mac() {
	set - `cat /sys/class/net/eth2/address | sed 's/^\([0-9a-f:]*\)\([0-9a-f]\)$/\1 \2/'`
	
	if   [ "$2" = "1" ]; then
		echo "${1}1 ${1}2 ${1}3 ${1}4 ${1}5"
	elif [ "$2" = "9" ]; then
		echo "${1}9 ${1}a ${1}b ${1}c ${1}d"
	fi
}

boot() {
	no_mac_return=
	need_commit=
	LAN_MACADDR=`cat /sys/class/net/eth0/address`
	WAN_MACADDR=`cat /sys/class/net/eth2/address`
	set -- `cal_wan_mac`
	WAN1_MACADDR=$1
	WAN2_MACADDR=$2
	WAN3_MACADDR=$3
	WAN4_MACADDR=$4
	WAN5_MACADDR=$5

	[ "$LAN_MACADDR" = "00:aa:bb:cc:dd:ee" -o "$LAN_MACADDR" = "00:50:7f:ff:39:00" -o "$LAN_MACADDR" = "00:50:7f:ff:39:01" ] && no_mac_return=1
	[ "$WAN_MACADDR" = "00:aa:bb:cc:dd:ee" -o "$WAN_MACADDR" = "00:50:7f:ff:39:00" -o "$WAN_MACADDR" = "00:50:7f:ff:39:01" ] && no_mac_return=1

	scan_interfaces
	##### Vincent F. 2013/04/23
	##### env is default mac, try to recover from uci config
	[ "$no_mac_return" == "1" ] && {
		lan_rstmac=`mtd fw_printenv 1 |grep lan_rstmac |sed -e "s/lan_rstmac=//"`
		for ifs in $interfaces; do
			config_get physical $ifs physical
			if [ "$physical" == "$LAN_PHYSICAL" ]; then
				config_get macaddr $ifs macaddr
				macaddr=`echo "$macaddr" |tr [A-Z] [a-z]`
				if [ "$macaddr" -a "$macaddr" != "default" -a "$macaddr" != "$LAN_MACADDR" -a "$macaddr" != "$lan_rstmac" ]; then
					mtd fw_setenv lan_rstmac $macaddr
					mtd fw_setenv lan_backupmac $macaddr
					echo "[init.d/default_mac] set env lan_rstmac=$macaddr to recover ethaddr" > /dev/console
					reboot
				fi
				break #break for
			fi
		done
		return
	}

	##### set wan port & untag options
	$(grep port /etc/config/network > /dev/null) || {
		for ifs in $interfaces; do
			config_get physical $ifs physical
			[ "$physical" = "$WAN_PHYSICAL" ] || continue
			config_get vlan_id $ifs vlan_id
			untag_port=`uci get vlan_wan.$vlan_id.untag`
			if   [ -z "$untag_port" ]; then
				uci set network.$ifs.untag=disable
				member_port=`uci get vlan_wan.$vlan_id.member | sed -e 's/cpu//' -e 's/^ *\([1-5]\).*$/\1/'`
				if   [ -n "$member_port" ]; then
					uci set network.$ifs.port=WAN$member_port
				else
					uci set network.$ifs.port=WAN1
				fi
			else
				uci set network.$ifs.untag=enable
				uci set network.$ifs.port=WAN$untag_port
			fi
		done
		uci commit network

		scan_interfaces
		echo > /etc/config/vlan_wan
		for ifs in $interfaces; do
			config_get physical $ifs physical
			[ "$physical" = "$WAN_PHYSICAL" ] || continue
			config_get vid $ifs vlan_id
			config_get port $ifs port
			config_get untag $ifs untag
			tmp=`uci add vlan_wan vlanid`
			uci rename vlan_wan.$tmp=$vid
			uci set vlan_wan.$vid.intf=wan
			uci set vlan_wan.$vid.member=cpu
			uci add_list vlan_wan.$vid.member=${port#WAN}
			[ "$untag" = "enable" ] && uci set vlan_wan.$vid.untag=${port#WAN}
			uci set vlan_wan.$vid.fid=${port#WAN}
		done
		uci commit vlan_wan
	}

	##### set default mac
	for ifs in $interfaces; do
		config_get default_mac $ifs default_mac
		config_get macaddr $ifs macaddr
		[ "$default_mac" = "enable" -o "$macaddr" = "default" -o -z "$macaddr" ] && {
			config_get physical $ifs physical
			if   [ "$physical" = "$LAN_PHYSICAL" ]; then
				[ "$macaddr" = "$LAN_MACADDR" ] || {
					uci set network.$ifs.macaddr=$LAN_MACADDR
					need_commit=1
				}
			elif [ "$physical" = "$WAN_PHYSICAL" ]; then
				config_get port $ifs port
				eval WAN_MACADDR=\${${port}_MACADDR}
				[ "$macaddr" = "$WAN_MACADDR" ] || {
					uci set network.$ifs.macaddr=$WAN_MACADDR
					need_commit=1
				}
			fi
		}
	done
	[ "$need_commit" = "1" ] && uci commit network

	eval sed -i -e 's/__DEFAULT_LAN_MACADDRESS__/$LAN_MACADDR/' -e 's/__DEFAULT_WAN_MACADDRESS__/$WAN1_MACADDR/' /etc/clish/param/param-view.xml
	sync
}
