Re: [libvirt] [PATCH 5/5] Supporting managed option for forward devs when using HOSTDEV mode

2012-06-11 Thread Laine Stump
On 06/08/2012 11:30 AM, Shradha Shah wrote:
 This patch supports the managed option in a network xml for network devices.
 This option is used for pci network devices when forward mode=hostdev.

 Hence the example network xml would be:

 network
   namedirect-network/name
   uuid81ff0d90-c91e-6742-64da-4a736edb9a8f/uuid
   forward mode=hostdev
 pf dev=eth2 managed='yes'/
   /forward
 /network

 OR

 network
   namedirect-network/name
   uuid81ff0d90-c91e-6742-64da-4a736edb9a8f/uuid
   forward mode=hostdev
 interface dev=:04:00.1 managed='yes'/
 interface dev=:04:00.2 managed='yes'/
 interface dev=:04:00.3 managed='yes'/
   /forward
 /network

This functionality should be included with the initial patch rather than
as a later add-on.


 Signed-off-by: Shradha Shah ss...@solarflare.com
 ---
  src/conf/network_conf.c |   61 --
  src/conf/network_conf.h |2 +
  src/network/bridge_driver.c |5 +++-
  3 files changed, 64 insertions(+), 4 deletions(-)

 diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
 index 6b346c3..18e4ee3 100644
 --- a/src/conf/network_conf.c
 +++ b/src/conf/network_conf.c
 @@ -986,6 +986,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
  char *forwardDev = NULL;
  xmlNodePtr save = ctxt-node;
  xmlNodePtr bandwidthNode = NULL;
 +char *managed = NULL;
  
  if (VIR_ALLOC(def)  0) {
  virReportOOMError();
 @@ -1128,6 +1129,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
  }
  
  forwardDev = virXPathString(string(./@dev), ctxt);
 +managed = virXPathString(string(./managed), ctxt); 
  
  /* all of these modes can use a pool of physical interfaces */
  nForwardIfs = virXPathNodeSet(./interface, ctxt, forwardIfNodes);
 @@ -1151,6 +1153,12 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
  goto error;
  }
  
 +if (managed) {
 +virNetworkReportError(VIR_ERR_XML_ERROR,
 +  _(A managed field should not be used 
 in this location when using a SRIOV PF));
 +goto error;
 +}
 +
  forwardDev = virXMLPropString(*forwardPfNodes, dev);
  if (!forwardDev) {
  virNetworkReportError(VIR_ERR_XML_ERROR,
 @@ -1159,9 +1167,16 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
  goto error;
  }
  
 +managed = virXMLPropString(*forwardPfNodes, managed);
 +if(managed != NULL) {
 +if (STREQ(managed, yes))
 +def-forwardPfs-managed = 1; 
 +}
 +
  def-forwardPfs-usageCount = 0;
  def-forwardPfs-dev = forwardDev;
  forwardDev = NULL;
 +managed = NULL;
  def-nForwardPfs++;
  } else if (nForwardPfs  1) {
  virNetworkReportError(VIR_ERR_XML_ERROR,
 @@ -1170,6 +1185,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
  }
  if (nForwardIfs  0 || forwardDev) {
  int ii;
 +unsigned int managedvalue = 0;
  
  /* allocate array to hold all the portgroups */
  if (VIR_ALLOC_N(def-forwardIfs, MAX(nForwardIfs, 1))  0) {
 @@ -1181,12 +1197,24 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
  def-forwardIfs[0].usageCount = 0;
  def-forwardIfs[0].dev = forwardDev;
  forwardDev = NULL;
 +if (managed != NULL) {
 +if (STREQ(managed, yes))
 +def-forwardIfs[0].managed = 1;
 +}
 +managed = NULL;
  def-nForwardIfs++;
  }
  
  /* parse each forwardIf */
  for (ii = 0; ii  nForwardIfs; ii++) {
  forwardDev = virXMLPropString(forwardIfNodes[ii], dev);
 +managed = virXMLPropString(forwardIfNodes[ii], managed);
 +if (managed != NULL) {
 +if (STREQ(managed, yes))
 +managedvalue = 1;
 +else
 +managedvalue = 0;
 +}
  if (!forwardDev) {
  virNetworkReportError(VIR_ERR_XML_ERROR,
_(Missing required dev attribute 
 in network '%s' forward interface element),
 @@ -1204,12 +1232,22 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
forwardDev, def-name);
  goto error;
  }
 +
 +if (managedvalue != def-forwardIfs[0].managed) {
 +virNetworkReportError(VIR_ERR_XML_ERROR,
 +  _(managed field of forward 
 dev must match that of the first interface element dev in network '%s'),
 + 

[libvirt] [PATCH 5/5] Supporting managed option for forward devs when using HOSTDEV mode

2012-06-08 Thread Shradha Shah
This patch supports the managed option in a network xml for network devices.
This option is used for pci network devices when forward mode=hostdev.

Hence the example network xml would be:

network
  namedirect-network/name
  uuid81ff0d90-c91e-6742-64da-4a736edb9a8f/uuid
  forward mode=hostdev
pf dev=eth2 managed='yes'/
  /forward
/network

OR

network
  namedirect-network/name
  uuid81ff0d90-c91e-6742-64da-4a736edb9a8f/uuid
  forward mode=hostdev
interface dev=:04:00.1 managed='yes'/
interface dev=:04:00.2 managed='yes'/
interface dev=:04:00.3 managed='yes'/
  /forward
/network

Signed-off-by: Shradha Shah ss...@solarflare.com
---
 src/conf/network_conf.c |   61 --
 src/conf/network_conf.h |2 +
 src/network/bridge_driver.c |5 +++-
 3 files changed, 64 insertions(+), 4 deletions(-)

diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index 6b346c3..18e4ee3 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -986,6 +986,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
 char *forwardDev = NULL;
 xmlNodePtr save = ctxt-node;
 xmlNodePtr bandwidthNode = NULL;
+char *managed = NULL;
 
 if (VIR_ALLOC(def)  0) {
 virReportOOMError();
@@ -1128,6 +1129,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
 }
 
 forwardDev = virXPathString(string(./@dev), ctxt);
+managed = virXPathString(string(./managed), ctxt); 
 
 /* all of these modes can use a pool of physical interfaces */
 nForwardIfs = virXPathNodeSet(./interface, ctxt, forwardIfNodes);
@@ -1151,6 +1153,12 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
 goto error;
 }
 
+if (managed) {
+virNetworkReportError(VIR_ERR_XML_ERROR,
+  _(A managed field should not be used in 
this location when using a SRIOV PF));
+goto error;
+}
+
 forwardDev = virXMLPropString(*forwardPfNodes, dev);
 if (!forwardDev) {
 virNetworkReportError(VIR_ERR_XML_ERROR,
@@ -1159,9 +1167,16 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
 goto error;
 }
 
+managed = virXMLPropString(*forwardPfNodes, managed);
+if(managed != NULL) {
+if (STREQ(managed, yes))
+def-forwardPfs-managed = 1; 
+}
+
 def-forwardPfs-usageCount = 0;
 def-forwardPfs-dev = forwardDev;
 forwardDev = NULL;
+managed = NULL;
 def-nForwardPfs++;
 } else if (nForwardPfs  1) {
 virNetworkReportError(VIR_ERR_XML_ERROR,
@@ -1170,6 +1185,7 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
 }
 if (nForwardIfs  0 || forwardDev) {
 int ii;
+unsigned int managedvalue = 0;
 
 /* allocate array to hold all the portgroups */
 if (VIR_ALLOC_N(def-forwardIfs, MAX(nForwardIfs, 1))  0) {
@@ -1181,12 +1197,24 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
 def-forwardIfs[0].usageCount = 0;
 def-forwardIfs[0].dev = forwardDev;
 forwardDev = NULL;
+if (managed != NULL) {
+if (STREQ(managed, yes))
+def-forwardIfs[0].managed = 1;
+}
+managed = NULL;
 def-nForwardIfs++;
 }
 
 /* parse each forwardIf */
 for (ii = 0; ii  nForwardIfs; ii++) {
 forwardDev = virXMLPropString(forwardIfNodes[ii], dev);
+managed = virXMLPropString(forwardIfNodes[ii], managed);
+if (managed != NULL) {
+if (STREQ(managed, yes))
+managedvalue = 1;
+else
+managedvalue = 0;
+}
 if (!forwardDev) {
 virNetworkReportError(VIR_ERR_XML_ERROR,
   _(Missing required dev attribute in 
network '%s' forward interface element),
@@ -1204,12 +1232,22 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
   forwardDev, def-name);
 goto error;
 }
+
+if (managedvalue != def-forwardIfs[0].managed) {
+virNetworkReportError(VIR_ERR_XML_ERROR,
+  _(managed field of forward dev 
must match that of the first interface element dev in network '%s'),
+  def-name);
+goto error;
+}
+VIR_FREE(managed);
 VIR_FREE(forwardDev);
 continue;
 }