On 01/15/2015 04:25 AM, Cédric Bosdonnat wrote:
---
docs/formatdomain.html.in | 9 +-
docs/schemas/domaincommon.rng | 29 +-----
docs/schemas/network.rng | 2 +-
docs/schemas/networkcommon.rng | 2 +-
src/conf/domain_conf.c | 121 +++++-----------------
src/conf/domain_conf.h | 14 +--
src/conf/networkcommon_conf.c | 6 +-
src/conf/networkcommon_conf.h | 6 +-
src/lxc/lxc_container.c | 22 ++--
src/lxc/lxc_native.c | 20 ++--
tests/lxcconf2xmldata/lxcconf2xml-physnetwork.xml | 4 +-
tests/lxcconf2xmldata/lxcconf2xml-simple.xml | 4 +-
tests/lxcxml2xmldata/lxc-hostdev.xml | 4 +-
tests/lxcxml2xmldata/lxc-idmap.xml | 4 +-
14 files changed, 74 insertions(+), 173 deletions(-)
diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 0c3343e..1d69ca6 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -4371,12 +4371,9 @@ qemu-kvm -net nic,model=? /dev/null
<p>
<span class="since">Since 1.2.12</span> route elements can
also be added
- to define the network routes to use for the network device. This element
- has a <code>family</code> attribute set either to
<code>ipv4</code> or
- <code>ipv6</code>, a mandatory <code>via</code> attribute
defining the
- IP address to route throught and optional <code>address</code> and
<code>prefix</code>
- attributes defining the target network range. If those aren't given, then
- a default route will be set.
+ to define the network routes to use for the network device. The attributes
+ of this element are described in the documentation for the
<code>route</code>
+ element in <a href="formatnetwork.html#elementsStaticroute">network
definitions</a>.
This is only used by the LXC driver.
</p>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 85b3709..af7abd2 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2330,9 +2330,7 @@
</element>
</zeroOrMore>
<zeroOrMore>
- <element name="route">
- <ref name="route"/>
- </element>
+ <ref name="route"/>
</zeroOrMore>
<optional>
<element name="script">
@@ -3602,27 +3600,6 @@
</element>
</define>
- <define name="route">
- <interleave>
- <attribute name="family">
- <ref name="addr-family"/>
- </attribute>
- <attribute name="via">
- <ref name="ipAddr"/>
- </attribute>
- <optional>
- <attribute name="address">
- <ref name="ipAddr"/>
- </attribute>
- </optional>
- <optional>
- <attribute name="prefix">
- <ref name="ipPrefix"/>
- </attribute>
- </optional>
- </interleave>
- </define>
-
<define name="hostdev">
<element name="hostdev">
<interleave>
@@ -3859,9 +3836,7 @@
</element>
</zeroOrMore>
<zeroOrMore>
- <element name="route">
- <ref name="route"/>
- </element>
+ <ref name="route"/>
</zeroOrMore>
</interleave>
</define>
diff --git a/docs/schemas/network.rng b/docs/schemas/network.rng
index 63d81c1..a6b8cb2 100644
--- a/docs/schemas/network.rng
+++ b/docs/schemas/network.rng
@@ -371,7 +371,7 @@
</zeroOrMore>
<!-- <route> element -->
<zeroOrMore>
- <ref name="routex"/>
+ <ref name="route"/>
</zeroOrMore>
</interleave>
</element>
diff --git a/docs/schemas/networkcommon.rng b/docs/schemas/networkcommon.rng
index cbcae91..162ea3d 100644
--- a/docs/schemas/networkcommon.rng
+++ b/docs/schemas/networkcommon.rng
@@ -228,7 +228,7 @@
<!-- The (static) route element specifies a network address and gateway
address to access that network. Both the network address and
the gateway address must be specified. -->
- <define name='routex'>
+ <define name='route'>
<element name="route">
<optional>
<attribute name="family"><ref
name="addr-family"/></attribute>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 714ad56..3c5f279 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -3,6 +3,7 @@
*
* Copyright (C) 2006-2014 Red Hat, Inc.
* Copyright (C) 2006-2008 Daniel P. Berrange
+ * Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -1447,10 +1448,10 @@ void virDomainNetDefFree(virDomainNetDefPtr def)
VIR_FREE(def->ips);
for (i = 0; i < def->nroutes; i++)
- VIR_FREE(def->routes[i]);
+ virNetworkRouteDefFree(def->routes[i]);
VIR_FREE(def->routes);
- virDomainDeviceInfoClear(&def->info);
+ virDomainDeviceInfoClear(&def->info);
VIR_FREE(def->filter);
virNWFilterHashTableFree(def->filterparams);
@@ -4809,64 +4810,6 @@ virDomainNetIpParseXML(xmlNodePtr node)
return NULL;
}
-static virDomainNetRouteDefPtr
-virDomainNetRouteParse(xmlNodePtr node)
-{
- virDomainNetRouteDefPtr route = NULL;
- char *familyStr = NULL;
- int family = AF_UNSPEC;
- char *via = NULL;
- char *to = NULL;
- char *prefixStr = NULL;
-
- to = virXMLPropString(node, "address");
- if (!(via = virXMLPropString(node, "via"))) {
- virReportError(VIR_ERR_INVALID_ARG, "%s",
- _("Missing route address"));
- goto error;
- }
-
- familyStr = virXMLPropString(node, "family");
- if (familyStr && STREQ(familyStr, "ipv4"))
- family = AF_INET;
- else if (familyStr && STREQ(familyStr, "ipv6"))
- family = AF_INET6;
- else
- family = virSocketAddrNumericFamily(via);
-
- if (VIR_ALLOC(route) < 0)
- goto error;
-
- if (virSocketAddrParse(&route->via, via, family) < 0) {
- virReportError(VIR_ERR_INVALID_ARG,
- _("Failed to parse IP address: '%s'"),
- via);
- goto error;
- }
-
- if (to && virSocketAddrParse(&route->to, to, family) < 0) {
- virReportError(VIR_ERR_INVALID_ARG,
- _("Failed to parse IP address: '%s'"),
- to);
- goto error;
- }
-
- if (!(prefixStr = virXMLPropString(node, "prefix")) ||
- (virStrToLong_ui(prefixStr, NULL, 10, &route->prefix) < 0)) {
- }
-
- return route;
-
- error:
- VIR_FREE(familyStr);
- VIR_FREE(via);
- VIR_FREE(to);
- VIR_FREE(prefixStr);
- VIR_FREE(route);
-
- return NULL;
-}
-
static int
virDomainHostdevDefParseXMLCaps(xmlNodePtr node ATTRIBUTE_UNUSED,
xmlXPathContextPtr ctxt,
@@ -4960,14 +4903,17 @@ virDomainHostdevDefParseXMLCaps(xmlNodePtr node
ATTRIBUTE_UNUSED,
if (nroutenodes) {
size_t i;
for (i = 0; i < nroutenodes; i++) {
- virDomainNetRouteDefPtr route = virDomainNetRouteParse(routenodes[i]);
+ virNetworkRouteDefPtr route = NULL;
- if (!route)
+ if (!(route = virNetworkRouteDefParseXML(_("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)
{
- VIR_FREE(route);
+ virNetworkRouteDefFree(route);
goto error;
}
}
@@ -7428,7 +7374,7 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
size_t nips = 0;
virDomainNetIpDefPtr *ips = NULL;
size_t nroutes = 0;
- virDomainNetRouteDefPtr *routes = NULL;
+ virNetworkRouteDefPtr *routes = NULL;
if (VIR_ALLOC(def) < 0)
return NULL;
@@ -7526,12 +7472,15 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
if (VIR_APPEND_ELEMENT(ips, nips, ip) < 0)
goto error;
} else if (xmlStrEqual(cur->name, BAD_CAST "route")) {
- virDomainNetRouteDefPtr route = NULL;
- if (!(route = virDomainNetRouteParse(cur)))
+ virNetworkRouteDefPtr route = NULL;
+ if (!(route = virNetworkRouteDefParseXML(_("Domain
interface"),
+ cur, ctxt)))
goto error;
- if (VIR_APPEND_ELEMENT(routes, nroutes, route) < 0)
+ if (VIR_APPEND_ELEMENT(routes, nroutes, route) < 0) {
+ virNetworkRouteDefFree(route);
goto error;
+ }
} else if (!ifname &&
xmlStrEqual(cur->name, BAD_CAST "target")) {
ifname = virXMLPropString(cur, "dev");
@@ -17257,35 +17206,17 @@ virDomainNetIpsFormat(virBufferPtr buf, virDomainNetIpDefPtr
*ips, size_t nips)
}
}
-static void
+static int
virDomainNetRoutesFormat(virBufferPtr buf,
- virDomainNetRouteDefPtr *routes,
+ virNetworkRouteDefPtr *routes,
size_t nroutes)
{
size_t i;
- for (i = 0; i < nroutes; i++) {
- virDomainNetRouteDefPtr route = routes[i];
- const char *familyStr = NULL;
- char *via = virSocketAddrFormat(&route->via);
- char *to = NULL;
-
- if (VIR_SOCKET_ADDR_IS_FAMILY(&route->via, AF_INET6))
- familyStr = "ipv6";
- else if (VIR_SOCKET_ADDR_IS_FAMILY(&route->via, AF_INET))
- familyStr = "ipv4";
- virBufferAsprintf(buf, "<route family='%s'
via='%s'", familyStr, via);
-
- if (VIR_SOCKET_ADDR_VALID(&route->to)) {
- to = virSocketAddrFormat(&route->to);
- virBufferAsprintf(buf, " address='%s'", to);
- }
-
- if (route->prefix > 0)
- virBufferAsprintf(buf, " prefix='%d'", route->prefix);
-
- virBufferAddLit(buf, "/>\n");
- }
+ for (i = 0; i < nroutes; i++)
+ if (virNetworkRouteDefFormat(buf, routes[i]) < 0)
+ return -1;
+ return 0;
}
static int
@@ -17443,8 +17374,9 @@ virDomainHostdevDefFormatCaps(virBufferPtr buf,
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);
- virDomainNetRoutesFormat(buf, def->source.caps.u.net.routes,
- def->source.caps.u.net.nroutes);
+ if (virDomainNetRoutesFormat(buf, def->source.caps.u.net.routes,
+ def->source.caps.u.net.nroutes) < 0)
+ return -1;
}
return 0;
@@ -17834,7 +17766,8 @@ virDomainNetDefFormat(virBufferPtr buf,
}
virDomainNetIpsFormat(buf, def->ips, def->nips);
- virDomainNetRoutesFormat(buf, def->routes, def->nroutes);
+ if (virDomainNetRoutesFormat(buf, def->routes, def->nroutes) < 0)
+ return -1;
virBufferEscapeString(buf, "<script path='%s'/>\n",
def->script);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 1153497..1e0d1b4 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -3,6 +3,7 @@
*
* Copyright (C) 2006-2014 Red Hat, Inc.
* Copyright (C) 2006-2008 Daniel P. Berrange
+ * Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -35,6 +36,7 @@
# include "virthread.h"
# include "virhash.h"
# include "virsocketaddr.h"
+# include "networkcommon_conf.h"
# include "nwfilter_params.h"
# include "numatune_conf.h"
# include "virnetdevmacvlan.h"
@@ -485,14 +487,6 @@ struct _virDomainNetIpDef {
unsigned int prefix; /* number of 1 bits in the net mask */
};
-typedef struct _virDomainNetRouteDef virDomainNetRouteDef;
-typedef virDomainNetRouteDef *virDomainNetRouteDefPtr;
-struct _virDomainNetRouteDef {
- virSocketAddr via;
- virSocketAddr to;
- unsigned int prefix;
-};
-
typedef struct _virDomainHostdevCaps virDomainHostdevCaps;
typedef virDomainHostdevCaps *virDomainHostdevCapsPtr;
struct _virDomainHostdevCaps {
@@ -509,7 +503,7 @@ struct _virDomainHostdevCaps {
size_t nips;
virDomainNetIpDefPtr *ips;
size_t nroutes;
- virDomainNetRouteDefPtr *routes;
+ virNetworkRouteDefPtr *routes;
} net;
} u;
};
@@ -1013,7 +1007,7 @@ struct _virDomainNetDef {
size_t nips;
virDomainNetIpDefPtr *ips;
size_t nroutes;
- virDomainNetRouteDefPtr *routes;
+ virNetworkRouteDefPtr *routes;
};
/* Used for prefix of ifname of any network name generated dynamically
diff --git a/src/conf/networkcommon_conf.c b/src/conf/networkcommon_conf.c
index 1545367..b6e4ff4 100644
--- a/src/conf/networkcommon_conf.c
+++ b/src/conf/networkcommon_conf.c
@@ -58,9 +58,9 @@ virNetworkRouteDefFree(virNetworkRouteDefPtr def)
virNetworkRouteDefPtr
virNetworkRouteDefCreate(const char *errorDetail,
char *family,
- char *address,
- char *netmask,
- char *gateway,
+ const char *address,
+ const char *netmask,
+ const char *gateway,
unsigned int prefix,
bool hasPrefix,
unsigned int metric,
diff --git a/src/conf/networkcommon_conf.h b/src/conf/networkcommon_conf.h
index 4d2b1d2..1500d0f 100644
--- a/src/conf/networkcommon_conf.h
+++ b/src/conf/networkcommon_conf.h
@@ -41,9 +41,9 @@ virNetworkRouteDefFree(virNetworkRouteDefPtr def);
virNetworkRouteDefPtr
virNetworkRouteDefCreate(const char *networkName,
char *family,
- char *address,
- char *netmask,
- char *gateway,
+ const char *address,
+ const char *netmask,
+ const char *gateway,
unsigned int prefix,
bool hasPrefix,
unsigned int metric,
diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
index 0e6cdfd..e848e8e 100644
--- a/src/lxc/lxc_container.c
+++ b/src/lxc/lxc_container.c
@@ -1,6 +1,7 @@
/*
* Copyright (C) 2008-2014 Red Hat, Inc.
* Copyright (C) 2008 IBM Corp.
+ * Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
*
* lxc_container.c: file description
*
@@ -544,20 +545,13 @@ static int lxcContainerRenameAndEnableInterfaces(virDomainDefPtr
vmDef,
/* Set the routes */
for (j = 0; j < netDef->nroutes; j++) {
- virDomainNetRouteDefPtr route = netDef->routes[j];
- if (VIR_SOCKET_ADDR_VALID(&route->to))
- toStr = virSocketAddrFormat(&route->to);
- else
- if (VIR_STRDUP(toStr, "default") < 0)
- goto error_out;
- viaStr = virSocketAddrFormat(&route->via);
- VIR_DEBUG("Adding route %s/%d via %s", toStr,
route->prefix, viaStr);
-
- if (virNetDevAddRoute(newname, &route->to, route->prefix,
- &route->via, 0) < 0) {
- virReportError(VIR_ERR_SYSTEM_ERROR,
- _("Failed to add route %s/%d via %s"),
- toStr, route->prefix, viaStr);
+ virNetworkRouteDefPtr route = netDef->routes[j];
+
+ if (virNetDevAddRoute(newname,
+ virNetworkRouteDefGetAddress(route),
+ virNetworkRouteDefGetPrefix(route),
+ virNetworkRouteDefGetGateway(route),
+ virNetworkRouteDefGetMetric(route)) < 0) {
goto error_out;
}
VIR_FREE(toStr);
diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
index d7cd1d5..c9b1567 100644
--- a/src/lxc/lxc_native.c
+++ b/src/lxc/lxc_native.c
@@ -2,7 +2,7 @@
* lxc_native.c: LXC native configuration import
*
* Copyright (c) 2014 Red Hat, Inc.
- * Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
+ * Copyright (c) 2013-2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -433,15 +433,23 @@ typedef struct {
static int
lxcAddNetworkRouteDefinition(const char *address,
int family,
- virDomainNetRouteDefPtr **routes,
+ virNetworkRouteDefPtr **routes,
size_t *nroutes)
{
- virDomainNetRouteDefPtr route = NULL;
+ virNetworkRouteDefPtr route = NULL;
+ char *familyStr = NULL;
+ char *zero = NULL;
- if (VIR_ALLOC(route) < 0)
+ if (VIR_STRDUP(zero, family == AF_INET ? VIR_SOCKET_ADDR_IPV4_ALL
+ : VIR_SOCKET_ADDR_IPV6_ALL) < 0)
goto error;
- if (virSocketAddrParse(&route->via, address, family) < 0)
+ 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)))
goto error;
if (VIR_APPEND_ELEMENT(*routes, *nroutes, route) < 0)
@@ -450,7 +458,7 @@ lxcAddNetworkRouteDefinition(const char *address,
return 0;
error:
- VIR_FREE(route);
+ virNetworkRouteDefFree(route);
return -1;
}
diff --git a/tests/lxcconf2xmldata/lxcconf2xml-physnetwork.xml
b/tests/lxcconf2xmldata/lxcconf2xml-physnetwork.xml
index d2cec8f..79bcfa0 100644
--- a/tests/lxcconf2xmldata/lxcconf2xml-physnetwork.xml
+++ b/tests/lxcconf2xmldata/lxcconf2xml-physnetwork.xml
@@ -27,8 +27,8 @@
</source>
<ip address='192.168.122.2' family='ipv4'
prefix='24'/>
<ip address='2003:db8:1:0:214:1234:fe0b:3596' family='ipv6'
prefix='64'/>
- <route family='ipv4' via='192.168.122.1'/>
- <route family='ipv6'
via='2003:db8:1:0:214:1234:fe0b:3595'/>
+ <route family='ipv4' address='0.0.0.0'
gateway='192.168.122.1'/>
+ <route family='ipv6' address='::'
gateway='2003:db8:1:0:214:1234:fe0b:3595'/>
</hostdev>
</devices>
</domain>
diff --git a/tests/lxcconf2xmldata/lxcconf2xml-simple.xml
b/tests/lxcconf2xmldata/lxcconf2xml-simple.xml
index b1210e5..45a2012 100644
--- a/tests/lxcconf2xmldata/lxcconf2xml-simple.xml
+++ b/tests/lxcconf2xmldata/lxcconf2xml-simple.xml
@@ -39,8 +39,8 @@
<source bridge='virbr0'/>
<ip address='192.168.122.2' family='ipv4'
prefix='24'/>
<ip address='2003:db8:1:0:214:1234:fe0b:3596' family='ipv6'
prefix='64'/>
- <route family='ipv4' via='192.168.122.1'/>
- <route family='ipv6'
via='2003:db8:1:0:214:1234:fe0b:3595'/>
+ <route family='ipv4' address='0.0.0.0'
gateway='192.168.122.1'/>
+ <route family='ipv6' address='::'
gateway='2003:db8:1:0:214:1234:fe0b:3595'/>
<guest dev='eth0'/>
<link state='up'/>
</interface>
diff --git a/tests/lxcxml2xmldata/lxc-hostdev.xml b/tests/lxcxml2xmldata/lxc-hostdev.xml
index 61e8655..3972594 100644
--- a/tests/lxcxml2xmldata/lxc-hostdev.xml
+++ b/tests/lxcxml2xmldata/lxc-hostdev.xml
@@ -37,8 +37,8 @@
</source>
<ip address='192.168.122.2' family='ipv4'/>
<ip address='2003:db8:1:0:214:1234:fe0b:3596' family='ipv6'
prefix='24'/>
- <route family='ipv4' via='192.168.122.1'/>
- <route family='ipv6'
via='2003:db8:1:0:214:1234:fe0b:3595'/>
+ <route family='ipv4' address='0.0.0.0'
gateway='192.168.122.1'/>
+ <route family='ipv6' address='::'
gateway='2003:db8:1:0:214:1234:fe0b:3595'/>
</hostdev>
</devices>
</domain>
diff --git a/tests/lxcxml2xmldata/lxc-idmap.xml b/tests/lxcxml2xmldata/lxc-idmap.xml
index 2b04a65..b477636 100644
--- a/tests/lxcxml2xmldata/lxc-idmap.xml
+++ b/tests/lxcxml2xmldata/lxc-idmap.xml
@@ -30,8 +30,8 @@
<source bridge='bri0'/>
<ip address='192.168.122.12' family='ipv4'
prefix='24'/>
<ip address='192.168.122.13' family='ipv4'
prefix='24'/>
- <route family='ipv4' via='192.168.122.1'/>
- <route family='ipv4' via='192.168.124.1'
address='192.168.124.0' prefix='24'/>
+ <route family='ipv4' address='0.0.0.0'
gateway='192.168.122.1'/>
+ <route family='ipv4' address='192.168.124.0'
prefix='24' gateway='192.168.124.1'/>
<target dev='veth0'/>
<guest dev='eth2'/>
</interface>
ACK.