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 8 of 8] Tools-side support for creating and destroyin

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH 8 of 8] Tools-side support for creating and destroying netchannel2 interfaces
From: <steven.smith@xxxxxxxxxx>
Date: Tue, 6 Oct 2009 16:35:50 +0100
Cc: keir.fraser@xxxxxxxxxx, joserenato.santos@xxxxxx, JBeulich@xxxxxxxxxx
Delivery-date: Tue, 06 Oct 2009 08:44:24 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1254843342@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 fe10d9d213ebdd43ef0c1d74689db8afec6c8494
# Parent  dfa92594086745b0fac52f07c3727a1e9061eb6a
Tools-side support for creating and destroying netchannel2 interfaces.

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

diff -r dfa925940867 -r fe10d9d213eb 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 dfa925940867 -r fe10d9d213eb 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 dfa925940867 -r fe10d9d213eb 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 dfa925940867 -r fe10d9d213eb 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 dfa925940867 -r fe10d9d213eb 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 dfa925940867 -r fe10d9d213eb 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 dfa925940867 -r fe10d9d213eb 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 dfa925940867 -r fe10d9d213eb 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