add_route() {
	local config="$1"

	# is this route intended for the
	# $INTERFACE of this hotplug event
	config_get interface "$config" interface
	[ "$interface" != "$INTERFACE" ] && return 0
	
	# get the real interface name from network config
	config_get dev "$interface" ifname

	config_get target "$config" target
	config_get netmask "$config" netmask
	config_get gateway "$config" gateway
	config_get metric "$config" metric
	config_get mtu "$config" mtu

	# make sure there is a gateway and a target
	[ -n "$target" ] || {
		echo "Missing target in route section $config"
		return 1
	}
	[ -n "$gateway" ] || {
		config_get gateway "$interface" gateway
	}

	# handle "0.0.0.0" as "no gateway given" to allow
	# defining gateway-less routes while still keeping
	# the possibility to have static routes with a
	# proper gateway on interfaces with dynamic ips 
	[ "$gateway" = "0.0.0.0" ] && gateway=""

	dest="${netmask:+-net "$target" netmask "$netmask"}"
	dest="${dest:--host "$target"}"
	
	/sbin/route add $dest ${gateway:+gw "$gateway"} \
		${dev:+dev "$dev"} ${metric:+ metric "$metric"} \
		${mtu:+mss "$mtu"}
}

add_route6() {
	local config="$1"

	# is this route intended for the
	# $INTERFACE of this hotplug event
	config_get interface "$config" interface
	[ "$interface" != "$INTERFACE" ] && return 0
	
	# get the real interface name from network config
	config_get dev "$interface" ifname

	config_get target "$config" target
	config_get gateway "$config" gateway
	config_get metric "$config" metric
	config_get mtu "$config" mtu

	# make sure there is a gateway and a target
	[ -n "$target" ] || {
		echo "Missing target in route section $config"
		return 1
	}
	[ -n "$gateway" ] || {
		config_get gateway "$interface" gateway
	}

	/sbin/route -A inet6 add $target ${gateway:+gw "$gateway"} \
		${dev:+dev "$dev"} ${metric:+ metric "$metric"} \
		${mtu:+mss "$mtu"}
}

case "$ACTION" in
	ifup)
		include /lib/network
		scan_interfaces

		# Setup aliases
		config_set "$INTERFACE" aliases ""
		config_set "$INTERFACE" alias_count 0
		config_foreach setup_interface_alias alias "$INTERFACE" "$DEVICE"

		# Save alias references in state vars
		local aliases
		config_get aliases "$INTERFACE" aliases
		[ -z "$aliases" ] || uci_set_state network "$INTERFACE" aliases "$aliases"

		# Make ip6addr of parent iface the main address again
		local ip6addr
		config_get ip6addr "$INTERFACE" ip6addr
		[ -z "$ip6addr" ] || {
			ifconfig "$DEVICE" del "$ip6addr"
			ifconfig "$DEVICE" add "$ip6addr"
		}
		
		# Setup sysctls
		local proto accept_ra send_rs
		
		config_get proto "$INTERFACE" proto
		if [ "$proto" = dhcp ]; then
			accept_ra=1
			send_rs=0
		else
			accept_ra=0
			send_rs=1
		fi

		config_get_bool accept_ra "$INTERFACE" accept_ra $accept_ra
		[ $accept_ra -eq 0 ] || {
			logger -t ifup "Allowing Router Advertisements on $INTERFACE ($DEVICE)"
			accept_ra=2
		}
		do_sysctl "net.ipv6.conf.$INTERFACE.accept_ra" $accept_ra

		config_get_bool send_rs "$INTERFACE" send_rs $send_rs
		[ $send_rs -eq 0 ] || {
			logger -t ifup "Enabling Router Solicitations on $INTERFACE ($DEVICE)"
			send_rs=2
		}
		do_sysctl "net.ipv6.conf.$INTERFACE.forwarding" $send_rs


		# Setup routes
		config_foreach "add_route" route
		config_foreach "add_route6" route6
	;;
	ifdown)
		# Bring down named aliases
		local device=$(uci_get_state network "$INTERFACE" device)
		local ifn
		for ifn in $(ifconfig | sed -ne "s/^\(\($DEVICE${device:+\|$device}\|br-$INTERFACE\):[^[:space:]]\+\).*/\1/p"); do
			ifconfig "$ifn" down
		done
	;;
esac