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