test -e /etc/sysconfig/vswitch && . /etc/sysconfig/vswitch
# General config variables in /etc/sysconfig/vswitch
-: ${ENABLE_BRCOMPAT:=y}
-: ${ENABLE_FAKE_PROC_NET:=y}
+: ${ENABLE_BRCOMPAT:=n}
+: ${ENABLE_FAKE_PROC_NET:=n}
: ${FORCE_COREFILES:=y}
# Config variables specific to ovs-vswitchd
action "Inserting llc module" modprobe llc
action "Inserting openvswitch module" modprobe openvswitch_mod
fi
- if [ -n "$BRCOMPATD_PIDFILE" ] && ! lsmod | grep -q "brcompat_mod"; then
+ if [ "$ENABLE_BRCOMPAT" = "y" ] && [ -n "$BRCOMPATD_PIDFILE" ] && ! lsmod | grep -q "brcompat_mod"; then
action "Inserting brcompat module" modprobe brcompat_mod
fi
}
function reload_vswitchd {
if [ -f "$VSWITCHD_PIDFILE" ]; then
- "$appctl" \
- --target=ovs-vswitchd.$(cat "$VSWITCHD_PIDFILE").ctl \
- --execute=vswitchd/reload
+ "$appctl" --target=/var/run/ovs-vswitchd.`cat $VSWITCHD_PIDFILE`.ctl vswitchd/reload
fi
}
function reload_brcompatd {
if [ -f "$BRCOMPATD_PIDFILE" ]; then
- "$appctl" \
- --target=ovs-brcompatd.$(cat "$BRCOMPATD_PIDFILE").ctl --reopen
+ "$appctl" --target=/var/run/ovs-brcompatd.`cat $BRCOMPATD_PIDFILE`.ctl vlog/reopen
fi
}
valgrind_opt="valgrind --log-file=$BRCOMPATD_VALGRIND_LOG $BRCOMPATD_VALGRIND_OPT"
daemonize="n"
fi
- appctl_cmd="$appctl -t /var/run/ovs-vswitchd.\`cat $VSWITCHD_PIDFILE\`.ctl -e '%s'"
+ appctl_cmd="$appctl --target=/var/run/ovs-vswitchd.\`cat $VSWITCHD_PIDFILE\`.ctl %s"
if [ "$daemonize" != "y" ]; then
# Start in background and force a "success" message
action "Starting ovs-brcompatd ($strace_opt$valgrind_opt)" true
'--del-match=port.*' \
'--del-match=bonding.*' \
'--del-match=iface.*' \
- '--del-match=vlan.*'
+ '--del-match=vlan.*.trunks=*' \
+ '--del-match=vlan.*.tag=*'
fi
start_vswitchd
- start_brcompatd
+ if [ "${ENABLE_BRCOMPAT}" = "y" ] ; then
+ start_brcompatd
+ fi
reload_vswitchd # ensures ovs-vswitchd has fully read config file.
touch /var/lock/subsys/vswitch
}
;;
status)
status -p ovs-vswitchd.pid ovs-vswitchd
- status -p ovs-brcompatd.pid ovs-brcompatd
+ rc=$?
+ if [ $rc -eq 0 ] && [ "$ENABLE_BRCOMPAT" = "y" ] ; then
+ status -p ovs-brcompatd.pid ovs-brcompatd
+ rc=$?
+ fi
+ exit $rc
;;
version)
/usr/sbin/ovs-vswitchd -V
#!/bin/sh
- # Copyright (C) 2008,2009 Citrix Systems, Inc. All rights reserved.
+ # Copyright (C) 2008,2009 Citrix Systems, Inc.
# Copyright (C) 2009 Nicira Networks, Inc.
+ #
+ # This program is free software; you can redistribute it and/or modify
+ # it under the terms of the GNU Lesser General Public License as published
+ # by the Free Software Foundation; version 2.1 only. with the special
+ # exception on linking described in file LICENSE.
+ #
+ # This program is distributed in the hope that it will be useful,
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ # GNU Lesser General Public License for more details.
# CA-23900: Warning: when VIFs are added to windows guests with PV drivers the backend vif device is registered,
# unregistered and then registered again. This causes the udev event to fire twice and this script runs twice.
vsctl="/usr/bin/ovs-vsctl"
dump_vif_details="/usr/share/vswitch/scripts/dump-vif-details"
service="/sbin/service"
-
-TYPE=`echo ${XENBUS_PATH} | cut -f 2 -d '/'`
-DOMID=`echo ${XENBUS_PATH} | cut -f 3 -d '/'`
-DEVID=`echo ${XENBUS_PATH} | cut -f 4 -d '/'`
-
-XAPI=/xapi/${DOMID}/hotplug/${TYPE}/${DEVID}
-HOTPLUG=/xapi/${DOMID}/hotplug/${TYPE}/${DEVID}
-PRIVATE=/xapi/${DOMID}/private/${TYPE}/${DEVID}
-BRCTL=/usr/sbin/brctl
-IP=/sbin/ip
-
+IP="/sbin/ip"
+vif_on_internal_bridge="/usr/share/vswitch/scripts/vif-on-internal-bridge"
handle_promiscuous()
{
- local arg=$(xenstore-read "${PRIVATE}/other-config/promiscuous")
+ local arg=$(xenstore-read "${PRIVATE}/other-config/promiscuous" 2>/dev/null)
if [ $? -eq 0 -a -n "${arg}" ] ; then
case "${arg}" in
- true|on) logger -t script-vif "${vif}: Promiscuous ports are not supported via vSwitch." ;;
+ true|on) logger -t script-vif "${dev}: Promiscuous ports are not supported via vSwitch." ;;
*) ;;
esac
fi
handle_ethtool()
{
local opt=$1
- local arg=$(xenstore-read "${PRIVATE}/other-config/ethtool-${opt}")
+ local arg=$(xenstore-read "${PRIVATE}/other-config/ethtool-${opt}" 2>/dev/null)
if [ $? -eq 0 -a -n "${arg}" ] ; then
case "${arg}" in
- true|on) /sbin/ethtool -K "${vif}" "${opt}" on ;;
- false|off) /sbin/ethtool -K "${vif}" "${opt}" off ;;
- *) logger -t scripts-vif "Unknown ethtool argument ${opt}=${arg} on ${vif}/${VIFUUID}" ;;
+ true|on) /sbin/ethtool -K "${dev}" "${opt}" on ;;
+ false|off) /sbin/ethtool -K "${dev}" "${opt}" off ;;
+ *) logger -t scripts-vif "Unknown ethtool argument ${opt}=${arg} on ${dev}/${VIFUUID}" ;;
esac
fi
}
handle_mtu()
{
- local mtu=$(xenstore-read "${PRIVATE}/MTU")
+ local mtu=$(xenstore-read "${PRIVATE}/MTU" 2>/dev/null)
if [ $? -eq 0 -a -n "${mtu}" ]; then
- echo "${mtu}" > /sys/class/net/${vif}/mtu
+ echo "${mtu}" > /sys/class/net/${dev}/mtu
fi
}
+handle_vif_details()
+{
+ local vif_details=
+ local net_uuid=$(xenstore-read "${PRIVATE}/network-uuid" 2>/dev/null)
+ if [ -n "${net_uuid}" ] ; then
+ vif_details="$vif_details --add=port.${dev}.net-uuid=${net_uuid}"
+ fi
+
+ local address=$(xenstore-read "/local/domain/$DOMID/device/vif/$DEVID/mac" 2>/dev/null)
+ if [ -n "${address}" ] ; then
+ vif_details="$vif_details --add=port.${dev}.vif-mac=${address}"
+ fi
+
+ local vif_uuid=$(xenstore-read "${PRIVATE}/vif-uuid" 2>/dev/null)
+ if [ -n "${vif_uuid}" ] ; then
+ vif_details="$vif_details --add=port.${dev}.vif-uuid=${vif_uuid}"
+ fi
+
+ local vm=$(xenstore-read "/local/domain/$DOMID/vm" 2>/dev/null)
+ if [ $? -eq 0 -a -n "${vm}" ] ; then
+ local vm_uuid=$(xenstore-read "$vm/uuid" 2>/dev/null)
+ fi
+ if [ -n "${vm_uuid}" ] ; then
+ vif_details="$vif_details --add=port.${dev}.vm-uuid=${vm_uuid}"
+ fi
+
+ # vNetManager needs to know the network UUID(s) associated with
+ # each datapath. Normally interface-reconfigure adds them, but
+ # interface-reconfigure never gets called for internal networks
+ # (xapi does the addbr ioctl internally), so we have to do it
+ # here instead for internal networks. This is only acceptable
+ # because xapi is lazy about creating internal networks: it
+ # only creates one just before it adds the first vif to it.
+ # There may still be a brief delay between the initial
+ # ovs-vswitchd connection to vNetManager and setting this
+ # configuration variable, but vNetManager can tolerate that.
+ local internal=$(${vif_on_internal_bridge} ${DOMID} ${DEVID})
+ if [ "$internal" = "true" ]; then
+ local bridge=$(xenstore-read "${PRIVATE}/bridge" 2>/dev/null)
+ local net_uuid=$(xenstore-read "${PRIVATE}/network-uuid" 2>/dev/null)
+ local key="bridge.${bridge}.xs-network-uuids"
+
+ vif_details="$vif_details --del-match=${key}=*"
+ vif_details="$vif_details --add=${key}=${net_uuid}"
+ fi
+
+ echo ${vif_details}
+}
+
add_to_bridge()
{
local address=$(xenstore-read "${PRIVATE}/bridge-MAC")
if [ $? -ne 0 -o -z "${address}" ]; then
logger -t scripts-vif "Failed to read ${PRIVATE}/bridge-MAC from xenstore"
+ exit 1
fi
local bridge=$(xenstore-read "${PRIVATE}/bridge")
if [ $? -ne 0 -o -z "${bridge}" ]; then
logger -t scripts-vif "Failed to read ${PRIVATE}/bridge from xenstore"
+ exit 1
fi
- logger -t scripts-vif "Adding ${vif} to ${bridge} with address ${address}"
+ logger -t scripts-vif "Adding ${dev} to ${bridge} with address ${address}"
local VLAN_ID=$($vsctl br-to-vlan $bridge)
local vid=
if [ "$VLAN_ID" -ne 0 ] ; then
bridge=$($vsctl br-to-parent $bridge)
- vid="--add=vlan.${dev}.tag=${VLAN_ID}"
+ vid="--add=vlan.${vif}.tag=${VLAN_ID}"
fi
- ${IP} link set "${vif}" down || logger -t scripts-vif "Failed to ip link set ${vif} down"
- ${IP} link set "${vif}" arp off || logger -t scripts-vif "Failed to ip link set ${vif} arp off"
- ${IP} link set "${vif}" multicast off || logger -t scripts-vif "Failed to ip link set ${vif} multicast off"
- ${IP} link set "${vif}" address "${address}" || logger -t scripts-vif "Failed to ip link set ${vif} address ${address}"
- ${IP} addr flush "${vif}" || logger -t scripts-vif "Failed to ip addr flush ${vif}"
-
- local vif_details=$($dump_vif_details $DOMID $DEVID)
- if [ $? -ne 0 -o -z "${vif_details}" ]; then
- logger -t scripts-vif "Failed to retrieve vif details for vswitch"
+ if [ "$type" = "vif" ] ; then
+ local vif_details=$(handle_vif_details)
fi
+ ${IP} link set "${dev}" down || logger -t scripts-vif "Failed to ip link set ${dev} down"
+ ${IP} link set "${dev}" arp off || logger -t scripts-vif "Failed to ip link set ${dev} arp off"
+ ${IP} link set "${dev}" multicast off || logger -t scripts-vif "Failed to ip link set ${dev} multicast off"
+ ${IP} link set "${dev}" address "${address}" || logger -t scripts-vif "Failed to ip link set ${dev} address ${address}"
+ ${IP} addr flush "${dev}" || logger -t scripts-vif "Failed to ip addr flush ${dev}"
+
$cfg_mod -F /etc/ovs-vswitchd.conf \
- --del-match="bridge.*.port=$vif" \
- --del-match="vlan.$vif.trunks=*" \
- --del-match="vlan.$vif.tag=*" \
- --del-match="port.$vif.[!0-9]*" \
- --add="bridge.$bridge.port=$vif" \
+ --del-match="bridge.*.port=${dev}" \
- --del-match="vlan.${dev}.[!0-9]*" \
++ --del-match="vlan.${dev}.trunks=*" \
++ --del-match="vlan.${dev}.tags=*" \
+ --del-match="port.${dev}.[!0-9]*" \
+ --add="bridge.$bridge.port=${dev}" \
$vid $vif_details -c
$service vswitch reload
- ${IP} link set "${vif}" up || logger -t scripts-vif "Failed to ip link set ${vif} up"
+ ${IP} link set "${dev}" up || logger -t scripts-vif "Failed to ip link set ${dev} up"
}
-echo Called as "$@" "$TYPE" "$DOMID" "$DEVID" | logger -t scripts-vif
-case "$1" in
-online)
- handle_ethtool rx
- handle_ethtool tx
- handle_ethtool sg
- handle_ethtool tso
- handle_ethtool ufo
- handle_ethtool gso
+type=$2
- handle_mtu
- add_to_bridge
- handle_promiscuous
+case ${type} in
+ vif)
+ DOMID=`echo ${XENBUS_PATH} | cut -f 3 -d '/'`
+ DEVID=`echo ${XENBUS_PATH} | cut -f 4 -d '/'`
+ dev=vif${DOMID}.${DEVID}
+ ;;
+ tap)
+ dev=$INTERFACE
+ DOMID=`echo ${dev#tap} | cut -f 1 -d '.'`
+ DEVID=`echo ${dev#tap} | cut -f 2 -d '.'`
+ ;;
+ *)
+ logger -t scripts-vif "unknown interface type ${type}"
+ exit 1
+ ;;
+esac
- xenstore-write "${HOTPLUG}/vif" "${vif}"
- xenstore-write "${HOTPLUG}/hotplug" "online"
+XAPI=/xapi/${DOMID}/hotplug/vif/${DEVID}
+HOTPLUG=/xapi/${DOMID}/hotplug/vif/${DEVID}
+PRIVATE=/xapi/${DOMID}/private/vif/${DEVID}
- # xs-xen.pq.hq:91e986b8e49f netback-wait-for-hotplug
- xenstore-write "/local/domain/0/backend/vif/${DOMID}/${DEVID}/hotplug-status" "connected"
+echo Called as "$@" "$DOMID" "$DEVID" | logger -t scripts-vif
+case "$1" in
+online)
+ if [ "${type}" = "vif" ] ; then
+ handle_ethtool rx
+ handle_ethtool tx
+ handle_ethtool sg
+ handle_ethtool tso
+ handle_ethtool ufo
+ handle_ethtool gso
+
+ handle_mtu
+ add_to_bridge
+ handle_promiscuous
+
+ xenstore-write "${HOTPLUG}/vif" "${dev}"
+ xenstore-write "${HOTPLUG}/hotplug" "online"
+
+ # xs-xen.pq.hq:91e986b8e49f netback-wait-for-hotplug
+ xenstore-write "/local/domain/0/backend/vif/${DOMID}/${DEVID}/hotplug-status" "connected"
+ fi
+ ;;
+add)
+ if [ "${type}" = "tap" ] ; then
+ add_to_bridge
+ fi
;;
+
remove)
- xenstore-rm "${HOTPLUG}/hotplug"
- vif=vif${DOMID}.${DEVID}
- logger -t scripts-vif "${vif} has been removed"
+ if [ "${type}" = "vif" ] ;then
+ xenstore-rm "${HOTPLUG}/hotplug"
+ fi
+ logger -t scripts-vif "${dev} has been removed"
$cfg_mod -vANY:console:emer -F /etc/ovs-vswitchd.conf \
- --del-match="bridge.*.port=${vif}" \
- --del-match="vlan.${vif}.trunks=*" \
- --del-match="vlan.${vif}.tag=*" \
- --del-match="port.${vif}.[!0-9]*" -c
+ --del-match="bridge.*.port=${dev}" \
- --del-match="vlan.${dev}.[!0-9]*" \
++ --del-match="vlan.${dev}.trunks=*" \
++ --del-match="vlan.${dev}.tag=*" \
+ --del-match="port.${dev}.[!0-9]*" -c
$service vswitch reload
;;
esac
$RPM_BUILD_ROOT/usr/share/vswitch/scripts/interface-reconfigure
install -m 755 xenserver/etc_xensource_scripts_vif \
$RPM_BUILD_ROOT/usr/share/vswitch/scripts/vif
-install -m 755 xenserver/usr_share_vswitch_scripts_dump-vif-details \
- $RPM_BUILD_ROOT/usr/share/vswitch/scripts/dump-vif-details
+install -m 755 xenserver/usr_share_vswitch_scripts_vif-on-internal-bridge \
+ $RPM_BUILD_ROOT/usr/share/vswitch/scripts/vif-on-internal-bridge
+ install -m 755 xenserver/usr_share_vswitch_scripts_refresh-xs-network-uuids \
+ $RPM_BUILD_ROOT/usr/share/vswitch/scripts/refresh-xs-network-uuids
install -m 755 xenserver/usr_sbin_xen-bugtool \
$RPM_BUILD_ROOT/usr/share/vswitch/scripts/xen-bugtool
install -m 755 xenserver/usr_sbin_brctl \
$RPM_BUILD_ROOT/usr/share/vswitch/scripts/brctl
install -m 755 xenserver/usr_share_vswitch_scripts_sysconfig.template \
$RPM_BUILD_ROOT/usr/share/vswitch/scripts/sysconfig.template
+install -m 644 xenserver/etc_udev_xen-backend.rules \
+ $RPM_BUILD_ROOT/usr/share/vswitch/scripts/xen-backend.rules
install -m 644 \
xenserver/usr_lib_xsconsole_plugins-base_XSFeatureVSwitch.py \
$RPM_BUILD_ROOT/usr/share/vswitch/scripts/XSFeatureVSwitch.py
b8e9835862ef1a9cec2a3f477d26c989 /etc/xensource/scripts/vif
51970ad613a3996d5997e18e44db47da /opt/xensource/libexec/interface-reconfigure
5654c8c36699fcc8744ca9cd5b855414 /usr/sbin/xen-bugtool
+883820a78723ee21340f31099b18f18e /etc/udev/xen-backend.rules
EOF
then
printf "\nVerified host scripts from XenServer 5.5.0.\n\n"
b8e9835862ef1a9cec2a3f477d26c989 /etc/xensource/scripts/vif
ce451d3c985fd1db6497a363f0d9dedb /opt/xensource/libexec/interface-reconfigure
2b53f500431fcba5276c896e9e4281b9 /usr/sbin/xen-bugtool
+883820a78723ee21340f31099b18f18e /etc/udev/xen-backend.rules
EOF
then
printf "\nVerified host scripts from XenServer 5.5.900.\n\n"
/opt/xensource/libexec/interface-reconfigure \
/etc/xensource/scripts/vif \
/usr/sbin/xen-bugtool \
- /usr/sbin/brctl
+ /usr/sbin/brctl \
+ /etc/udev/xen-backend.rules
do
s=$(basename "$f")
t=$(readlink "$f")
/opt/xensource/libexec/interface-reconfigure \
/etc/xensource/scripts/vif \
/usr/sbin/xen-bugtool \
- /usr/sbin/brctl
+ /usr/sbin/brctl \
+ /etc/udev/xen-backend.rules
do
s=$(basename "$f")
if [ ! -f "/usr/lib/vswitch/xs-original/$s" ]; then
/etc/profile.d/vswitch.sh
/lib/modules/%{xen_version}/kernel/net/vswitch/openvswitch_mod.ko
/lib/modules/%{xen_version}/kernel/net/vswitch/brcompat_mod.ko
-/usr/share/vswitch/scripts/dump-vif-details
+ /usr/share/vswitch/scripts/refresh-xs-network-uuids
/usr/share/vswitch/scripts/interface-reconfigure
/usr/share/vswitch/scripts/vif
/usr/share/vswitch/scripts/xen-bugtool
/usr/share/vswitch/scripts/XSFeatureVSwitch.py
/usr/share/vswitch/scripts/brctl
/usr/share/vswitch/scripts/sysconfig.template
+/usr/share/vswitch/scripts/vif-on-internal-bridge
+/usr/share/vswitch/scripts/xen-backend.rules
# Following two files are generated automatically by rpm. We don't
# really need them and they won't be used on the XenServer, but there
# isn't an obvious place to get rid of them since they are generated