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. -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list