[libvirt] [PATCHv2 4/7] Use the network route definitions for domains
Laine Stump
laine at laine.org
Thu Jan 15 18:43:10 UTC 2015
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.
More information about the libvir-list
mailing list