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

START=4
USE_PROCD=1

_setup_macaddr() {
	uci -q get "network.$1_dev.macaddr" >/dev/null && return
	uci -q set "network.$1_dev.macaddr=$2"
}

_save_macaddr() {
	local _ifname
	local _macaddr
	uci -q get "network.$1_dev.ifname" >/dev/null && {
		_ifname=$(uci -q get "network.$1.ifname")
		if [ -n "$(uci -q get network.$1.macaddr)" ] &&  [ "$(uci -q get network.$1.macaddr)" != "$(uci -q get network.$1_dev.macaddr)" ]; then
			uci -q set network.$1_dev.macaddr="$(uci -q get network.$1.macaddr)"
		else
			_macaddr=$(ip link show dev $_ifname 2>/dev/null | grep link | awk '{print $2}')
			[ -n "$_macaddr" ] && {
				uci -q set network.$1_dev.macaddr=$_macaddr
				uci -q set network.$1.macaddr=$_macaddr
			}
		fi
	}
	[ -z "$(uci -q get network.$1.macaddr)" ] && {
		_ifname=$(uci -q get "network.$1.ifname")
		[ -n "$_ifname" ] && {
			_macaddr=$(ip link show dev $_ifname 2>/dev/null | grep link | awk '{print $2}')
			[ -n "$_macaddr" ] && {
				uci -q set network.$1.macaddr=$_macaddr
			}
		}
	}
}

_create_interface() {
	local _masterifname
	local _ifname=$1
	config_get _masterifname "$1" ifname
	uci batch <<-EOF
		set network.$_ifname=interface
		set network.$_ifname.type=macvlan
		set network.$_ifname.proto=static
		set network.$_ifname.masterintf=$_masterifname
	EOF
}

# Configuration by interface
_setup_interface() {
	local _ifname
	config_get _ifname "$1" ifname
	#[ -z "$_ifname" ] && config_get _ifname "$1" ifname
	# do not create macvlan for vlan
	#case "$_ifname" in
	#	eth*.*) return ;;
	#esac
	local _type
	config_get _type "$1" type

	[ "$_type" = "macvlan" ] && [ "$(uci -q get macvlan.$1)" = "" ] && {
		uci -q batch <<-EOF
			delete network.$1
			delete network.$1_dev
			commit network
		EOF
		return
	}

	[ "$(echo $1 | grep _dev)" != "" ] && {
		local _intfdev=$(sed 's/_dev//' $1)
		uci -q get "network.$_intfdev.ifname" >/dev/null || {
			logger -t "macvlan" "Remove network.$1"
			uci -q batch <<-EOF
			delete network.$1
			commit network
			delete macvlan.$1
			commit macvlan
			EOF
		}
		return
	}

	#_type="$(uci -q get network.$1.type)
	if [ "$(uci -q get macvlan.$1)" != "" ]; then
		_type="macvlan"
	fi

	uci -q get "network.$1_dev.ifname" >/dev/null && {
		uci -q set network.$1_dev.mtu=$(uci -q get network.$1.mtu)
		[ -n "$(uci -q get macvlan.$1.ifname)" ] && uci -q set network.$1_dev.ifname=$(uci -q get macvlan.$1.ifname)
		[ -z "$(uci -q get network.$1.masterintf)" ] && uci -q set network.$1.masterintf=$(uci -q get network.$1_dev.ifname)
		[ -n "$(uci -q get network.$1.masterintf)" ] && uci -q set network.$1_dev.ifname=$(uci -q get network.$1.masterintf)
		[ -z "$(uci -q get network.$1.macaddr)" ] && uci -q set network.$1_dev.macaddr=$(uci -q get network.$1.macaddr)
		[ "$_type" = "macvlan" ] || {
			logger -t "macvlan" "Remove network.$1_dev"
			uci -q batch <<-EOF
			delete network.$1_dev
			EOF
		}
		[ "$_type" = "macvlan" ] && {
			local interface
			config_get _interface "$1" interface
			[ -n "$_interface" ] && {
				logger -t "macvlan" "Remove network.$1_dev"
				uci -q batch <<-EOF
				delete network.$1
				set network.$1_dev.ifname=$_interface
				EOF
			}
		}
		uci -q commit network
		return 0
	}
	
	[ "$_type" = "macvlan" ] || return 0
	[ -z "$_ifname" ] && _ifname=$(uci -q get macvlan.$1.ifname)
	uci -q batch <<-EOF
	set network.$1_dev=device
	set network.$1_dev.name=$1
	set network.$1_dev.type=macvlan
	set network.$1_dev.ifname=$_ifname
	set network.$1.ifname=$1
	set network.$1.masterintf=$_ifname
	set network.$1.type=macvlan
	set network.$1.defaultroute=0
	EOF
	
	_macaddr=$(uci -q get "network.$1.macaddr")
	_setup_macaddr "$1" "${_macaddr:-auto$(date +%s)}"
	uci -q set network.$1_dev.mtu=$(uci -q get network.$1.mtu)
	uci -q commit network
}

start_service() {
	. /lib/functions.sh
	config_load macvlan
	config_foreach _create_interface macvlan
	config_load network
	config_foreach _setup_interface interface
	config_foreach _save_macaddr interface
	uci -q commit network
}

reload_service() {
	start
}

service_triggers() {
	procd_add_reload_trigger network macvlan
}
