mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 02:01:24 +01:00
The vif-route script should only call 'ip route' when 'ipcmd' has been
set, otherwise it will fail due to an incorrect command string.
This patch also adds routes for 'tap' (i.e. emulated) devices as well as
'vif' (i.e. PV) devices. Empirically offline/online commands relate to
'vif' devices, and add/remove commands relate to 'tap' devices. However,
this patch treats them equally and uses ${type_if} to distinguish. By
adding cases for add/remove the command list becomes exhaustive and hence
'ipcmd' is guaranteed to be set.
Routes for 'tap' and 'vif' devices are distinguished by a route metric.
Emulated devices are used by HVM guests until they are unplugged, at which
point the PV device becomes active. Thus 'tap' devices should get a higher
priority (i.e. lower numbered) metric than 'vif' devices.
There is also one small whitespace fix.
Signed-off-by: Paul Durrant <pdurrant@amazon.com>
Acked-by: Wei Liu <wl@xen.org>
Release-acked-by: Juergen Gross <jgross@suse.com>
69 lines
1.5 KiB
Bash
Executable File
69 lines
1.5 KiB
Bash
Executable File
#!/bin/bash
|
|
#============================================================================
|
|
# ${XEN_SCRIPT_DIR}/vif-route
|
|
#
|
|
# Script for configuring a vif in routed mode.
|
|
#
|
|
# Usage:
|
|
# vif-route (add|remove|online|offline)
|
|
#
|
|
# Environment vars:
|
|
# dev 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 (default given in
|
|
# this script).
|
|
#============================================================================
|
|
|
|
dir=$(dirname "$0")
|
|
. "${dir}/vif-common.sh"
|
|
|
|
main_ip=$(dom0_ip)
|
|
|
|
case "${command}" in
|
|
add)
|
|
;&
|
|
online)
|
|
ifconfig ${dev} ${main_ip} netmask 255.255.255.255 up
|
|
echo 1 >/proc/sys/net/ipv4/conf/${dev}/proxy_arp
|
|
ipcmd='add'
|
|
cmdprefix=''
|
|
;;
|
|
remove)
|
|
;&
|
|
offline)
|
|
do_without_error ifdown ${dev}
|
|
ipcmd='del'
|
|
cmdprefix='do_without_error'
|
|
;;
|
|
esac
|
|
|
|
case "${type_if}" in
|
|
tap)
|
|
metric=1
|
|
;;
|
|
vif)
|
|
metric=2
|
|
;;
|
|
*)
|
|
fatal "Unrecognised interface type ${type_if}"
|
|
;;
|
|
esac
|
|
|
|
# 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
|
|
${cmdprefix} ip route ${ipcmd} ${addr} dev ${dev} src ${main_ip} metric ${metric}
|
|
done
|
|
|
|
handle_iptable
|
|
|
|
call_hooks vif post
|
|
|
|
log debug "Successful vif-route ${command} for ${dev}."
|
|
if [ "${command}" = "online" ]
|
|
then
|
|
success
|
|
fi
|