WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-api

[Xen-API] [PATCH] vif hotplug: Support both Linux bridge and openvswitch

To: xen-api@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-API] [PATCH] vif hotplug: Support both Linux bridge and openvswitch
From: Ian Campbell <ian.campbell@xxxxxxxxxx>
Date: Fri, 18 Dec 2009 14:18:30 +0000
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
Delivery-date: Fri, 18 Dec 2009 06:24:13 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-api-request@lists.xensource.com?subject=help>
List-id: Discussion of API issues surrounding Xen <xen-api.lists.xensource.com>
List-post: <mailto:xen-api@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>, <mailto:xen-api-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>, <mailto:xen-api-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-api-bounces@xxxxxxxxxxxxxxxxxxx
interface-reconfigure and xapi both understand
/etc/xensource/network.conf so fill in the final piece by teaching the
vif hotplug script about it as well.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

diff -r 968d8368e08c -r 62bd47fd5c5b scripts/vif
--- a/scripts/vif       Fri Dec 18 14:18:01 2009 +0000
+++ b/scripts/vif       Fri Dec 18 14:18:01 2009 +0000
@@ -20,17 +20,28 @@
 
 # Keep other-config/ keys in sync with device.ml:vif_udev_keys
 
-BRCTL=/usr/sbin/brctl
-IP=/sbin/ip
+BRCTL="/usr/sbin/brctl"
+IP="/sbin/ip"
+
+cfg_mod="/usr/bin/ovs-cfg-mod"
+vsctl="/usr/bin/ovs-vsctl"
+service="/sbin/service"
 
 handle_promiscuous()
 {
     local arg=$(xenstore-read "${PRIVATE}/other-config/promiscuous" 
2>/dev/null)
     if [ $? -eq 0 -a -n "${arg}" ] ; then
-        case "${arg}" in 
-            true|on) echo 1 > /sys/class/net/${dev}/brport/promisc ;;
-            *) echo 0 > /sys/class/net/${dev}/brport/promisc ;;
-        esac
+       case $NETWORK_MODE in
+           bridge)
+               case "${arg}" in 
+                   true|on) echo 1 > /sys/class/net/${dev}/brport/promisc ;;
+                   *) echo 0 > /sys/class/net/${dev}/brport/promisc ;;
+               esac
+               ;;
+           vswitch)
+               logger -t script-vif "${dev}: Promiscuous ports are not 
supported via vSwitch."
+               ;;
+       esac
     fi
 }
 
@@ -55,6 +66,34 @@
     fi
 }
 
+handle_vswitch_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
+    echo ${vif_details}
+}
+
 add_to_bridge()
 {
     local address=$(xenstore-read "${PRIVATE}/bridge-MAC")
@@ -75,15 +114,65 @@
     ${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}"
 
+    case $NETWORK_MODE in
+       bridge)
+           ${BRCTL} setfd "${bridge}" 0                        || logger -t 
scripts-vif "Failed to brctl setfd ${bridge} 0"
+           ${BRCTL} addif "${bridge}" "${dev}"                 || logger -t 
scripts-vif "Failed to brctl addif ${bridge} ${dev}"
+           ;;
+       vswitch)
+           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}"
+           fi
 
-    ${BRCTL} setfd "${bridge}" 0                        || logger -t 
scripts-vif "Failed to brctl setfd ${bridge} 0"
-    ${BRCTL} addif "${bridge}" "${dev}"                 || logger -t 
scripts-vif "Failed to brctl addif ${bridge} ${dev}"
+           if [ "$TYPE" = "vif" ] ; then
+               local vif_details=$(handle_vswitch_vif_details)
+           fi
+
+           $cfg_mod -F /etc/ovs-vswitchd.conf \
+               --del-match="bridge.*.port=${dev}" \
+               --del-match="vlan.${dev}.[!0-9]*" \
+               --del-match="port.${dev}.[!0-9]*" \
+               --add="bridge.$bridge.port=${dev}" \
+               $vid $vif_details -c 
+           $service vswitch reload
+           ;;
+    esac
+           
     ${IP} link set "${dev}" up                          || logger -t 
scripts-vif "Failed to ip link set ${dev} up"
 }
 
-type=$2
+remove_from_bridge()
+{
+    case $NETWORK_MODE in
+       bridge)
+           # Nothing to do
+           ;;
+       vswitch)
+           $cfg_mod -vANY:console:emer -F /etc/ovs-vswitchd.conf \
+               --del-match="bridge.*.port=${dev}" \
+               --del-match="vlan.${dev}.[!0-9]*" \
+               --del-match="port.${dev}.[!0-9]*" -c
+           $service vswitch reload
+           ;;
+    esac
+}
 
-case ${type} in
+NETWORK_MODE=$(cat /etc/xensource/network.conf)
+ACTION=$1
+TYPE=$2
+
+case $NETWORK_MODE in
+    bridge|vswitch) ;;
+    *)
+       logger -t scripts-vif "Unknown network mode $NETWORK_MODE"
+       exit 1
+       ;;
+esac
+
+case ${TYPE} in
     vif)
        DOMID=`echo ${XENBUS_PATH} | cut -f 3 -d '/'`
        DEVID=`echo ${XENBUS_PATH} | cut -f 4 -d '/'`
@@ -95,7 +184,7 @@
        DEVID=`echo ${dev#tap} | cut -f 2 -d '.'`
        ;;
     *)  
-       logger -t scripts-vif "unknown interface type ${type}"
+       logger -t scripts-vif "unknown interface type ${TYPE}"
        exit 1
        ;;
 esac
@@ -104,10 +193,10 @@
 HOTPLUG=/xapi/${DOMID}/hotplug/vif/${DEVID}
 PRIVATE=/xapi/${DOMID}/private/vif/${DEVID}
 
-echo Called as "$@" "$DOMID" "$DEVID" | logger -t scripts-vif
-case "$1" in
+logger -t scripts-vif "Called as \"$@\" domid:$DOMID devid:$DEVID 
mode:$NETWORK_MODE"
+case "${ACTION}" in
 online)
-       if [ "${type}" = "vif" ] ; then
+       if [ "${TYPE}" = "vif" ] ; then
            handle_ethtool rx
            handle_ethtool tx
            handle_ethtool sg
@@ -128,15 +217,16 @@
        ;;
 
 add)
-       if [ "${type}" = "tap" ] ; then
+       if [ "${TYPE}" = "tap" ] ; then
            add_to_bridge
        fi
        ;;
 
 remove)
-       if [ "${type}" = "vif" ] ;then
+       if [ "${TYPE}" = "vif" ] ;then
            xenstore-rm "${HOTPLUG}/hotplug"
        fi
        logger -t scripts-vif "${dev} has been removed"
+       remove_from_bridge
        ;;
 esac

_______________________________________________
xen-api mailing list
xen-api@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/mailman/listinfo/xen-api

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-API] [PATCH] vif hotplug: Support both Linux bridge and openvswitch, Ian Campbell <=