#!/bin/bash
#============================================================================
# /etc/xen/vif-ovs
#
# Script for configuring a vif in OVS mode.
# The hotplugging system will call this script if it is specified either in
# the device configuration given to Xend, or the default Xend configuration
# in /etc/xen/xend-config.sxp.  If the script is specified in neither of those
# places, then this script is the default.
#
# Usage:
# vif-ovs (add|remove|online|offline)
#
# Environment vars:
# vif         vif interface name (required).
# XENBUS_PATH path to this device's details in the XenStore (required).
#
# Read from the store:
# bridge  bridge to add the vif to (optional).  Defaults to searching for the
#         bridge itself.
# ip      list of IP networks for the vif, space-separated (optional).
# mac	  MAC address which added to interface.
#
# up:
# Enslaves the vif interface to the bridge and adds iptables rules
# for its ip addresses (if any).
#
# down:
# Removes the vif interface from the bridge and removes the iptables
# rules for its ip addresses (if any).
#============================================================================

dir=$(dirname "$0")
. "$dir/vif-common.sh"

OVSVSCTL=$(whereis -b ovs-vsctl | awk '{print $2}')
OVSOFCTL=$(whereis -b ovs-ofctl | awk '{print $2}')
RUNPATH="/var/run/openvswitch"
OVSVSCTL="$OVSVSCTL --db=unix:$RUNPATH/db.sock"

bridge=${bridge:-}
mac=""
intname=""
ip=${ip:-}
bridge=$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")
mac=$(xenstore_read_default "$XENBUS_PATH/mac" "$mac")
ip=$(xenstore_read_default "$XENBUS_PATH/ip" "$ip")
intname=$(xenstore_read_default "$XENBUS_PATH/vifname" "$intname")

if [ -z "$bridge" ]; then
    fatal "Could not find bridge, none was specified"
fi

if [ -z "$mac" ]; then
    fatal "Could not find mac address for interface"
fi

if [ -z "$intname" ]; then
    fatal "Could not find interface name"
fi

RET=0
ip link show $bridge 1>/dev/null 2>&1 || RET=1
if [ "$RET" -eq 1 ]; then
    fatal "Could not find bridge device $bridge"
fi

case "$command" in
    online)
	setup_bridge_port "$vif"
	add_to_bridge "$bridge" "$vif"
	# Just check in case if VM rebooted inside. Then remove ones
	# Create antispuf rules
	
	# In case there not IP on interface, not antispoof rules need.
	if [ -n "$ip" ]; then


	$OVSOFCTL dump-flows "$bridge" | grep "$mac" | sed 's/.*in_port\=//g; /^[0-9]*/s/,.*//g' | while read port
	do

	    if [ -z "$port" ]; then
		break
	    fi
	    $OVSOFCTL del-flows "$bridge" "in_port=$port" > /dev/null 2>&1
	
	done

        for ip_addr in $ip
        do
		/onapp/tools/antispoofing --add --int $intname --ip-address $ip_addr --mac-address $mac
        done
	fi
	;;

    offline)
	port=$($OVSVSCTL -- get Interface $intname ofport 2>/dev/null)
	$OVSOFCTL del-flows $bridge "in_port=$port" > /dev/null 2>&1
	
        do_without_error ovs-vsctl del-port "$bridge" "$vif"
        do_without_error ifconfig "$vif" down
        ;;
esac

log debug "Successful vif-bridge $command for $vif, bridge $bridge."
if [ "$command" == "online" ]; then
  success
fi

