From: Ben Pfaff Date: Wed, 18 Nov 2009 22:26:55 +0000 (-0800) Subject: Merge master branch into xs5.7. X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=dac3c52f893f7df16f935ef4875c5467abd4ea23;hp=-c;p=sliver-openvswitch.git Merge master branch into xs5.7. Conflicts: xenserver/README xenserver/automake.mk xenserver/etc_xensource_scripts_vif xenserver/usr_share_vswitch_scripts_dump-vif-details xenserver/vswitch-xen.spec --- dac3c52f893f7df16f935ef4875c5467abd4ea23 diff --combined xenserver/README index c11f447fa,ff692fd3f..9240910ef --- a/xenserver/README +++ b/xenserver/README @@@ -30,10 -30,6 +30,10 @@@ files are vswitch-related shell functions for the administrator's convenience. + etc_udev_xen-backend.rules + + udev rules for invoking the XenServer "vif" and "tap" scripts. + etc_xapi.d_plugins_vswitch-cfg-update xapi plugin script to update the cache of configuration items @@@ -48,6 -44,18 +48,12 @@@ vswitch-aware replacement for Citrix script of the same name. - root_vswitch_scripts_dump-vif-details - - Script to retrieve extended information about VIFs that are - needed by the controller. This is called by the "vif" script, - which is run when virtual interfaces are added and removed. - + usr_share_vswitch_scripts_refresh-xs-network-uuids + + Script to refresh bridge..xs-network-uuids keys, which + can get out-of-sync following a pool join. Running this script + is an alternative to rebooting the host. + root_vswitch_scripts_sysconfig.template Template for vswitch's /etc/sysconfig/vswitch configuration diff --combined xenserver/automake.mk index be0530e3a,221925cda..73cc590bf --- a/xenserver/automake.mk +++ b/xenserver/automake.mk @@@ -11,7 -11,6 +11,7 @@@ EXTRA_DIST += xenserver/etc_init.d_vswitch-xapi-update \ xenserver/etc_logrotate.d_vswitch \ xenserver/etc_profile.d_vswitch.sh \ + xenserver/etc_udev_xen-backend.rules \ xenserver/etc_xapi.d_plugins_vswitch-cfg-update \ xenserver/etc_xensource_scripts_vif \ xenserver/opt_xensource_libexec_interface-reconfigure \ @@@ -19,5 -18,6 +19,6 @@@ xenserver/usr_sbin_brctl \ xenserver/usr_sbin_xen-bugtool \ xenserver/usr_share_vswitch_scripts_sysconfig.template \ - xenserver/usr_share_vswitch_scripts_dump-vif-details \ + xenserver/usr_share_vswitch_scripts_vif-on-internal-bridge \ + xenserver/usr_share_vswitch_scripts_refresh-xs-network-uuids \ xenserver/vswitch-xen.spec diff --combined xenserver/etc_init.d_vswitch index 74162dcee,bd621c106..884755099 --- a/xenserver/etc_init.d_vswitch +++ b/xenserver/etc_init.d_vswitch @@@ -24,8 -24,8 +24,8 @@@ 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 @@@ -89,7 -89,7 +89,7 @@@ function insert_modules_if_required 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 } @@@ -105,16 -105,13 +105,13 @@@ function remove_modules 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 } @@@ -197,7 -194,7 +194,7 @@@ function start_brcompatd 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 @@@ -271,13 -268,12 +268,14 @@@ function start '--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 } @@@ -319,12 -315,7 +317,12 @@@ case "$1" i ;; 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 diff --combined xenserver/etc_xensource_scripts_vif index fdfc3205d,c649e926b..cede29c4d --- a/xenserver/etc_xensource_scripts_vif +++ b/xenserver/etc_xensource_scripts_vif @@@ -1,7 -1,17 +1,17 @@@ #!/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. @@@ -15,15 -25,24 +25,15 @@@ cfg_mod="/usr/bin/ovs-cfg-mod 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 @@@ -32,176 -51,96 +42,178 @@@ 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 diff --combined xenserver/vswitch-xen.spec index 94920116b,d8e32e48f..e177f37f9 --- a/xenserver/vswitch-xen.spec +++ b/xenserver/vswitch-xen.spec @@@ -71,16 -71,16 +71,18 @@@ install -m 755 xenserver/opt_xensource_ $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 @@@ -123,7 -123,6 +125,7 @@@ ca141d60061dcfdade73e75abc6529b5 /usr/ 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" @@@ -132,7 -131,6 +134,7 @@@ ca141d60061dcfdade73e75abc6529b5 /usr/ 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" @@@ -213,8 -211,7 +215,8 @@@ for f in /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") @@@ -273,8 -270,7 +275,8 @@@ if [ "$1" = "0" ]; then # $1 = 1 fo /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 @@@ -309,14 -305,14 +311,15 @@@ f /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