[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 08 of 10] Tools-side support for creating and destroying netchannel2 interfaces
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |