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-devel

[Xen-devel] [PATCH 08 of 10] Tools-side support for creating and destroy

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH 08 of 10] Tools-side support for creating and destroying netchannel2 interfaces
From: <steven.smith@xxxxxxxxxx>
Date: Sun, 4 Oct 2009 16:00:38 +0100
Cc: keir.fraser@xxxxxxxxxx, joserenato.santos@xxxxxx
Delivery-date: Sun, 04 Oct 2009 08:10:13 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1254668430@xxxxxxxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Steven Smith <steven.smith@xxxxxxxxxxxxx>
# Date 1222085454 -3600
# Node ID d6dfe609da5a07643a1564aa07c1063960903ffc
# Parent  0f3f1ea314eabe9c73d11b7f68db1a479e0db006
Tools-side support for creating and destroying netchannel2 interfaces.

Signed-off-by: Steven Smith <steven.smith@xxxxxxxxxx>

diff -r 0f3f1ea314ea -r d6dfe609da5a tools/hotplug/Linux/Makefile
--- a/tools/hotplug/Linux/Makefile      Fri Nov 28 15:43:42 2008 +0000
+++ b/tools/hotplug/Linux/Makefile      Mon Sep 22 13:10:54 2008 +0100
@@ -11,6 +11,7 @@
 XEN_SCRIPTS = network-bridge vif-bridge
 XEN_SCRIPTS += network-route vif-route
 XEN_SCRIPTS += network-nat vif-nat
+XEN_SCRIPTS += vif2
 XEN_SCRIPTS += block
 XEN_SCRIPTS += block-enbd block-nbd
 XEN_SCRIPTS += blktap
diff -r 0f3f1ea314ea -r d6dfe609da5a tools/hotplug/Linux/vif2
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/hotplug/Linux/vif2  Mon Sep 22 13:10:54 2008 +0100
@@ -0,0 +1,46 @@
+#!/bin/bash
+
+dir=$(dirname "$0")
+. "$dir/xen-hotplug-common.sh"
+. "$dir/xen-network-common.sh"
+
+bridge=$(xenstore_read_default "$XENBUS_PATH/bridge" "$bridge")
+if [ -z "$bridge" ]
+    then
+    nr_bridges=$(($(brctl show | cut -f 1 | grep -v "^$" | wc -l) - 1))
+    if [ "$nr_bridges" != 1 ]
+       then
+       fatal "no bridge specified, and don't know which one to use 
($nr_bridges found)"
+    fi
+    bridge=$(brctl show | cut -d "
+" -f 2 | cut -f 1)
+fi
+
+command="$1"
+shift
+
+case "$command" in
+    "online")
+       if [ "$bridge" != "-" ]
+           then
+           setup_bridge_port "$vif"
+           add_to_bridge "$bridge" "$vif"
+       else
+           # Just let the normal udev rules for interfaces handle it.
+           true
+       fi
+       success
+       ;;
+
+    "add")
+       success
+       ;;
+
+    "remove")
+       ;;
+
+    *)
+       echo "Unknown command: $command"
+       echo 'Valid commands are: add, remove, online'
+       exit 1
+esac
diff -r 0f3f1ea314ea -r d6dfe609da5a tools/hotplug/Linux/xen-backend.rules
--- a/tools/hotplug/Linux/xen-backend.rules     Fri Nov 28 15:43:42 2008 +0000
+++ b/tools/hotplug/Linux/xen-backend.rules     Mon Sep 22 13:10:54 2008 +0100
@@ -1,8 +1,9 @@
 SUBSYSTEM=="xen-backend", KERNEL=="tap*", RUN+="/etc/xen/scripts/blktap 
$env{ACTION}"
 SUBSYSTEM=="xen-backend", KERNEL=="vbd*", RUN+="/etc/xen/scripts/block 
$env{ACTION}"
 SUBSYSTEM=="xen-backend", KERNEL=="vtpm*", RUN+="/etc/xen/scripts/vtpm 
$env{ACTION}"
-SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="online", RUN+="$env{script} 
online"
-SUBSYSTEM=="xen-backend", KERNEL=="vif*", ACTION=="offline", 
RUN+="$env{script} offline"
+SUBSYSTEM=="xen-backend", KERNEL=="vif2-*", RUN+="/etc/xen/scripts/vif2 
$env{ACTION}"
+SUBSYSTEM=="xen-backend", KERNEL=="vif-*", ACTION=="online", 
RUN+="$env{script} online"
+SUBSYSTEM=="xen-backend", KERNEL=="vif-*", ACTION=="offline", 
RUN+="$env{script} offline"
 SUBSYSTEM=="xen-backend", KERNEL=="vscsi*", RUN+="/etc/xen/scripts/vscsi 
$env{ACTION}"
 SUBSYSTEM=="xen-backend", ACTION=="remove", 
RUN+="/etc/xen/scripts/xen-hotplug-cleanup"
 KERNEL=="evtchn", NAME="xen/%k"
diff -r 0f3f1ea314ea -r d6dfe609da5a tools/python/xen/xend/XendDevices.py
--- a/tools/python/xen/xend/XendDevices.py      Fri Nov 28 15:43:42 2008 +0000
+++ b/tools/python/xen/xend/XendDevices.py      Mon Sep 22 13:10:54 2008 +0100
@@ -19,7 +19,7 @@
 # A collection of DevControllers 
 #
 
-from xen.xend.server import blkif, netif, tpmif, pciif, iopif, irqif, vfbif, 
vscsiif
+from xen.xend.server import blkif, netif, tpmif, pciif, iopif, irqif, vfbif, 
vscsiif, netif2
 from xen.xend.server.BlktapController import BlktapController, 
Blktap2Controller
 from xen.xend.server.ConsoleController import ConsoleController
 
@@ -37,6 +37,7 @@
     controllers = {
         'vbd': blkif.BlkifController,
         'vif': netif.NetifController,
+        'vif2': netif2.NetifController2,
         'vtpm': tpmif.TPMifController,
         'pci': pciif.PciController,
         'ioports': iopif.IOPortsController,
diff -r 0f3f1ea314ea -r d6dfe609da5a tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Fri Nov 28 15:43:42 2008 +0000
+++ b/tools/python/xen/xend/XendDomainInfo.py   Mon Sep 22 13:10:54 2008 +0100
@@ -1222,7 +1222,7 @@
                         break
                 self._waitForDevice_destroy(deviceClass, devid, backend)
 
-        if rm_cfg:
+        if rm_cfg and deviceClass != "vif2":
             if deviceClass == 'vif':
                 if self.domid is not None:
                     mac = ''
diff -r 0f3f1ea314ea -r d6dfe609da5a tools/python/xen/xend/server/netif2.py
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/python/xen/xend/server/netif2.py    Mon Sep 22 13:10:54 2008 +0100
@@ -0,0 +1,163 @@
+#============================================================================
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of version 2.1 of the GNU Lesser General Public
+# License as published by the Free Software Foundation.
+#
+# This library 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.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#============================================================================
+# Copyright (C) 2004, 2005 Mike Wray <mike.wray@xxxxxx>
+# Copyright (C) 2005 XenSource Ltd
+# Copyright (C) 2008 Citrix Systems Inc.
+#============================================================================
+#
+# Based closely on netif.py.
+#
+
+"""Support for virtual network interfaces, version 2.
+"""
+
+import os
+import random
+import re
+import time
+
+from xen.xend import XendOptions
+from xen.xend.server.DevController import DevController
+from xen.xend.XendError import VmError
+from xen.xend.XendXSPolicyAdmin import XSPolicyAdminInstance
+from xen.xend.xenstore.xstransact import xstransact
+import xen.util.xsm.xsm as security
+
+from xen.xend.XendLogging import log
+
+xoptions = XendOptions.instance()
+
+def randomMAC():
+    """Generate a random MAC address.
+
+    Uses OUI (Organizationally Unique Identifier) 00-16-3E, allocated to
+    Xensource, Inc. The OUI list is available at
+    http://standards.ieee.org/regauth/oui/oui.txt.
+
+    The remaining 3 fields are random, with the first bit of the first
+    random field set 0.
+
+    @return: MAC address string
+    """
+    mac = [ 0x00, 0x16, 0x3e,
+            random.randint(0x00, 0x7f),
+            random.randint(0x00, 0xff),
+            random.randint(0x00, 0xff) ]
+    return ':'.join(map(lambda x: "%02x" % x, mac))
+
+class NetifController2(DevController):
+    def __init__(self, vm):
+        DevController.__init__(self, vm)
+
+    def getDeviceDetails(self, config):
+        """@see DevController.getDeviceDetails"""
+
+        devid = self.allocateDeviceID()
+
+        bridge = config.get('bridge')
+        back_mac = config.get('back_mac')
+        if not back_mac:
+            if bridge:
+                back_mac = "fe:ff:ff:ff:ff:ff"
+            else:
+                back_mac = randomMAC()
+        front_mac = config.get('front_mac') or randomMAC()
+        front_trust = config.get("trusted") or "0"
+        back_trust = config.get("back_trusted") or "1"
+        max_bypasses = config.get("max_bypasses") or "5"
+        pdev = config.get('pdev')
+        front_filter = config.get("front_filter_mac")
+        if front_filter == None:
+            if back_trust == "0":
+                front_filter = "1"
+            else:
+                front_filter = "0"
+        back_filter = config.get("filter_mac")
+        if back_filter == None:
+            if front_trust == "0":
+                back_filter = "1"
+            else:
+                back_filter = "0"
+        back = { 'mac': back_mac, 'remote-mac': front_mac,
+                 'handle': "%i" % devid, 'local-trusted': back_trust,
+                 'remote-trusted': front_trust, 'filter-mac': back_filter,
+                 'max-bypasses': max_bypasses }
+
+        front = { 'mac': front_mac, 'remote-mac': back_mac,
+                  'local-trusted': front_trust, 'remote-trusted': back_trust,
+                  'filter-mac': front_filter }
+
+        if bridge:
+            back['bridge'] = bridge
+
+        if pdev:
+            back['pdev'] = pdev
+    
+        return (devid, back, front)
+
+    def getDeviceConfiguration(self, devid, transaction = None):
+        """@see DevController.configuration"""
+
+        if transaction is None:
+            read_fn = xstransact.Read
+        else:
+            read_fn = transaction.read
+        def front_read(x):
+            return read_fn(frontpath + x)
+        def back_read(x):
+            return read_fn(backpath + x)
+        
+        result = DevController.getDeviceConfiguration(self, devid, transaction)
+
+        dev = self.convertToDeviceNumber(devid)
+        frontpath = self.frontendPath(dev) + "/"
+
+        backpath = front_read("backend") + "/"
+
+        front_mac = front_read("mac")
+        back_mac = back_read("mac")
+
+        front_trusted = back_read("remote-trusted")
+        back_trusted = back_read("local-trusted")
+        max_bypasses = back_read("max-bypasses")
+
+        bridge = back_read("bridge")
+
+        pdev = back_read("pdev")
+
+        if front_mac:
+            result["front_mac"] = front_mac
+        if back_mac:
+            result["back_mac"] = back_mac
+        if front_trusted:
+            result["front_trusted"] = front_trusted
+        if back_trusted:
+            result["back_trusted"] = back_trusted
+        if bridge:
+            result["bridge"] = bridge
+        if pdev:
+            result["pdev"] = pdev
+        if max_bypasses:
+            result["max-bypasses"] = max_bypasses
+        return result
+
+    def destroyDevice(self, devid, force):
+        dev = self.convertToDeviceNumber(devid)
+        self.writeBackend(dev, "online", "0")
+        if force:
+            self.writeBackend(dev, "shutdown-request", "force")
+        else:
+            self.writeBackend(dev, "shutdown-request", "normal")
+        self.vm._removeVm("device/%s/%d" % (self.deviceClass, dev))
diff -r 0f3f1ea314ea -r d6dfe609da5a tools/python/xen/xm/create.py
--- a/tools/python/xen/xm/create.py     Fri Nov 28 15:43:42 2008 +0000
+++ b/tools/python/xen/xm/create.py     Mon Sep 22 13:10:54 2008 +0100
@@ -393,6 +393,12 @@
           This option may be repeated to add more than one vif.
           Specifying vifs will increase the number of interfaces as needed.""")
 
+gopts.var('vif2', 
val="front_mac=MAC,back_mac=MAC,backend=DOM,pdev=PDEV,max_bypasses=N,bridge=BRIDGE,filter_mac=<0|1>,front_filter_mac=<0|1>",
+          fn=append_value, default=[],
+          use="""Add a netchannel2 network interface using given front
+          and backend MAC addresses.  Randomly generated
+          addresses will be used if either address is missing.""")
+
 gopts.var('vtpm', val="instance=INSTANCE,backend=DOM,type=TYPE",
           fn=append_value, default=[],
           use="""Add a TPM interface. On the backend side use the given
@@ -931,6 +937,8 @@
 
     vifs = vals.vif
     vifs_n = len(vifs)
+    vifs2 = vals.vif2
+    vifs2_n = len(vifs2)
 
     if hasattr(vals, 'nics'):
         if vals.nics > 0:
@@ -955,6 +963,18 @@
             config_vif.append([k, d[k]])
 
         map(f, d.keys())
+        config_devs.append(['device', config_vif])
+
+    for c in vifs2:
+        d = comma_sep_kv_to_dict(c)
+        config_vif = ['vif2']
+
+        for k in d.keys():
+            if k not in ['front_mac', 'back_mac', 'backend', 'trusted',
+                         'back_trusted', 'front_filter_mac', 'filter_mac',
+                         'bridge', 'pdev', 'max_bypasses' ]:
+                err('Invalid vif2 option: ' + k)
+            config_vif.append([k, d[k]])
         config_devs.append(['device', config_vif])
 
 
diff -r 0f3f1ea314ea -r d6dfe609da5a tools/python/xen/xm/main.py
--- a/tools/python/xen/xm/main.py       Fri Nov 28 15:43:42 2008 +0000
+++ b/tools/python/xen/xm/main.py       Mon Sep 22 13:10:54 2008 +0100
@@ -181,6 +181,15 @@
                         'Destroy a domain\'s virtual network device.'),
     'network-list'  :  ('<Domain> [--long]',
                         'List virtual network interfaces for a domain.'),
+    'network2-attach': ('<Domain> [front_mac=<mac>] [back_mac=<mac>] '
+                        '[backend=<BackDomain>] [trusted=<0|1>] '
+                        '[back_trusted=<0|1>] [bridge=<bridge>] '
+                        '[max_bypasses=n]'
+                        'Create a new version 2 virtual network device.'),
+    'network2-detach': ('<Domain> <DevId> [-f|--force]',
+                         'Destroy a domain\'s version 2 virtual network 
device.'),
+    'network2-list'  : ('<Domain> [--long]',
+                        'List version 2 virtual network interfaces for a 
domain.'),
     'vnet-create'   :  ('<ConfigFile>','Create a vnet from ConfigFile.'),
     'vnet-delete'   :  ('<VnetId>', 'Delete a Vnet.'),
     'vnet-list'     :  ('[-l|--long]', 'List Vnets.'),
@@ -399,6 +408,9 @@
     "network-attach",
     "network-detach",
     "network-list",
+    "network2-attach",
+    "network2-detach",
+    "network2-list",
     "vtpm-list",
     "pci-attach",
     "pci-detach",
@@ -2436,6 +2448,35 @@
     server.xend.domain.device_configure(dom, vbd)
 
 
+def xm_network2_attach(args):
+    xenapi_unsupported()
+    arg_check(args, 'network2-attach', 1, 4)
+    dom = args[0]
+    vif = ['vif2']
+    vif_params = ['front_mac', 'back_mac', 'backend', 'trusted',
+                  'back_trusted', "front_filter_mac", "filter_mac",
+                  'bridge', 'pdev', "max_bypasses" ]
+    for a in args[1:]:
+        vif_param = a.split("=")
+        if len(vif_param) != 2 or vif_param[1] == "" or \
+           vif_param[0] not in vif_params:
+            err("Invalid argument: %s" % a)
+            usage("network2-attach")
+        vif.append(vif_param)
+    server.xend.domain.device_create(dom, vif)
+
+def xm_network2_detach(args):
+    xenapi_unsupported()
+    arg_check(args, "network2-detch", 2, 3)
+    detach(args, "vif2")
+
+def xm_network2_list(args):
+    xenapi_unsupported()
+    (use_long, params) = arg_check_for_resource_list(args, "network2-list")
+    dom = params[0]
+    devs = server.xend.domain.getDeviceSxprs(dom, 'vif2')
+    map(PrettyPrint.prettyprint, devs)
+                
 def xm_network_attach(args):
     arg_check(args, 'network-attach', 1, 11)
 
@@ -3239,6 +3280,9 @@
     "network-attach": xm_network_attach,
     "network-detach": xm_network_detach,
     "network-list": xm_network_list,
+    "network2-attach": xm_network2_attach,
+    "network2-detach": xm_network2_detach,
+    "network2-list": xm_network2_list,
     # network (as in XenAPI)
     "network-new": xm_network_new,
     "network-del": xm_network_del,
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel