#!/bin/sh

[ -n "$VERBOSE" ] && set -x

IF_LINK_OPTIONS="$IF_LINK_OPTIONS"
[ -n "$IF_MTU" ] && IF_LINK_OPTIONS="$IF_LINK_OPTIONS mtu $IF_MTU"

is_vlan() {
	case "$IFACE" in
		*#*) return 1 ;;
		*:*) return 1 ;;
		vlan*.*) return 1 ;;
		vlan*)
			IF_VLAN_ID="${IFACE#vlan}"
			[ -n "${IF_VLAN_RAW_DEVICE:-}" ] && return 0
			return 1
			;;
		*.*)
			IF_VLAN_RAW_DEVICE="${IFACE%.*}"
			IF_VLAN_ID="${IFACE##*.}"
			return 0
			;;
		*)
			[ -z "${IF_VLAN_ID:-}" ] && return 1
			[ -z "${IF_VLAN_RAW_DEVICE:-}" ] && return 1
			return 0
			;;
	esac
}

case "$PHASE" in
pre-up|post-down)
	UP_DOWN="${PHASE##*-}"

	if is_vlan; then
		ADD_DEL="add"
		[ "$UP_DOWN" = "down" ] && ADD_DEL="delete"

		if [ "$UP_DOWN" = "up" -a -e /sys/class/net/$IFACE ]; then
			exit 0
		fi

		if [ -z "$MOCK" ]; then
			if ! ip link show "$IF_VLAN_RAW_DEVICE" >/dev/null; then
				echo "Device $IF_VLAN_RAW_DEVICE for $IFACE does not exist"
				exit 1
			fi

			if ! [ -d /proc/net/vlan ]; then
				echo "Loading 8021q kernel module for VLAN support"
				${MOCK} modprobe 8021q
			fi
		fi

		${MOCK} ip link $ADD_DEL link "$IF_VLAN_RAW_DEVICE" name "$IFACE" type vlan id "$IF_VLAN_ID"
		[ "$UP_DOWN" = "down" ] && exit 0

		${MOCK} ip link set $UP_DOWN dev $IFACE $IF_LINK_OPTIONS
	else
		${MOCK} ip link set $UP_DOWN dev $IFACE $IF_LINK_OPTIONS
	fi
	;;
depend)
	if is_vlan; then
		echo "$IF_VLAN_RAW_DEVICE"
	fi
	;;
esac