libvir-list-boun...@redhat.com wrote on 04/02/2010 11:42:03 AM:
> > On 03/31/2010 06:28 AM, Daniel P. Berrange wrote: > > On Tue, Mar 30, 2010 at 05:30:56PM -0400, David Allan wrote: > >> --- [...] > > > > Wouldn't this also be valid for the type=bridge networking mode, since > > that is connecting VMs to the LAN too. > > Agreed with both; an updated patch is attached. I also added a test for > the new element. > > Dave > >From a945107f047c7cd71f9c1b74fd74c47d8cdc3670 Mon Sep 17 00:00:00 2001 From: David Allan <dal...@redhat.com> Date: Fri, 12 Mar 2010 13:25:04 -0500 Subject: [PATCH 1/1] POC of port profile id support * Modified schema per DanPB's feedback * Added test for modified schema --- docs/schemas/domain.rng | 13 +++++++++++++ src/conf/domain_conf.c | 12 ++++++++++++ src/conf/domain_conf.h | 1 + src/libvirt_private.syms | 3 +++ src/qemu/qemu_conf.c | 12 ++++++++++++ src/util/macvtap.c | 13 +++++++++++++ src/util/macvtap.h | 4 ++++ tests/domainschemadata/portprofile.xml | 15 +++++++++++++++ 8 files changed, 73 insertions(+), 0 deletions(-) create mode 100644 tests/domainschemadata/portprofile.xml diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng index 228665c..53280ce 100644 --- a/docs/schemas/domain.rng +++ b/docs/schemas/domain.rng @@ -816,6 +816,9 @@ </optional> <empty/> </element> + <optional> + <ref name="switchPort"/> + </optional> <ref name="interface-options"/> </interleave> </group> @@ -896,6 +899,16 @@ </optional> </interleave> </define> + <define name="switchPort"> + <element name="switchport"> + <optional> + <attribute name="profile"> + <text/> + </attribute> + </optional> + <empty/> + </element> + </define> <!-- An emulator description is just a path to the binary used for the task --> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 067f053..d2b791f 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -481,6 +481,7 @@ void virDomainNetDefFree(virDomainNetDefPtr def) case VIR_DOMAIN_NET_TYPE_DIRECT: VIR_FREE(def->data.direct.linkdev); + VIR_FREE(def->data.direct.profileid); break; case VIR_DOMAIN_NET_TYPE_USER: @@ -1823,6 +1824,7 @@ virDomainNetDefParseXML(virCapsPtr caps, char *internal = NULL; char *devaddr = NULL; char *mode = NULL; + char *profileid = NULL; virNWFilterHashTablePtr filterparams = NULL; if (VIR_ALLOC(def) < 0) { @@ -1865,6 +1867,7 @@ virDomainNetDefParseXML(virCapsPtr caps, xmlStrEqual(cur->name, BAD_CAST "source")) { dev = virXMLPropString(cur, "dev"); mode = virXMLPropString(cur, "mode"); + profileid = virXMLPropString(cur, "profileid"); COMMENT: For the above code to be able to parse this + <source dev='eth0' mode='vepa'/> + <switchport profile='foo'/> I think you'll first need to find a switchport element. } else if ((network == NULL) && ((def->type == VIR_DOMAIN_NET_TYPE_SERVER) || (def->type == VIR_DOMAIN_NET_TYPE_CLIENT) || @@ -2040,6 +2043,10 @@ virDomainNetDefParseXML(virCapsPtr caps, } else def->data.direct.mode = VIR_DOMAIN_NETDEV_MACVTAP_MODE_VEPA; + if (profileid != NULL) { + def->data.direct.profileid = profileid; + } + def->data.direct.linkdev = dev; dev = NULL; @@ -2105,6 +2112,7 @@ cleanup: VIR_FREE(internal); VIR_FREE(devaddr); VIR_FREE(mode); + VIR_FREE(profileid); virNWFilterHashTableFree(filterparams); return def; @@ -5131,6 +5139,10 @@ virDomainNetDefFormat(virBufferPtr buf, def->data.direct.linkdev); virBufferVSprintf(buf, " mode='%s'", virDomainNetdevMacvtapTypeToString(def->data.direct.mode)); + if (def->data.direct.profileid) { + virBufferEscapeString(buf, " profileid='%s'", + def->data.direct.profileid); + } COMMENT: You'd need to print a switchport element first. virBufferAddLit(buf, "/>\n"); break; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index b789289..37a58a9 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -289,6 +289,7 @@ struct _virDomainNetDef { struct { char *linkdev; int mode; + char *profileid; } direct; } data; char *ifname; diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 878eda3..253f935 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -703,3 +703,6 @@ virXPathLongLong; virXPathULongLong; virXPathLongHex; virXPathULongHex; + +# macvtap.h +sendPortProfileId; COMMENT: There's a separate libvirt_macvtap.syms file. Also, please prefix this function with macvtap -> macvtapSendPortProfileId diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 55397cd..3cb3ce9 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -1469,6 +1469,18 @@ qemudPhysIfaceConnect(virConnectPtr conn, net->model && STREQ(net->model, "virtio")) vnet_hdr = 1; + /* Failure here is equivalent to the failure to plug in a physical + * network port. + * + * If this operation is non-blocking we will have a race between + * the VM starting and the interface coming up. + * + * If any of the subsequent operations fail, will we need to + * unwind the sending of the port profile id? */ + sendPortProfileId(net->data.direct.linkdev, + net->data.direct.mode, + net->data.direct.profileid); + COMMENT: I'd push this call into the openMacvtapTap function since it will be part of the setup of the Tap device, no? Stefan rc = openMacvtapTap(conn, net->ifname, net->mac, linkdev, brmode, &res_ifname, vnet_hdr); if (rc >= 0) { diff --git a/src/util/macvtap.c b/src/util/macvtap.c index 999e670..585e56b 100644 --- a/src/util/macvtap.c +++ b/src/util/macvtap.c @@ -43,6 +43,7 @@ # include "util.h" # include "memory.h" +# include "logging.h" # include "macvtap.h" # include "conf/domain_conf.h" # include "virterror_internal.h" @@ -673,6 +674,18 @@ configMacvtapTap(int tapfd, int vnet_hdr) } +int +sendPortProfileId(const char *linkdev, + int mode, + const char *profileid) +{ + VIR_DEBUG("Sending port profile id '%s' on physical device '%s' mode %d", + profileid, linkdev, mode); + + return 0; +} + + /** * openMacvtapTap: * Create an instance of a macvtap device and open its tap character diff --git a/src/util/macvtap.h b/src/util/macvtap.h index bd5f4d6..6cd7621 100644 --- a/src/util/macvtap.h +++ b/src/util/macvtap.h @@ -38,6 +38,10 @@ int openMacvtapTap(virConnectPtr conn, void delMacvtap(const char *ifname); +int sendPortProfileId(const char *linkdev, + int mode, + const char *profileid); + # endif /* WITH_MACVTAP */ # define MACVTAP_MODE_PRIVATE_STR "private" diff --git a/tests/domainschemadata/portprofile.xml b/tests/domainschemadata/portprofile.xml new file mode 100644 index 0000000..7152ffd --- /dev/null +++ b/tests/domainschemadata/portprofile.xml @@ -0,0 +1,15 @@ +<domain type='lxc'> + <name>portprofile</name> + <uuid>00000000-0000-0000-0000-000000000000</uuid> + <memory>1048576</memory> + <os> + <type>exe</type> + <init>/sh</init> + </os> + <devices> + <interface type='direct'> + <source dev='eth0' mode='vepa'/> + <switchport profile='foo'/> + </interface> + </devices> +</domain> -- 1.7.0.1
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list