#!/bin/sh
#
# Copyright (c) 2015 The Linux Foundation. All rights reserved.
# Copyright (c) 2011-2015 OpenWrt.org
#


. /lib/functions.sh
. /lib/functions/uci-defaults.sh
. /lib/functions/teltonika-defaults.sh
. /lib/functions/system.sh

[ -f /lib/functions/target-defaults.sh ] && \
	. /lib/functions/target-defaults.sh


setup_json() {
	local model="$1"
	lan_list=$(ls -1 -v -d /sys/class/net/port* /sys/class/net/sfp* | xargs -n1 basename | xargs)

	case "$model" in
	SWM28*)
		if [ "${model:5:1}" = "0" ]; then
			ucidef_set_poe 3 220000-240000 12 "lan1" "4" 30000 "lan2" "4" 30000 "lan3" "4" 30000 "lan4" "4" 30000 "lan5" "4" 30000 "lan6" "4" 30000 "lan7" "4" 30000 "lan8" "4" 30000 "lan9" "4" 30000 "lan10" "4" 30000 "lan11" "4" 30000 "lan12" "4" 30000
			ucidef_set_poe_chip "0X20" "1:lan1" "2:lan2" "3:lan3" "4:lan4"
			ucidef_set_poe_chip "0X21" "1:lan8" "2:lan7" "3:lan6" "4:lan5"
			ucidef_set_poe_chip "0X22" "1:lan9" "2:lan10" "3:lan11" "4:lan12"
			ucidef_set_hwinfo ethernet sfp_port sfp_switch poe switch
		elif [ "${model:5:1}" = "1" ]; then
			ucidef_set_hwinfo ethernet sfp_port sfp_switch switch
		elif [ "${model:5:1}" = "2" ]; then
			ucidef_set_poe 6 220000-240000 24 "lan1" "4" 30000 "lan2" "4" 30000 "lan3" "4" 30000 "lan4" "4" 30000 "lan5" "4" 30000 "lan6" "4" 30000 "lan7" "4" 30000 "lan8" "4" 30000 "lan9" "4" 30000 "lan10" "4" 30000 "lan11" "4" 30000 "lan12" "4" 30000 "lan13" "4" 30000 "lan14" "4" 30000 "lan15" "4" 30000 "lan16" "4" 30000 "lan17" "4" 30000 "lan18" "4" 30000 "lan19" "4" 30000 "lan20" "4" 30000 "lan21" "4" 30000 "lan22" "4" 30000 "lan23" "4" 30000 "lan24" "4" 30000

			ucidef_set_poe_chip "0X20" "1:lan1" "2:lan2" "3:lan3" "4:lan4"
			ucidef_set_poe_chip "0X21" "1:lan8" "2:lan7" "3:lan6" "4:lan5"
			ucidef_set_poe_chip "0X22" "1:lan9" "2:lan10" "3:lan11" "4:lan12"
			ucidef_set_poe_chip "0X23" "1:lan16" "2:lan15" "3:lan14" "4:lan13"
			ucidef_set_poe_chip "0X24" "1:lan17" "2:lan18" "3:lan19" "4:lan20"
			ucidef_set_poe_chip "0X25" "1:lan24" "2:lan23" "3:lan22" "4:lan21"
			ucidef_set_hwinfo ethernet sfp_port sfp_switch poe switch
		fi

		json_select_object network
		json_select_object static
		json_select_object ..
		json_select_object ..

		for e in $lan_list; do
			local num=
			local pos=
			if [[ "$e" == "port*" ]] ;then
				num="${e##port}"
				[ "$(($num % 2))" -eq 1 ] && pos="up" || pos="down"
				ucidef_set_port "static" device "name:${e} type:eth num:${e##port} position:${pos} block:0" protocol static
			elif [[ "$e" == "sfp*" ]] ;then
				num="${e##sfp}"
				[ "$(($num % 2))" -eq 0 ] && pos="up" || pos="down"
				ucidef_set_port "static" device "name:${e} type:sfp num:${e##sfp} position:${pos} block:1" protocol static
			fi
			json_add_string "" "$e"
		done
		;;
	TSW202*)
		ucidef_set_poe 3 - 8 "lan1" "4" 30000 "lan2" "4" 30000 "lan3" "4" 30000 "lan4" "4" 30000 "lan5" "4" 30000 "lan6" "4" 30000 "lan7" "4" 30000 "lan8" "4" 30000
		ucidef_set_poe_chip "0X2f" "1:lan4" "2:lan3" "3:lan2" "4:lan1"
		ucidef_set_poe_chip "0X27" "1:lan8" "2:lan7" "3:lan6" "4:lan5"
		ucidef_set_poe_chip "0X77" "0:lan4" "1:lan3" "2:lan2" "3:lan1" "4:lan5" "5:lan6" "6:lan7" "7:lan8"
		ucidef_set_max_multicast_groups "5120" # 512 per port
		ucidef_set_hwinfo ethernet sfp_port sfp_switch poe switch

		json_select_object network
		json_select_object static
		json_select_object ..
		json_select_object ..

		for e in $lan_list; do
			local num=
			local pos=
			if [[ "$e" == "port*" ]] ;then
				num="${e##port}"
				[ "$(($num % 2))" -eq 1 ] && pos="up" || pos="down"
				ucidef_set_port "static" device "name:${e} type:eth num:${e##port} position:${pos} block:0" protocol static
			elif [[ "$e" == "sfp*" ]] ;then
				num="${e##sfp}"
				[ "$(($num % 2))" -eq 0 ] && pos="up" || pos="down"
				ucidef_set_port "static" device "name:${e} type:sfp num:${e##sfp} position:${pos} block:1" protocol static
			fi
			json_add_string "" "$e"
		done

		;;
	TSW212*)
		ucidef_set_max_multicast_groups "5120" # 512 per port
		ucidef_set_hwinfo ethernet sfp_port sfp_switch switch

		for e in $lan_list; do
			local num=
			local pos=
			if [[ "$e" == "port*" ]] ;then
				num="${e##port}"
				[ "$(($num % 2))" -eq 1 ] && pos="up" || pos="down"
				ucidef_set_port "static" device "name:${e} type:eth num:${e##port} position:${pos} block:0" protocol static
			elif [[ "$e" == "sfp*" ]] ;then
				num="${e##sfp}"
				[ "$(($num % 2))" -eq 0 ] && pos="up" || pos="down"
				ucidef_set_port "static" device "name:${e} type:sfp num:${e##sfp} position:${pos} block:1" protocol static
			fi
			json_add_string "" "$e"
		done

		;;
	TSW213*)
		ucidef_set_release_version "1.7"
		ucidef_set_max_multicast_groups "5120" # 512 per port
		ucidef_set_hwinfo ethernet sfp_port sfp_switch switch ios

		for e in $lan_list; do
			local num=
			local pos=
			if [[ "$e" == "port*" ]] ;then
				num="${e##port}"
				[ "$(($num % 2))" -eq 1 ] && pos="up" || pos="down"
				ucidef_set_port "static" device "name:${e} type:eth num:${e##port} position:${pos} block:0" protocol static
			elif [[ "$e" == "sfp*" ]] ;then
				num="${e##sfp}"
				[ "$(($num % 2))" -eq 0 ] && pos="up" || pos="down"
				ucidef_set_port "static" device "name:${e} type:sfp num:${e##sfp} position:${pos} block:1" protocol static
			fi
			json_add_string "" "$e"
		done

		;;
	*)
		echo "Unsupported hardware. Network interfaces not intialized"
		;;
	esac

	type ucidef_target_defaults &> /dev/null && \
		ucidef_target_defaults "$model"
}

board=$(board_name)
board_config_update

ucidef_set_bridge_device br0

lan_mac="$(mtd_get_mac_binary config 0x0)"
lan_mac_end=""
label_mac=""

ucidef_set_interface_macaddr "static" $lan_mac
ucidef_set_bridge_mac "$lan_mac"
ucidef_set_label_macaddr $lan_mac
ucidef_set_interface "static" "default_ip" %%DEFAULT_IP%%

platform="$(cat /proc/device-tree/platform)" 2>/dev/null
model="$(mnf_info --name)" 2>/dev/null;

ucidef_add_port_security_capabilities 1 1 "hardware"

setup_json "$model"

ucidef_set_board_platform "$platform"

board_config_flush

exit 0

