#!/bin/bash #============================================================================ # ${XEN_SCRIPT_DIR}/vif-openvswitch # # Script for configuring a vif using Open vSwitch. # # Usage: # vif-openvswitch (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. # # up: # Enslaves the vif interface to the bridge. # # down: # Removes the vif interface from the bridge. #============================================================================ dir=$(dirname "$0") . "$dir/vif-common.sh" bridge=${bridge:-} bridge=$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge") if [ -z "${bridge}" ] then bridge=$(ovs-vsctl listbr | cut -d " " -f 1) if [ -z "${bridge}" ] then fatal "Could not find bridge and none was specified" fi fi tag=${tag:-} # Domain on VLAN tagged bridge? RET=0 ovs-vsctl list-br | grep -c ${bridge} 1>/dev/null 2>&1 || RET=1 if [ $RET -eq 1 ] then if [[ $bridge =~ \.[[:digit:]]{1,4}$ ]] then tag=$(echo ${bridge} | cut -d "." -f 2) bridge=$(echo ${bridge} | cut -d "." -f 1) else fatal "Could not find bridge device ${bridge}" fi fi RET=0 ovs-vsctl list-br | grep -c ${bridge} 1>/dev/null 2>&1 || RET=1 if [ $RET -eq 1 ] then fatal "Could not find bridge device ${bridge}" fi log debug "Successful vif-bridge $command for ${vif}, bridge ${bridge}." case "$command" in online) ifconfig "${vif}" 0.0.0.0 up if [ -z $tag ] then ovs-vsctl -- --may-exist add-port ${bridge} ${vif} else ovs-vsctl -- --may-exist add-port ${bridge} ${vif} tag=${tag} fi ;; offline) ovs-vsctl -- --if-exists del-port ${bridge} ${vif} ifconfig "$vif" 0.0.0.0 down ;; esac if [ "$command" == "online" ] then success fi