From fa18e814ba8f46eb5fcbcec22e27b40e81da5d4c Mon Sep 17 00:00:00 2001 From: Laine Stump Date: Tue, 14 Jun 2016 13:40:04 -0400 Subject: [PATCH] util: move IP route & address object-related functions to virnetdevip.c 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. --- src/conf/domain_conf.c | 42 +++++----- src/conf/domain_conf.h | 16 ++-- src/conf/network_conf.c | 20 ++--- src/conf/network_conf.h | 4 +- src/conf/networkcommon_conf.c | 131 ++++++------------------------ src/conf/networkcommon_conf.h | 51 ++++-------- src/libvirt_private.syms | 16 ++-- src/lxc/lxc_container.c | 12 +-- src/lxc/lxc_native.c | 16 ++-- src/network/bridge_driver.c | 14 ++-- src/network/bridge_driver_linux.c | 6 +- src/util/virnetdevip.c | 69 ++++++++++++++++ src/util/virnetdevip.h | 29 +++++++ 13 files changed, 208 insertions(+), 218 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index a1d835d8c7..07b9a57c7e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -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; } diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index d599551a6e..6f9c536fe3 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -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 diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index 64c8138d45..2d904dfbe2 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -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; } diff --git a/src/conf/network_conf.h b/src/conf/network_conf.h index 18f4d1ed23..e7ce67424a 100644 --- a/src/conf/network_conf.h +++ b/src/conf/network_conf.h @@ -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); diff --git a/src/conf/networkcommon_conf.c b/src/conf/networkcommon_conf.c index 529c06dd47..29e978bbdf 100644 --- a/src/conf/networkcommon_conf.c +++ b/src/conf/networkcommon_conf.c @@ -32,44 +32,18 @@ #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) +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) { - 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) -{ - 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; -} diff --git a/src/conf/networkcommon_conf.h b/src/conf/networkcommon_conf.h index 41d8b9707b..70e46793f6 100644 --- a/src/conf/networkcommon_conf.h +++ b/src/conf/networkcommon_conf.h @@ -31,42 +31,25 @@ # include "internal.h" # include "virbuffer.h" # include "virsocketaddr.h" +# include "virnetdevip.h" -typedef struct _virNetworkRouteDef virNetworkRouteDef; -typedef virNetworkRouteDef *virNetworkRouteDefPtr; +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); -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); +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__ */ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 36191addac..b75db718e4 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -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; diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c index 945366ae8b..efca05821b 100644 --- a/src/lxc/lxc_container.c +++ b/src/lxc/lxc_container.c @@ -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); diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c index 9ad1b0802e..5450c5d973 100644 --- a/src/lxc/lxc_native.c +++ b/src/lxc/lxc_native.c @@ -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; diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c index ba96f2ef59..0221a3820b 100644 --- a/src/network/bridge_driver.c +++ b/src/network/bridge_driver.c @@ -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 */ diff --git a/src/network/bridge_driver_linux.c b/src/network/bridge_driver_linux.c index b41a1ba744..3effcdce22 100644 --- a/src/network/bridge_driver_linux.c +++ b/src/network/bridge_driver_linux.c @@ -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 || diff --git a/src/util/virnetdevip.c b/src/util/virnetdevip.c index 044f2bc0d6..619f926782 100644 --- a/src/util/virnetdevip.c +++ b/src/util/virnetdevip.c @@ -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; +} diff --git a/src/util/virnetdevip.h b/src/util/virnetdevip.h index f60465d7ca..7a07b73e09 100644 --- a/src/util/virnetdevip.h +++ b/src/util/virnetdevip.h @@ -25,6 +25,28 @@ # 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__ */