[libvirt] [PATCHv2 05/16] Allow network capabilities hostdev to configure IP addresses

Cédric Bosdonnat cbosdonnat at suse.com
Tue Aug 26 13:20:25 UTC 2014


---
 docs/formatdomain.html.in            | 12 +++++++--
 docs/schemas/domaincommon.rng        | 23 +++++++++++++++---
 src/conf/domain_conf.c               | 47 ++++++++++++++++++++++++++++++++++++
 src/conf/domain_conf.h               |  2 ++
 tests/lxcxml2xmldata/lxc-hostdev.xml |  2 ++
 5 files changed, 80 insertions(+), 6 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index ff56514..d0141f8 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -4081,13 +4081,21 @@ qemu-kvm -net nic,model=? /dev/null
       <target dev='vnet0'/>
       <b><ip address='192.168.122.5' prefix='24'/></b>
     </interface>
+    ...
+    <hostdev mode='capabilities' type='net'>
+      <source>
+        <interface>eth0</interface>
+      </source>
+      <b><ip address='192.168.122.6' prefix='24'/></b>
+    </hostdev>
+
   </devices>
   ...
 </pre>
 
     <p>
-    <span class="since">Since 1.2.8</span> the network devices can be provided
-    zero or more IP addresses to set
+    <span class="since">Since 1.2.8</span> the network devices and host devices
+    with network capabilities can be provided zero or more IP addresses to set
     on the target device. Note that some hypervisors or network device types
     will simply ignore them or only use the first one. The <code>address</code>
     attribute can hold either an IPv4 or IPv6 address. The <code>prefix</code>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 94b5c4d..0c8846d 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -3674,11 +3674,26 @@
     <attribute name="type">
       <value>net</value>
     </attribute>
-    <element name="source">
-      <element name="interface">
-        <ref name="deviceName"/>
+    <interleave>
+      <element name="source">
+        <element name="interface">
+          <ref name="deviceName"/>
+        </element>
       </element>
-    </element>
+      <zeroOrMore>
+        <element name="ip">
+          <attribute name="address">
+            <ref name="ipAddr"/>
+          </attribute>
+          <optional>
+            <attribute name="prefix">
+              <ref name="ipPrefix"/>
+            </attribute>
+          </optional>
+          <empty/>
+        </element>
+      </zeroOrMore>
+    </interleave>
   </define>
 
   <define name="usbproduct">
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index a874087..8a24868 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1736,6 +1736,8 @@ virDomainHostdevSubsysSCSIiSCSIClear(virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc
 
 void virDomainHostdevDefClear(virDomainHostdevDefPtr def)
 {
+    size_t i;
+
     if (!def)
         return;
 
@@ -1760,6 +1762,9 @@ void virDomainHostdevDefClear(virDomainHostdevDefPtr def)
             break;
         case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET:
             VIR_FREE(def->source.caps.u.net.iface);
+            for (i = 0; i < def->source.caps.u.net.nips; i++)
+                virDomainNetIpDefFree(def->source.caps.u.net.ips[i]);
+            VIR_FREE(def->source.caps.u.net.ips);
             break;
         }
         break;
@@ -4584,6 +4589,8 @@ virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED,
                                 virDomainHostdevDefPtr def)
 {
     xmlNodePtr sourcenode;
+    xmlNodePtr *ipnodes = NULL;
+    int nipnodes;
     int ret = -1;
 
     /* @type is passed in from the caller rather than read from the
@@ -4638,6 +4645,40 @@ virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED,
                            _("Missing <interface> element in hostdev net device"));
             goto error;
         }
+
+        /* Parse possible IP addresses */
+        if ((nipnodes = virXPathNodeSet("./ip", ctxt, &ipnodes)) < 0)
+            goto error;
+
+        if (nipnodes) {
+            size_t i;
+            for (i = 0; i < nipnodes; i++) {
+                char *prefixStr = NULL;
+                virDomainNetIpDefPtr ip = NULL;
+
+                if (VIR_ALLOC(ip) < 0)
+                    goto error;
+
+                ip->address = virXMLPropString(ipnodes[i], "address");
+
+                if ((prefixStr = virXMLPropString(ipnodes[i], "prefix")) &&
+                    (virStrToLong_ui(prefixStr, NULL, 10, &ip->prefix) < 0)) {
+
+                    virReportError(VIR_ERR_INVALID_ARG,
+                                   _("Invalid network prefix: '%s'"),
+                                   prefixStr);
+                    VIR_FREE(prefixStr);
+                    goto error;
+                }
+                VIR_FREE(prefixStr);
+
+                if (ip->address != NULL &&
+                    VIR_APPEND_ELEMENT(def->source.caps.u.net.ips,
+                                       def->source.caps.u.net.nips, ip) < 0)
+                    goto error;
+            }
+            VIR_FREE(ipnodes);
+        }
         break;
     default:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -16124,6 +16165,12 @@ virDomainHostdevDefFormatCaps(virBufferPtr buf,
 
     virBufferAdjustIndent(buf, -2);
     virBufferAddLit(buf, "</source>\n");
+
+    if (def->source.caps.type == VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET) {
+        virDomainNetIpsFormat(buf, def->source.caps.u.net.ips,
+                              def->source.caps.u.net.nips);
+    }
+
     return 0;
 }
 
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index ffa0324..5c1ecb7 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -487,6 +487,8 @@ struct _virDomainHostdevCaps {
         } misc;
         struct {
             char *iface;
+            size_t nips;
+            virDomainNetIpDefPtr *ips;
         } net;
     } u;
 };
diff --git a/tests/lxcxml2xmldata/lxc-hostdev.xml b/tests/lxcxml2xmldata/lxc-hostdev.xml
index befe0db..23bf04d 100644
--- a/tests/lxcxml2xmldata/lxc-hostdev.xml
+++ b/tests/lxcxml2xmldata/lxc-hostdev.xml
@@ -35,6 +35,8 @@
       <source>
         <interface>eth0</interface>
       </source>
+      <ip address='192.168.122.2'/>
+      <ip address='2003:db8:1:0:214:1234:fe0b:3596' prefix='24'/>
     </hostdev>
   </devices>
 </domain>
-- 
1.8.4.5




More information about the libvir-list mailing list