--- xen-4.3.0/tools/hotplug/Linux/Makefile +++ xen-4.3.0.mod/tools/hotplug/Linux/Makefile @@ -14,6 +14,7 @@ XEN_SCRIPTS += network-route vif-route XEN_SCRIPTS += network-nat vif-nat XEN_SCRIPTS += vif-openvswitch +XEN_SCRIPTS += vif-vtrill XEN_SCRIPTS += vif2 XEN_SCRIPTS += vif-setup XEN_SCRIPTS += block --- xen-4.3.0/tools/hotplug/Linux/vif-common.sh +++ xen-4.3.0.mod/tools/hotplug/Linux/vif-common.sh @@ -213,3 +213,31 @@ fi echo "$result" } + +ip6_of() +{ + ip -6 -o addr show scope global dev "$1" | awk '$3 == "inet6" { split($4,i,"/"); print i[1]; exit }' +} + +dom0_ip6_gateway() +{ + ip -6 -o route show "default" | awk '$1 == "default" { print $3; exit }' +} + +dom0_ip6() +{ + local nd=${netdev:-eth0} + local result=$(ip6_of "$nd") + if [ -z "$result" ] + then + echo "" + else + echo "$result" + fi +} + +is_ipv6() +{ + echo "${1}" | grep -q ':' && echo "ipv6" +} + --- /dev/null +++ xen-4.3.0.mod/tools/hotplug/Linux/vif-vtrill @@ -0,0 +1,91 @@ +#!/bin/bash +#============================================================================ +# ${XEN_SCRIPT_DIR}/vif-vtrill +# Based on ${XEN_SCRIPT_DIR}/vif-openvswitch +# +# Script for configuring a vif in routed + bridged 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 ${XEN_CONFIG_DIR}/xend-config.sxp. If the script is specified in +# neither of those places, then this script is the default. +# +# 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: +# ip list of IP networks for the vif, space-separated (optional). +# +# up: +# Enslaves the vif interface to a VM-specific bridge and adds iptables rules +# for its ip addresses (if any). +# +# down: +# Removes the vif interface from the VM-bridge bridge and removes the iptables +# rules for its ip addresses (if any). +#============================================================================ + +dir=$(dirname "$0") +. "${dir}/vif-common.sh" + +main_ip=$(dom0_ip) +main_ip6=$(dom0_ip6) +gateway_ip6=$(dom0_ip6_gateway) +vlanname=$(echo ${dev} | cut -d'.' -f1) + +case "${command}" in + online) + create_bridge ${vlanname} + add_to_bridge ${vlanname} ${dev} + ifconfig ${vlanname} ${main_ip} netmask 255.255.255.255 up + if [ ! -z "${main_ip6}" ] + then + ip -6 addr add ${main_ip6} dev ${vlanname} + ip -6 neighbor add proxy ${gateway_ip6} dev ${vlanname} + echo 1 >/proc/sys/net/ipv6/conf/${vlanname}/proxy_ndp + fi + echo 1 >/proc/sys/net/ipv4/conf/${vlanname}/proxy_arp + ipcmd='add' + cmdprefix='' + ;; + offline) + ifconfig ${vlanname} down + brctl delbr ${vlanname} + ipcmd='del' + cmdprefix='do_without_error' + ;; + add) + create_bridge ${vlanname} + add_to_bridge ${vlanname} ${dev} + ;; + remove) + ;; +esac + +if [ "${ip}" -a "$type_if" != "tap" ] ; then + # If we've been given a list of IP addresses, then add routes from dom0 to + # the guest using those addresses. + for addr in ${ip} ; do + do_without_error ip route del ${addr} + if [ "$(is_ipv6 ${addr})" = "ipv6" ]; then + ${cmdprefix} ip -6 route ${ipcmd} ${addr} dev ${vlanname} src ${main_ip6} + ${cmdprefix} ip -6 neighbor ${ipcmd} proxy ${addr} dev ${netdev:-eth0} + else + do_without_error ip route ${ipcmd} ${addr} dev ${vlanname} src ${main_ip} + fi + done +fi + +log "iptable" +handle_iptable + +call_hooks vif post + +log debug "Successful vif-vtrill ${command} for ${dev}." +if [ "${command}" = "online" ] +then + success +fi