mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
If a tap device is not given an explicit MAC address it will generate one randomly. The behaviour of the Linux bridge is to pickup the lowest MAC address of any port for use in for ARP, STP etc. If the tap device's randomly generated MAC address happens to be the lowest then this can cause all manner of strange networking glitches in both domain 0 and guests when the bridge suddenly takes over from the previously used MAC address. We choose FE:FF:FF:FF:FF:FF as it the numerically largest non-broadcast address. This ensures that the physical NIC device's port will have the lowest MAC address and therefore be the one picked up by the bridge. vif devices already have a MAC address of FE:FF:FF:FF:FF:FF set by netback already but there is no harm in forcing it a second time in the hotplug script. tap devices are added by the "add" event and therefore we should call setup_bridge_port then as well as for "online" which is caused by vif devices. Signed-off-by: Ian Campbell <ian.campbell@citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
108 lines
2.8 KiB
Bash
108 lines
2.8 KiB
Bash
#!/bin/bash
|
|
#============================================================================
|
|
# ${XEN_SCRIPT_DIR}/vif-bridge
|
|
#
|
|
# Script for configuring a vif in 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-bridge (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).
|
|
#
|
|
# 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"
|
|
|
|
bridge=${bridge:-}
|
|
bridge=$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")
|
|
|
|
if [ -z "$bridge" ]
|
|
then
|
|
bridge=$(brctl show | cut -d "
|
|
" -f 2 | cut -f 1)
|
|
|
|
if [ -z "$bridge" ]
|
|
then
|
|
fatal "Could not find bridge, and none was specified"
|
|
fi
|
|
else
|
|
#
|
|
# Old style bridge setup with netloop, used to have a bridge name
|
|
# of xenbrX, enslaving pethX and vif0.X, and then configuring
|
|
# eth0.
|
|
#
|
|
# New style bridge setup does not use netloop, so the bridge name
|
|
# is ethX and the physical device is enslaved pethX
|
|
#
|
|
# So if...
|
|
#
|
|
# - User asks for xenbrX
|
|
# - AND xenbrX doesn't exist
|
|
# - AND there is a ethX device which is a bridge
|
|
#
|
|
# ..then we translate xenbrX to ethX
|
|
#
|
|
# This lets old config files work without modification
|
|
#
|
|
if [ ! -e "/sys/class/net/$bridge" ] && [ -z "${bridge##xenbr*}" ]
|
|
then
|
|
if [ -e "/sys/class/net/eth${bridge#xenbr}/bridge" ]
|
|
then
|
|
bridge="eth${bridge#xenbr}"
|
|
fi
|
|
fi
|
|
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 "$dev"
|
|
add_to_bridge "$bridge" "$dev"
|
|
;;
|
|
|
|
offline)
|
|
do_without_error brctl delif "$bridge" "$dev"
|
|
do_without_error ifconfig "$dev" down
|
|
;;
|
|
|
|
add)
|
|
setup_bridge_port "$dev"
|
|
add_to_bridge "$bridge" "$dev"
|
|
;;
|
|
esac
|
|
|
|
if [ "$type_if" = vif ]; then
|
|
handle_iptable
|
|
fi
|
|
|
|
log debug "Successful vif-bridge $command for $dev, bridge $bridge."
|
|
if [ "$type_if" = vif -a "$command" = "online" ]
|
|
then
|
|
success
|
|
fi
|