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