[libvirt] [PATCH 16/28] conf: use virNetDevIPInfo in virDomainHostdevCaps

Laine Stump laine at laine.org
Wed Jun 22 17:37:15 UTC 2016


a.k.a. <hostdev mode='capabilities' type='net'>.

This replaces the existing nips, ips, nroutes, and routes with a
single virNetDevIPInfo, and simplifies the code by calling that
object's parse/format/clear functions instead of open coding.
---
 docs/schemas/domaincommon.rng | 22 +-----------
 src/conf/domain_conf.c        | 80 ++++++-------------------------------------
 src/conf/domain_conf.h        |  7 ++--
 src/lxc/lxc_controller.c      |  2 +-
 src/lxc/lxc_native.c          | 18 +++++-----
 5 files changed, 24 insertions(+), 105 deletions(-)

diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index ab89dab..38590a6 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -4034,27 +4034,7 @@
           <ref name="deviceName"/>
         </element>
       </element>
-      <zeroOrMore>
-        <element name="ip">
-          <attribute name="address">
-            <ref name="ipAddr"/>
-          </attribute>
-          <optional>
-            <attribute name="family">
-              <ref name="addr-family"/>
-            </attribute>
-          </optional>
-          <optional>
-            <attribute name="prefix">
-              <ref name="ipPrefix"/>
-            </attribute>
-          </optional>
-          <empty/>
-        </element>
-      </zeroOrMore>
-      <zeroOrMore>
-        <ref name="route"/>
-      </zeroOrMore>
+      <ref name="interface-ip-info"/>
     </interleave>
   </define>
 
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 548c750..7072f86 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2184,8 +2184,6 @@ virDomainHostdevSubsysSCSIiSCSIClear(virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc
 
 void virDomainHostdevDefClear(virDomainHostdevDefPtr def)
 {
-    size_t i;
-
     if (!def)
         return;
 
@@ -2209,13 +2207,8 @@ void virDomainHostdevDefClear(virDomainHostdevDefPtr def)
             VIR_FREE(def->source.caps.u.misc.chardev);
             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++)
-                VIR_FREE(def->source.caps.u.net.ips[i]);
-            VIR_FREE(def->source.caps.u.net.ips);
-            for (i = 0; i < def->source.caps.u.net.nroutes; i++)
-                virNetDevIPRouteFree(def->source.caps.u.net.routes[i]);
-            VIR_FREE(def->source.caps.u.net.routes);
+            VIR_FREE(def->source.caps.u.net.ifname);
+            virNetDevIPInfoClear(&def->source.caps.u.net.ip);
             break;
         }
         break;
@@ -6232,10 +6225,6 @@ virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED,
                                 virDomainHostdevDefPtr def)
 {
     xmlNodePtr sourcenode;
-    xmlNodePtr *ipnodes = NULL;
-    int nipnodes;
-    xmlNodePtr *routenodes = NULL;
-    int nroutenodes;
     int ret = -1;
 
     /* @type is passed in from the caller rather than read from the
@@ -6284,55 +6273,15 @@ virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED,
         }
         break;
     case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET:
-        if (!(def->source.caps.u.net.iface =
+        if (!(def->source.caps.u.net.ifname =
               virXPathString("string(./source/interface[1])", ctxt))) {
             virReportError(VIR_ERR_XML_ERROR, "%s",
                            _("Missing <interface> element in hostdev net device"));
             goto error;
         }
-
-        /* Parse possible IP addresses */
-        if ((nipnodes = virXPathNodeSet("./ip", ctxt, &ipnodes)) < 0)
+        if (virDomainNetIPInfoParseXML(_("Domain hostdev device"),
+                                       ctxt, &def->source.caps.u.net.ip) < 0)
             goto error;
-
-        if (nipnodes) {
-            size_t i;
-            for (i = 0; i < nipnodes; i++) {
-                virNetDevIPAddrPtr ip = virDomainNetIPParseXML(ipnodes[i]);
-
-                if (!ip)
-                    goto error;
-
-                if (VIR_APPEND_ELEMENT(def->source.caps.u.net.ips,
-                                       def->source.caps.u.net.nips, ip) < 0) {
-                    VIR_FREE(ip);
-                    goto error;
-                }
-            }
-        }
-
-        /* Look for possible gateways */
-        if ((nroutenodes = virXPathNodeSet("./route", ctxt, &routenodes)) < 0)
-            goto error;
-
-        if (nroutenodes) {
-            size_t i;
-            for (i = 0; i < nroutenodes; i++) {
-                virNetDevIPRoutePtr route = NULL;
-
-                if (!(route = virNetDevIPRouteParseXML(_("Domain hostdev device"),
-                                                         routenodes[i],
-                                                         ctxt)))
-                    goto error;
-
-
-                if (VIR_APPEND_ELEMENT(def->source.caps.u.net.routes,
-                                       def->source.caps.u.net.nroutes, route) < 0) {
-                    virNetDevIPRouteFree(route);
-                    goto error;
-                }
-            }
-        }
         break;
     default:
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
@@ -6342,8 +6291,6 @@ virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED,
     }
     ret = 0;
  error:
-    VIR_FREE(ipnodes);
-    VIR_FREE(routenodes);
     return ret;
 }
 
@@ -13722,8 +13669,8 @@ static int
 virDomainHostdevMatchCapsNet(virDomainHostdevDefPtr a,
                               virDomainHostdevDefPtr b)
 {
-    return STREQ_NULLABLE(a->source.caps.u.net.iface,
-                          b->source.caps.u.net.iface);
+    return STREQ_NULLABLE(a->source.caps.u.net.ifname,
+                          b->source.caps.u.net.ifname);
 }
 
 
@@ -20519,7 +20466,7 @@ virDomainHostdevDefFormatCaps(virBufferPtr buf,
         break;
     case VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET:
         virBufferEscapeString(buf, "<interface>%s</interface>\n",
-                              def->source.caps.u.net.iface);
+                              def->source.caps.u.net.ifname);
         break;
     default:
         virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -20531,14 +20478,9 @@ virDomainHostdevDefFormatCaps(virBufferPtr buf,
     virBufferAdjustIndent(buf, -2);
     virBufferAddLit(buf, "</source>\n");
 
-    if (def->source.caps.type == VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET) {
-        if (virDomainNetIPsFormat(buf, def->source.caps.u.net.ips,
-                                 def->source.caps.u.net.nips) < 0)
-            return -1;
-        if (virDomainNetRoutesFormat(buf, def->source.caps.u.net.routes,
-                                     def->source.caps.u.net.nroutes) < 0)
-            return -1;
-    }
+    if (def->source.caps.type == VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET &&
+        virDomainNetIPInfoFormat(buf, &def->source.caps.u.net.ip) < 0)
+        return -1;
 
     return 0;
 }
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index c529b09..0c723de 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -395,11 +395,8 @@ struct _virDomainHostdevCaps {
             char *chardev;
         } misc;
         struct {
-            char *iface;
-            size_t nips;
-            virNetDevIPAddrPtr *ips;
-            size_t nroutes;
-            virNetDevIPRoutePtr *routes;
+            char *ifname;
+            virNetDevIPInfo ip;
         } net;
     } u;
 };
diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
index 2aee41c..e58ff1b 100644
--- a/src/lxc/lxc_controller.c
+++ b/src/lxc/lxc_controller.c
@@ -1984,7 +1984,7 @@ static int virLXCControllerMoveInterfaces(virLXCControllerPtr ctrl)
         if (hdcaps.type != VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET)
             continue;
 
-        if (virNetDevSetNamespace(hdcaps.u.net.iface, ctrl->initpid) < 0)
+        if (virNetDevSetNamespace(hdcaps.u.net.ifname, ctrl->initpid) < 0)
             return -1;
     }
 
diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
index 8294d29..f074f03 100644
--- a/src/lxc/lxc_native.c
+++ b/src/lxc/lxc_native.c
@@ -402,7 +402,7 @@ lxcCreateHostdevDef(int mode, int type, const char *data)
     hostdev->source.caps.type = type;
 
     if (type == VIR_DOMAIN_HOSTDEV_CAPS_TYPE_NET &&
-        VIR_STRDUP(hostdev->source.caps.u.net.iface, data) < 0) {
+        VIR_STRDUP(hostdev->source.caps.u.net.ifname, data) < 0) {
         virDomainHostdevDefFree(hostdev);
         hostdev = NULL;
     }
@@ -492,25 +492,25 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data)
         /* This still requires the user to manually setup the vlan interface
          * on the host */
         if (isVlan && data->vlanid) {
-            VIR_FREE(hostdev->source.caps.u.net.iface);
-            if (virAsprintf(&hostdev->source.caps.u.net.iface,
+            VIR_FREE(hostdev->source.caps.u.net.ifname);
+            if (virAsprintf(&hostdev->source.caps.u.net.ifname,
                             "%s.%s", data->link, data->vlanid) < 0)
                 goto error;
         }
 
-        hostdev->source.caps.u.net.ips = data->ips;
-        hostdev->source.caps.u.net.nips = data->nips;
+        hostdev->source.caps.u.net.ip.ips = data->ips;
+        hostdev->source.caps.u.net.ip.nips = data->nips;
 
         if (data->gateway_ipv4 &&
             lxcAddNetworkRouteDefinition(data->gateway_ipv4, AF_INET,
-                                         &hostdev->source.caps.u.net.routes,
-                                         &hostdev->source.caps.u.net.nroutes) < 0)
+                                         &hostdev->source.caps.u.net.ip.routes,
+                                         &hostdev->source.caps.u.net.ip.nroutes) < 0)
                 goto error;
 
         if (data->gateway_ipv6 &&
             lxcAddNetworkRouteDefinition(data->gateway_ipv6, AF_INET6,
-                                         &hostdev->source.caps.u.net.routes,
-                                         &hostdev->source.caps.u.net.nroutes) < 0)
+                                         &hostdev->source.caps.u.net.ip.routes,
+                                         &hostdev->source.caps.u.net.ip.nroutes) < 0)
                 goto error;
 
         if (VIR_EXPAND_N(data->def->hostdevs, data->def->nhostdevs, 1) < 0)
-- 
2.5.5




More information about the libvir-list mailing list