]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: move IP route & address object-related functions to virnetdevip.c
authorLaine Stump <laine@laine.org>
Tue, 14 Jun 2016 17:40:04 +0000 (13:40 -0400)
committerLaine Stump <laine@laine.org>
Sun, 26 Jun 2016 23:33:09 +0000 (19:33 -0400)
These functions all need to be called from a utility function that
must be located in the util directory, so we move them all into
util/virnetdevip.[ch] now that it exists.

Function and struct names were appropriately changed for the new
location, but all code is unchanged aside from motion and renaming.

13 files changed:
src/conf/domain_conf.c
src/conf/domain_conf.h
src/conf/network_conf.c
src/conf/network_conf.h
src/conf/networkcommon_conf.c
src/conf/networkcommon_conf.h
src/libvirt_private.syms
src/lxc/lxc_container.c
src/lxc/lxc_native.c
src/network/bridge_driver.c
src/network/bridge_driver_linux.c
src/util/virnetdevip.c
src/util/virnetdevip.h

index a1d835d8c704b38777ade2d562d7bfe401f9021d..07b9a57c7e529dec8b00ec2bf945d0494609481c 100644 (file)
@@ -1804,7 +1804,7 @@ virDomainNetDefClear(virDomainNetDefPtr def)
     VIR_FREE(def->ips);
 
     for (i = 0; i < def->nroutes; i++)
-        virNetworkRouteDefFree(def->routes[i]);
+        virNetDevIPRouteFree(def->routes[i]);
     VIR_FREE(def->routes);
 
     virDomainDeviceInfoClear(&def->info);
@@ -2212,7 +2212,7 @@ void virDomainHostdevDefClear(virDomainHostdevDefPtr def)
                 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++)
-                virNetworkRouteDefFree(def->source.caps.u.net.routes[i]);
+                virNetDevIPRouteFree(def->source.caps.u.net.routes[i]);
             VIR_FREE(def->source.caps.u.net.routes);
             break;
         }
@@ -6128,11 +6128,11 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node,
     return ret;
 }
 
-static virDomainNetIPDefPtr
+static virNetDevIPAddrPtr
 virDomainNetIPParseXML(xmlNodePtr node)
 {
     /* Parse the prefix in every case */
-    virDomainNetIPDefPtr ip = NULL, ret = NULL;
+    virNetDevIPAddrPtr ip = NULL, ret = NULL;
     char *prefixStr = NULL;
     unsigned int prefixValue = 0;
     char *familyStr = NULL;
@@ -6259,7 +6259,7 @@ virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED,
         if (nipnodes) {
             size_t i;
             for (i = 0; i < nipnodes; i++) {
-                virDomainNetIPDefPtr ip = virDomainNetIPParseXML(ipnodes[i]);
+                virNetDevIPAddrPtr ip = virDomainNetIPParseXML(ipnodes[i]);
 
                 if (!ip)
                     goto error;
@@ -6279,17 +6279,17 @@ virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED,
         if (nroutenodes) {
             size_t i;
             for (i = 0; i < nroutenodes; i++) {
-                virNetworkRouteDefPtr route = NULL;
+                virNetDevIPRoutePtr route = NULL;
 
-                if (!(route = virNetworkRouteDefParseXML(_("Domain hostdev device"),
-                                                         routenodes[i],
-                                                         ctxt)))
+                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) {
-                    virNetworkRouteDefFree(route);
+                    virNetDevIPRouteFree(route);
                     goto error;
                 }
             }
@@ -8896,7 +8896,7 @@ virDomainNetAppendIPAddress(virDomainNetDefPtr def,
                             int family,
                             unsigned int prefix)
 {
-    virDomainNetIPDefPtr ipDef = NULL;
+    virNetDevIPAddrPtr ipDef = NULL;
     if (VIR_ALLOC(ipDef) < 0)
         return -1;
 
@@ -8968,9 +8968,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
     int ret, val;
     size_t i;
     size_t nips = 0;
-    virDomainNetIPDefPtr *ips = NULL;
+    virNetDevIPAddrPtr *ips = NULL;
     size_t nroutes = 0;
-    virNetworkRouteDefPtr *routes = NULL;
+    virNetDevIPRoutePtr *routes = NULL;
 
     if (VIR_ALLOC(def) < 0)
         return NULL;
@@ -9087,7 +9087,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
                     ctxt->node = tmpnode;
                 }
             } else if (xmlStrEqual(cur->name, BAD_CAST "ip")) {
-                virDomainNetIPDefPtr ip = NULL;
+                virNetDevIPAddrPtr ip = NULL;
 
                 if (!(ip = virDomainNetIPParseXML(cur)))
                     goto error;
@@ -9095,13 +9095,13 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
                 if (VIR_APPEND_ELEMENT(ips, nips, ip) < 0)
                     goto error;
             } else if (xmlStrEqual(cur->name, BAD_CAST "route")) {
-                virNetworkRouteDefPtr route = NULL;
-                if (!(route = virNetworkRouteDefParseXML(_("Domain interface"),
-                                                         cur, ctxt)))
+                virNetDevIPRoutePtr route = NULL;
+                if (!(route = virNetDevIPRouteParseXML(_("Domain interface"),
+                                                       cur, ctxt)))
                     goto error;
 
                 if (VIR_APPEND_ELEMENT(routes, nroutes, route) < 0) {
-                    virNetworkRouteDefFree(route);
+                    virNetDevIPRouteFree(route);
                     goto error;
                 }
             } else if (!ifname &&
@@ -20281,7 +20281,7 @@ virDomainFSDefFormat(virBufferPtr buf,
 }
 
 static int
-virDomainNetIPsFormat(virBufferPtr buf, virDomainNetIPDefPtr *ips, size_t nips)
+virDomainNetIPsFormat(virBufferPtr buf, virNetDevIPAddrPtr *ips, size_t nips)
 {
     size_t i;
 
@@ -20311,13 +20311,13 @@ virDomainNetIPsFormat(virBufferPtr buf, virDomainNetIPDefPtr *ips, size_t nips)
 
 static int
 virDomainNetRoutesFormat(virBufferPtr buf,
-                         virNetworkRouteDefPtr *routes,
+                         virNetDevIPRoutePtr *routes,
                          size_t nroutes)
 {
     size_t i;
 
     for (i = 0; i < nroutes; i++)
-        if (virNetworkRouteDefFormat(buf, routes[i]) < 0)
+        if (virNetDevIPRouteFormat(buf, routes[i]) < 0)
             return -1;
     return 0;
 }
index d599551a6e0c2c00538a2f3402356bcb288ef59f..6f9c536fe3d31e65c463be62f3bd3e43d299c023 100644 (file)
@@ -41,6 +41,7 @@
 # include "numa_conf.h"
 # include "virnetdevmacvlan.h"
 # include "virsysinfo.h"
+# include "virnetdevip.h"
 # include "virnetdevvportprofile.h"
 # include "virnetdevbandwidth.h"
 # include "virnetdevvlan.h"
@@ -382,13 +383,6 @@ typedef enum {
     VIR_DOMAIN_HOSTDEV_CAPS_TYPE_LAST
 } virDomainHostdevCapsType;
 
-typedef struct _virDomainNetIPDef virDomainNetIPDef;
-typedef virDomainNetIPDef *virDomainNetIPDefPtr;
-struct _virDomainNetIPDef {
-    virSocketAddr address;       /* ipv4 or ipv6 address */
-    unsigned int prefix; /* number of 1 bits in the net mask */
-};
-
 typedef struct _virDomainHostdevCaps virDomainHostdevCaps;
 typedef virDomainHostdevCaps *virDomainHostdevCapsPtr;
 struct _virDomainHostdevCaps {
@@ -403,9 +397,9 @@ struct _virDomainHostdevCaps {
         struct {
             char *iface;
             size_t nips;
-            virDomainNetIPDefPtr *ips;
+            virNetDevIPAddrPtr *ips;
             size_t nroutes;
-            virNetworkRouteDefPtr *routes;
+            virNetDevIPRoutePtr *routes;
         } net;
     } u;
 };
@@ -983,9 +977,9 @@ struct _virDomainNetDef {
     int trustGuestRxFilters; /* enum virTristateBool */
     int linkstate;
     size_t nips;
-    virDomainNetIPDefPtr *ips;
+    virNetDevIPAddrPtr *ips;
     size_t nroutes;
-    virNetworkRouteDefPtr *routes;
+    virNetDevIPRoutePtr *routes;
 };
 
 /* Used for prefix of ifname of any network name generated dynamically
index 64c8138d45511ed688bf68fdc62dec51066705fc..2d904dfbe21b5fa0321b924acb17e946a5893f6c 100644 (file)
@@ -406,7 +406,7 @@ virNetworkDefFree(virNetworkDefPtr def)
     VIR_FREE(def->ips);
 
     for (i = 0; i < def->nroutes && def->routes; i++)
-        virNetworkRouteDefFree(def->routes[i]);
+        virNetDevIPRouteFree(def->routes[i]);
     VIR_FREE(def->routes);
 
     for (i = 0; i < def->nPortGroups && def->portGroups; i++)
@@ -804,7 +804,7 @@ virNetworkDefGetIPByIndex(const virNetworkDef *def,
 }
 
 /* return routes[index], or NULL if there aren't enough routes */
-virNetworkRouteDefPtr
+virNetDevIPRoutePtr
 virNetworkDefGetRouteByIndex(const virNetworkDef *def,
                              int family, size_t n)
 {
@@ -818,7 +818,7 @@ virNetworkDefGetRouteByIndex(const virNetworkDef *def,
 
     /* find the nth route of type "family" */
     for (i = 0; i < def->nroutes; i++) {
-        virSocketAddrPtr addr = virNetworkRouteDefGetAddress(def->routes[i]);
+        virSocketAddrPtr addr = virNetDevIPRouteGetAddress(def->routes[i]);
         if (VIR_SOCKET_ADDR_IS_FAMILY(addr, family)
             && (n-- <= 0)) {
             return def->routes[i];
@@ -2261,11 +2261,11 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
             goto error;
         /* parse each definition */
         for (i = 0; i < nRoutes; i++) {
-            virNetworkRouteDefPtr route = NULL;
+            virNetDevIPRoutePtr route = NULL;
 
-            if (!(route = virNetworkRouteDefParseXML(def->name,
-                                                     routeNodes[i],
-                                                     ctxt)))
+            if (!(route = virNetDevIPRouteParseXML(def->name,
+                                                   routeNodes[i],
+                                                   ctxt)))
                 goto error;
             def->routes[i] = route;
             def->nroutes++;
@@ -2283,8 +2283,8 @@ virNetworkDefParseXML(xmlXPathContextPtr ctxt)
             size_t j;
             virSocketAddr testAddr, testGw;
             bool addrMatch;
-            virNetworkRouteDefPtr gwdef = def->routes[i];
-            virSocketAddrPtr gateway = virNetworkRouteDefGetGateway(gwdef);
+            virNetDevIPRoutePtr gwdef = def->routes[i];
+            virSocketAddrPtr gateway = virNetDevIPRouteGetGateway(gwdef);
             addrMatch = false;
             for (j = 0; j < nips; j++) {
                 virNetworkIPDefPtr def2 = &def->ips[j];
@@ -2876,7 +2876,7 @@ virNetworkDefFormatBuf(virBufferPtr buf,
     }
 
     for (i = 0; i < def->nroutes; i++) {
-        if (virNetworkRouteDefFormat(buf, def->routes[i]) < 0)
+        if (virNetDevIPRouteFormat(buf, def->routes[i]) < 0)
             goto error;
     }
 
index 18f4d1ed2364f1df0adc56c3aa244024152d5457..e7ce67424a84eba2158bb6ebbeb398b05863d00e 100644 (file)
@@ -243,7 +243,7 @@ struct _virNetworkDef {
     virNetworkIPDefPtr ips; /* ptr to array of IP addresses on this network */
 
     size_t nroutes;
-    virNetworkRouteDefPtr *routes; /* ptr to array of static routes on this interface */
+    virNetDevIPRoutePtr *routes; /* ptr to array of static routes on this interface */
 
     virNetworkDNSDef dns;   /* dns related configuration */
     virNetDevVPortProfilePtr virtPortProfile;
@@ -354,7 +354,7 @@ virPortGroupDefPtr virPortGroupFindByName(virNetworkDefPtr net,
 virNetworkIPDefPtr
 virNetworkDefGetIPByIndex(const virNetworkDef *def,
                           int family, size_t n);
-virNetworkRouteDefPtr
+virNetDevIPRoutePtr
 virNetworkDefGetRouteByIndex(const virNetworkDef *def,
                              int family, size_t n);
 int virNetworkIPDefPrefix(const virNetworkIPDef *def);
index 529c06dd4750f538f0c81514e5fb11752c688304..29e978bbdfe5624d5c701dcf203a209e55d58e0f 100644 (file)
 
 #define VIR_FROM_THIS VIR_FROM_NETWORK
 
-struct _virNetworkRouteDef {
-    char *family;               /* ipv4 or ipv6 - default is ipv4 */
-    virSocketAddr address;      /* Routed Network IP address */
-
-    /* One or the other of the following two will be used for a given
-     * Network address, but never both. The parser guarantees this.
-     * The virSocketAddrGetIPPrefix() can be used to get a
-     * valid prefix.
-     */
-    virSocketAddr netmask;      /* ipv4 - either netmask or prefix specified */
-    unsigned int prefix;        /* ipv6 - only prefix allowed */
-    bool has_prefix;            /* prefix= was specified */
-    unsigned int metric;        /* value for metric (defaults to 1) */
-    bool has_metric;            /* metric= was specified */
-    virSocketAddr gateway;      /* gateway IP address for ip-route */
-};
-
-void
-virNetworkRouteDefFree(virNetworkRouteDefPtr def)
-{
-    if (!def)
-        return;
-    VIR_FREE(def->family);
-    VIR_FREE(def);
-}
-
-virNetworkRouteDefPtr
-virNetworkRouteDefCreate(const char *errorDetail,
-                         const char *family,
-                         const char *address,
-                         const char *netmask,
-                         const char *gateway,
-                         unsigned int prefix,
-                         bool hasPrefix,
-                         unsigned int metric,
-                         bool hasMetric)
+virNetDevIPRoutePtr
+virNetDevIPRouteCreate(const char *errorDetail,
+                       const char *family,
+                       const char *address,
+                       const char *netmask,
+                       const char *gateway,
+                       unsigned int prefix,
+                       bool hasPrefix,
+                       unsigned int metric,
+                       bool hasMetric)
 {
-    virNetworkRouteDefPtr def = NULL;
+    virNetDevIPRoutePtr def = NULL;
     virSocketAddr testAddr;
 
     if (VIR_ALLOC(def) < 0)
@@ -242,21 +216,21 @@ virNetworkRouteDefCreate(const char *errorDetail,
     return def;
 
  error:
-    virNetworkRouteDefFree(def);
+    virNetDevIPRouteFree(def);
     return NULL;
 }
 
-virNetworkRouteDefPtr
-virNetworkRouteDefParseXML(const char *errorDetail,
-                           xmlNodePtr node,
-                           xmlXPathContextPtr ctxt)
+virNetDevIPRoutePtr
+virNetDevIPRouteParseXML(const char *errorDetail,
+                         xmlNodePtr node,
+                         xmlXPathContextPtr ctxt)
 {
     /*
-     * virNetworkRouteDef object is already allocated as part
+     * virNetDevIPRoute object is already allocated as part
      * of an array.  On failure clear: it out, but don't free it.
      */
 
-    virNetworkRouteDefPtr def = NULL;
+    virNetDevIPRoutePtr def = NULL;
     xmlNodePtr save;
     char *family = NULL;
     char *address = NULL, *netmask = NULL;
@@ -302,9 +276,9 @@ virNetworkRouteDefParseXML(const char *errorDetail,
         }
     }
 
-    def = virNetworkRouteDefCreate(errorDetail, family, address, netmask,
-                                   gateway, prefix, hasPrefix, metric,
-                                   hasMetric);
+    def = virNetDevIPRouteCreate(errorDetail, family, address, netmask,
+                                 gateway, prefix, hasPrefix, metric,
+                                 hasMetric);
 
  cleanup:
     ctxt->node = save;
@@ -316,8 +290,8 @@ virNetworkRouteDefParseXML(const char *errorDetail,
 }
 
 int
-virNetworkRouteDefFormat(virBufferPtr buf,
-                         const virNetworkRouteDef *def)
+virNetDevIPRouteFormat(virBufferPtr buf,
+                       const virNetDevIPRoute *def)
 {
     int result = -1;
     char *addr = NULL;
@@ -354,62 +328,3 @@ virNetworkRouteDefFormat(virBufferPtr buf,
  cleanup:
     return result;
 }
-
-virSocketAddrPtr
-virNetworkRouteDefGetAddress(virNetworkRouteDefPtr def)
-{
-    if (def)
-        return &def->address;
-
-    return NULL;
-}
-
-int
-virNetworkRouteDefGetPrefix(virNetworkRouteDefPtr def)
-{
-    int prefix = 0;
-    virSocketAddr zero;
-
-    if (!def)
-        return -1;
-
-    /* this creates an all-0 address of the appropriate family */
-    ignore_value(virSocketAddrParse(&zero,
-                                    (VIR_SOCKET_ADDR_IS_FAMILY(&def->address, AF_INET)
-                                     ? VIR_SOCKET_ADDR_IPV4_ALL
-                                     : VIR_SOCKET_ADDR_IPV6_ALL),
-                                    VIR_SOCKET_ADDR_FAMILY(&def->address)));
-
-    if (virSocketAddrEqual(&def->address, &zero)) {
-        if (def->has_prefix && def->prefix == 0)
-            prefix = 0;
-        else if ((VIR_SOCKET_ADDR_IS_FAMILY(&def->netmask, AF_INET) &&
-                  virSocketAddrEqual(&def->netmask, &zero)))
-            prefix = 0;
-        else
-            prefix = virSocketAddrGetIPPrefix(&def->address, &def->netmask,
-                                              def->prefix);
-    } else {
-        prefix = virSocketAddrGetIPPrefix(&def->address, &def->netmask,
-                                          def->prefix);
-    }
-
-    return prefix;
-}
-
-unsigned int
-virNetworkRouteDefGetMetric(virNetworkRouteDefPtr def)
-{
-    if (def && def->has_metric && def->metric > 0)
-        return def->metric;
-
-    return 1;
-}
-
-virSocketAddrPtr
-virNetworkRouteDefGetGateway(virNetworkRouteDefPtr def)
-{
-    if (def)
-        return &def->gateway;
-    return NULL;
-}
index 41d8b9707b8da5a789db9481743b06389da41329..70e46793f67b2b5ae2ddb5dbeb20eb29c515b004 100644 (file)
 # include "internal.h"
 # include "virbuffer.h"
 # include "virsocketaddr.h"
-
-typedef struct _virNetworkRouteDef virNetworkRouteDef;
-typedef virNetworkRouteDef *virNetworkRouteDefPtr;
-
-void
-virNetworkRouteDefFree(virNetworkRouteDefPtr def);
-
-virNetworkRouteDefPtr
-virNetworkRouteDefCreate(const char *networkName,
-                         const char *family,
-                         const char *address,
-                         const char *netmask,
-                         const char *gateway,
-                         unsigned int prefix,
-                         bool hasPrefix,
-                         unsigned int metric,
-                         bool hasMetric);
-
-virNetworkRouteDefPtr
-virNetworkRouteDefParseXML(const char *networkName,
-                           xmlNodePtr node,
-                           xmlXPathContextPtr ctxt);
+# include "virnetdevip.h"
+
+virNetDevIPRoutePtr
+virNetDevIPRouteCreate(const char *networkName,
+                       const char *family,
+                       const char *address,
+                       const char *netmask,
+                       const char *gateway,
+                       unsigned int prefix,
+                       bool hasPrefix,
+                       unsigned int metric,
+                       bool hasMetric);
+
+virNetDevIPRoutePtr
+virNetDevIPRouteParseXML(const char *networkName,
+                         xmlNodePtr node,
+                         xmlXPathContextPtr ctxt);
 int
-virNetworkRouteDefFormat(virBufferPtr buf,
-                         const virNetworkRouteDef *def);
-
-virSocketAddrPtr
-virNetworkRouteDefGetAddress(virNetworkRouteDefPtr def);
-
-int
-virNetworkRouteDefGetPrefix(virNetworkRouteDefPtr def);
-
-unsigned int
-virNetworkRouteDefGetMetric(virNetworkRouteDefPtr def);
-
-virSocketAddrPtr
-virNetworkRouteDefGetGateway(virNetworkRouteDefPtr def);
+virNetDevIPRouteFormat(virBufferPtr buf,
+                       const virNetDevIPRoute *def);
 
 #endif /* __NETWORKCOMMON_CONF_H__ */
index 36191addac4086a77f796087fe0e5f9cd8315a35..b75db718e4086d5da5b4a1a363a8bf0897496b20 100644 (file)
@@ -644,14 +644,9 @@ virNetworkEventStateRegisterID;
 
 
 # conf/networkcommon_conf.h
-virNetworkRouteDefCreate;
-virNetworkRouteDefFormat;
-virNetworkRouteDefFree;
-virNetworkRouteDefGetAddress;
-virNetworkRouteDefGetGateway;
-virNetworkRouteDefGetMetric;
-virNetworkRouteDefGetPrefix;
-virNetworkRouteDefParseXML;
+virNetDevIPRouteCreate;
+virNetDevIPRouteFormat;
+virNetDevIPRouteParseXML;
 
 
 # conf/node_device_conf.h
@@ -1937,6 +1932,11 @@ virNetDevIPAddrAdd;
 virNetDevIPAddrDel;
 virNetDevIPAddrGet;
 virNetDevIPRouteAdd;
+virNetDevIPRouteFree;
+virNetDevIPRouteGetAddress;
+virNetDevIPRouteGetGateway;
+virNetDevIPRouteGetMetric;
+virNetDevIPRouteGetPrefix;
 virNetDevIPWaitDadFinish;
 
 
index 945366ae8be352bed91c17e1729b736c7b637a05..efca05821bf382f0eee0c8c8340edc27d1674b07 100644 (file)
@@ -513,7 +513,7 @@ static int lxcContainerRenameAndEnableInterfaces(virDomainDefPtr vmDef,
             goto error_out;
 
         for (j = 0; j < netDef->nips; j++) {
-            virDomainNetIPDefPtr ip = netDef->ips[j];
+            virNetDevIPAddrPtr ip = netDef->ips[j];
             int prefix;
             char *ipStr = virSocketAddrFormat(&ip->address);
 
@@ -547,13 +547,13 @@ static int lxcContainerRenameAndEnableInterfaces(virDomainDefPtr vmDef,
 
             /* Set the routes */
             for (j = 0; j < netDef->nroutes; j++) {
-                virNetworkRouteDefPtr route = netDef->routes[j];
+                virNetDevIPRoutePtr route = netDef->routes[j];
 
                 if (virNetDevIPRouteAdd(newname,
-                                        virNetworkRouteDefGetAddress(route),
-                                        virNetworkRouteDefGetPrefix(route),
-                                        virNetworkRouteDefGetGateway(route),
-                                        virNetworkRouteDefGetMetric(route)) < 0) {
+                                        virNetDevIPRouteGetAddress(route),
+                                        virNetDevIPRouteGetPrefix(route),
+                                        virNetDevIPRouteGetGateway(route),
+                                        virNetDevIPRouteGetMetric(route)) < 0) {
                     goto error_out;
                 }
                 VIR_FREE(toStr);
index 9ad1b0802ed10df1c53ce885ecf59387c946e462..5450c5d97371abf4a28ebb7edf8553a3267076b8 100644 (file)
@@ -419,7 +419,7 @@ typedef struct {
     char *macvlanmode;
     char *vlanid;
     char *name;
-    virDomainNetIPDefPtr *ips;
+    virNetDevIPAddrPtr *ips;
     size_t nips;
     char *gateway_ipv4;
     char *gateway_ipv6;
@@ -430,10 +430,10 @@ typedef struct {
 static int
 lxcAddNetworkRouteDefinition(const char *address,
                              int family,
-                             virNetworkRouteDefPtr **routes,
+                             virNetDevIPRoutePtr **routes,
                              size_t *nroutes)
 {
-    virNetworkRouteDefPtr route = NULL;
+    virNetDevIPRoutePtr route = NULL;
     char *familyStr = NULL;
     char *zero = NULL;
 
@@ -444,9 +444,9 @@ lxcAddNetworkRouteDefinition(const char *address,
     if (VIR_STRDUP(familyStr, family == AF_INET ? "ipv4" : "ipv6") < 0)
         goto error;
 
-    if (!(route = virNetworkRouteDefCreate(_("Domain interface"), familyStr,
-                                          zero, NULL, address, 0, false,
-                                          0, false)))
+    if (!(route = virNetDevIPRouteCreate(_("Domain interface"), familyStr,
+                                         zero, NULL, address, 0, false,
+                                         0, false)))
         goto error;
 
     if (VIR_APPEND_ELEMENT(*routes, *nroutes, route) < 0)
@@ -460,7 +460,7 @@ lxcAddNetworkRouteDefinition(const char *address,
  error:
     VIR_FREE(familyStr);
     VIR_FREE(zero);
-    virNetworkRouteDefFree(route);
+    virNetDevIPRouteFree(route);
     return -1;
 }
 
@@ -601,7 +601,7 @@ lxcNetworkWalkCallback(const char *name, virConfValuePtr value, void *data)
              STREQ(name, "lxc.network.ipv6")) {
         int family = AF_INET;
         char **ipparts = NULL;
-        virDomainNetIPDefPtr ip = NULL;
+        virNetDevIPAddrPtr ip = NULL;
 
         if (VIR_ALLOC(ip) < 0)
             return -1;
index ba96f2ef599026ffb4244052329d89926d4cb2b1..0221a3820b0a84f4ee7bf4f442cf383ebef17bc6 100644 (file)
@@ -2011,12 +2011,12 @@ networkStartHandleMACTableManagerMode(virNetworkObjPtr network,
 /* add an IP (static) route to a bridge */
 static int
 networkAddRouteToBridge(virNetworkObjPtr network,
-                        virNetworkRouteDefPtr routedef)
+                        virNetDevIPRoutePtr routedef)
 {
-    int prefix = virNetworkRouteDefGetPrefix(routedef);
-    unsigned int metric = virNetworkRouteDefGetMetric(routedef);
-    virSocketAddrPtr addr = virNetworkRouteDefGetAddress(routedef);
-    virSocketAddrPtr gateway = virNetworkRouteDefGetGateway(routedef);
+    int prefix = virNetDevIPRouteGetPrefix(routedef);
+    unsigned int metric = virNetDevIPRouteGetMetric(routedef);
+    virSocketAddrPtr addr = virNetDevIPRouteGetAddress(routedef);
+    virSocketAddrPtr gateway = virNetDevIPRouteGetGateway(routedef);
 
     if (prefix < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
@@ -2067,7 +2067,7 @@ networkStartNetworkVirtual(virNetworkDriverStatePtr driver,
     bool v4present = false, v6present = false;
     virErrorPtr save_err = NULL;
     virNetworkIPDefPtr ipdef;
-    virNetworkRouteDefPtr routedef;
+    virNetDevIPRoutePtr routedef;
     char *macTapIfName = NULL;
     int tapfd = -1;
 
@@ -2162,7 +2162,7 @@ networkStartNetworkVirtual(virNetworkDriverStatePtr driver,
         virSocketAddrPtr gateway = NULL;
 
         routedef = network->def->routes[i];
-        gateway = virNetworkRouteDefGetGateway(routedef);
+        gateway = virNetDevIPRouteGetGateway(routedef);
 
         /* Add the IP route to the bridge */
         /* ignore errors, error msg will be generated */
index b41a1ba744bedb4e0cd5adeeed6167c36004f694..3effcdce222d94daf0484de90ae17ee60c088c0e 100644 (file)
@@ -69,7 +69,7 @@ int networkCheckRouteCollision(virNetworkDefPtr def)
         char iface[17], dest[128], mask[128];
         unsigned int addr_val, mask_val;
         virNetworkIPDefPtr ipdef;
-        virNetworkRouteDefPtr routedef;
+        virNetDevIPRoutePtr routedef;
         int num;
         size_t i;
 
@@ -130,8 +130,8 @@ int networkCheckRouteCollision(virNetworkDefPtr def)
              i++) {
 
             virSocketAddr r_mask, r_addr;
-            virSocketAddrPtr tmp_addr = virNetworkRouteDefGetAddress(routedef);
-            int r_prefix = virNetworkRouteDefGetPrefix(routedef);
+            virSocketAddrPtr tmp_addr = virNetDevIPRouteGetAddress(routedef);
+            int r_prefix = virNetDevIPRouteGetPrefix(routedef);
 
             if (!tmp_addr ||
                 virSocketAddrMaskByPrefix(tmp_addr, r_prefix, &r_addr) < 0 ||
index 044f2bc0d6b2761b54541815740ec2618bfc8ebd..619f926782dc23ca35e1b81c02a6071434e1c2eb 100644 (file)
@@ -776,3 +776,72 @@ virNetDevIPAddrGet(const char *ifname,
                          _("Unable to get IP address on this platform"));
     return -1;
 }
+
+/* manipulating the virNetDevIPRoute object */
+void
+virNetDevIPRouteFree(virNetDevIPRoutePtr def)
+{
+    if (!def)
+        return;
+    VIR_FREE(def->family);
+    VIR_FREE(def);
+}
+
+virSocketAddrPtr
+virNetDevIPRouteGetAddress(virNetDevIPRoutePtr def)
+{
+    if (def)
+        return &def->address;
+
+    return NULL;
+}
+
+int
+virNetDevIPRouteGetPrefix(virNetDevIPRoutePtr def)
+{
+    int prefix = 0;
+    virSocketAddr zero;
+
+    if (!def)
+        return -1;
+
+    /* this creates an all-0 address of the appropriate family */
+    ignore_value(virSocketAddrParse(&zero,
+                                    (VIR_SOCKET_ADDR_IS_FAMILY(&def->address, AF_INET)
+                                     ? VIR_SOCKET_ADDR_IPV4_ALL
+                                     : VIR_SOCKET_ADDR_IPV6_ALL),
+                                    VIR_SOCKET_ADDR_FAMILY(&def->address)));
+
+    if (virSocketAddrEqual(&def->address, &zero)) {
+        if (def->has_prefix && def->prefix == 0)
+            prefix = 0;
+        else if ((VIR_SOCKET_ADDR_IS_FAMILY(&def->netmask, AF_INET) &&
+                  virSocketAddrEqual(&def->netmask, &zero)))
+            prefix = 0;
+        else
+            prefix = virSocketAddrGetIPPrefix(&def->address, &def->netmask,
+                                              def->prefix);
+    } else {
+        prefix = virSocketAddrGetIPPrefix(&def->address, &def->netmask,
+                                          def->prefix);
+    }
+
+    return prefix;
+}
+
+unsigned int
+virNetDevIPRouteGetMetric(virNetDevIPRoutePtr def)
+{
+    if (def && def->has_metric && def->metric > 0)
+        return def->metric;
+
+    return 1;
+}
+
+virSocketAddrPtr
+virNetDevIPRouteGetGateway(virNetDevIPRoutePtr def)
+{
+    if (def)
+        return &def->gateway;
+    return NULL;
+}
index f60465d7ca683ef60a983a5db710b2fcecf88846..7a07b73e09a5dec9c20655c5a4b5faed0b6e7834 100644 (file)
 
 # include "virsocketaddr.h"
 
+typedef struct {
+    virSocketAddr address;       /* ipv4 or ipv6 address */
+    unsigned int prefix; /* number of 1 bits in the net mask */
+} virNetDevIPAddr, *virNetDevIPAddrPtr;
+
+typedef struct {
+    char *family;               /* ipv4 or ipv6 - default is ipv4 */
+    virSocketAddr address;      /* Routed Network IP address */
+
+    /* One or the other of the following two will be used for a given
+     * Network address, but never both. The parser guarantees this.
+     * The virSocketAddrGetIPPrefix() can be used to get a
+     * valid prefix.
+     */
+    virSocketAddr netmask;      /* ipv4 - either netmask or prefix specified */
+    unsigned int prefix;        /* ipv6 - only prefix allowed */
+    bool has_prefix;            /* prefix= was specified */
+    unsigned int metric;        /* value for metric (defaults to 1) */
+    bool has_metric;            /* metric= was specified */
+    virSocketAddr gateway;      /* gateway IP address for ip-route */
+} virNetDevIPRoute, *virNetDevIPRoutePtr;
+
 /* manipulating/querying the netdev */
 int virNetDevIPAddrAdd(const char *ifname,
                        virSocketAddr *addr,
@@ -47,4 +69,11 @@ int virNetDevIPAddrGet(const char *ifname, virSocketAddrPtr addr)
 int virNetDevIPWaitDadFinish(virSocketAddrPtr *addrs, size_t count)
     ATTRIBUTE_NONNULL(1);
 
+/* virNetDevIPRoute object */
+void virNetDevIPRouteFree(virNetDevIPRoutePtr def);
+virSocketAddrPtr virNetDevIPRouteGetAddress(virNetDevIPRoutePtr def);
+int virNetDevIPRouteGetPrefix(virNetDevIPRoutePtr def);
+unsigned int virNetDevIPRouteGetMetric(virNetDevIPRoutePtr def);
+virSocketAddrPtr virNetDevIPRouteGetGateway(virNetDevIPRoutePtr def);
+
 #endif /* __VIR_NETDEVIP_H__ */