diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 38590a682180e260c54a8752cbfe9ead2d2037fe..563cb3c43781b0762b90237895370d4ceed386be 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -2420,27 +2420,7 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 81bc93de052b3bca4c044d9978aeae66bdaafa0f..7c1c3b6c9f099157dbc5f5de90bf175c88e86328 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1740,8 +1740,6 @@ virDomainActualNetDefFree(virDomainActualNetDefPtr def)
void
virDomainNetDefClear(virDomainNetDefPtr def)
{
- size_t i;
-
if (!def)
return;
@@ -1799,14 +1797,7 @@ virDomainNetDefClear(virDomainNetDefPtr def)
VIR_FREE(def->ifname_guest);
VIR_FREE(def->ifname_guest_actual);
- for (i = 0; i < def->nips; i++)
- VIR_FREE(def->ips[i]);
- VIR_FREE(def->ips);
-
- for (i = 0; i < def->nroutes; i++)
- virNetDevIPRouteFree(def->routes[i]);
- VIR_FREE(def->routes);
-
+ virNetDevIPInfoClear(&def->guestIP);
virDomainDeviceInfoClear(&def->info);
VIR_FREE(def->filter);
@@ -8898,7 +8889,7 @@ virDomainNetAppendIPAddress(virDomainNetDefPtr def,
goto error;
ipDef->prefix = prefix;
- if (VIR_APPEND_ELEMENT(def->ips, def->nips, ipDef) < 0)
+ if (VIR_APPEND_ELEMENT(def->guestIP.ips, def->guestIP.nips, ipDef) < 0)
goto error;
return 0;
@@ -8960,11 +8951,6 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
virDomainActualNetDefPtr actual = NULL;
xmlNodePtr oldnode = ctxt->node;
int ret, val;
- size_t i;
- size_t nips = 0;
- virNetDevIPAddrPtr *ips = NULL;
- size_t nroutes = 0;
- virNetDevIPRoutePtr *routes = NULL;
if (VIR_ALLOC(def) < 0)
return NULL;
@@ -9080,24 +9066,6 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
localport = virXPathString("string(./local/@port)", ctxt);
ctxt->node = tmpnode;
}
- } else if (xmlStrEqual(cur->name, BAD_CAST "ip")) {
- virNetDevIPAddrPtr ip = NULL;
-
- if (!(ip = virDomainNetIPParseXML(cur)))
- goto error;
-
- if (VIR_APPEND_ELEMENT(ips, nips, ip) < 0)
- goto error;
- } else if (xmlStrEqual(cur->name, BAD_CAST "route")) {
- virNetDevIPRoutePtr route = NULL;
- if (!(route = virNetDevIPRouteParseXML(_("Domain interface"),
- cur, ctxt)))
- goto error;
-
- if (VIR_APPEND_ELEMENT(routes, nroutes, route) < 0) {
- virNetDevIPRouteFree(route);
- goto error;
- }
} else if (!ifname &&
xmlStrEqual(cur->name, BAD_CAST "target")) {
ifname = virXMLPropString(cur, "dev");
@@ -9418,12 +9386,9 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
break;
}
- for (i = 0; i < nips; i++) {
- if (VIR_APPEND_ELEMENT(def->ips, def->nips, ips[i]) < 0)
- goto error;
- }
- def->nroutes = nroutes;
- def->routes = routes;
+ if (virDomainNetIPInfoParseXML(_("guest interface"),
+ ctxt, &def->guestIP) < 0)
+ goto error;
if (script != NULL) {
def->script = script;
@@ -9705,7 +9670,6 @@ virDomainNetDefParseXML(virDomainXMLOptionPtr xmlopt,
VIR_FREE(addrtype);
VIR_FREE(domain_name);
VIR_FREE(trustGuestRxFilters);
- VIR_FREE(ips);
VIR_FREE(vhost_path);
VIR_FREE(localaddr);
VIR_FREE(localport);
@@ -20894,9 +20858,7 @@ virDomainNetDefFormat(virBufferPtr buf,
return -1;
}
- if (virDomainNetIPsFormat(buf, def->ips, def->nips) < 0)
- return -1;
- if (virDomainNetRoutesFormat(buf, def->routes, def->nroutes) < 0)
+ if (virDomainNetIPInfoFormat(buf, &def->guestIP) < 0)
return -1;
virBufferEscapeString(buf, "\n",
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 45094d710ea28e18c5b47b6dd293c27264054490..7c5cbd916981456f044fb8ec7290dc5c5ac5683c 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -964,8 +964,9 @@ struct _virDomainNetDef {
char *script;
char *domain_name; /* backend domain name */
char *ifname;
- char *ifname_guest;
char *ifname_guest_actual;
+ char *ifname_guest;
+ virNetDevIPInfo guestIP;
virDomainDeviceInfo info;
char *filter;
virNWFilterHashTablePtr filterparams;
@@ -973,10 +974,6 @@ struct _virDomainNetDef {
virNetDevVlan vlan;
int trustGuestRxFilters; /* enum virTristateBool */
int linkstate;
- size_t nips;
- virNetDevIPAddrPtr *ips;
- size_t nroutes;
- virNetDevIPRoutePtr *routes;
};
/* Used for prefix of ifname of any network name generated dynamically
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 5a3e3a0b6bcdb5dcc8597c9790c644e26707f30c..584eb8ffb6f106acae05c42b2e48b8ffea56f812 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -1,7 +1,7 @@
/*
* libxl_conf.c: libxl configuration management
*
- * Copyright (C) 2012-2014 Red Hat, Inc.
+ * Copyright (C) 2012-2014, 2016 Red Hat, Inc.
* Copyright (c) 2011-2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
* Copyright (C) 2011 Univention GmbH.
*
@@ -908,8 +908,8 @@ libxlMakeNic(virDomainDefPtr def,
case VIR_DOMAIN_NET_TYPE_ETHERNET:
if (VIR_STRDUP(x_nic->script, l_nic->script) < 0)
goto cleanup;
- if (l_nic->nips > 0) {
- x_nic->ip = virSocketAddrFormat(&l_nic->ips[0]->address);
+ if (l_nic->guestIP.nips > 0) {
+ x_nic->ip = virSocketAddrFormat(&l_nic->guestIP.ips[0]->address);
if (!x_nic->ip)
goto cleanup;
}
@@ -924,8 +924,8 @@ libxlMakeNic(virDomainDefPtr def,
goto cleanup;
}
- if (l_nic->nips > 0) {
- x_nic->ip = virSocketAddrFormat(&l_nic->ips[0]->address);
+ if (l_nic->guestIP.nips > 0) {
+ x_nic->ip = virSocketAddrFormat(&l_nic->guestIP.ips[0]->address);
if (!x_nic->ip)
goto cleanup;
}
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index 6bcb4d93defd213b39c507990bf855167ce217bd..9feba0849f6fb2c972dbbb83e8abdafc5a8e2947 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -296,7 +296,7 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
(dev->data.net->type == VIR_DOMAIN_NET_TYPE_BRIDGE ||
dev->data.net->type == VIR_DOMAIN_NET_TYPE_ETHERNET ||
dev->data.net->type == VIR_DOMAIN_NET_TYPE_NETWORK)) {
- if (dev->data.net->nips > 1) {
+ if (dev->data.net->guestIP.nips > 1) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("multiple IP addresses not supported on device type %s"),
virDomainNetTypeToString(dev->data.net->type));
diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c
index efca05821bf382f0eee0c8c8340edc27d1674b07..703b0d69ee1fcdb08adb6104056793c54bc0fc8b 100644
--- a/src/lxc/lxc_container.c
+++ b/src/lxc/lxc_container.c
@@ -512,8 +512,8 @@ static int lxcContainerRenameAndEnableInterfaces(virDomainDefPtr vmDef,
if (rc < 0)
goto error_out;
- for (j = 0; j < netDef->nips; j++) {
- virNetDevIPAddrPtr ip = netDef->ips[j];
+ for (j = 0; j < netDef->guestIP.nips; j++) {
+ virNetDevIPAddrPtr ip = netDef->guestIP.ips[j];
int prefix;
char *ipStr = virSocketAddrFormat(&ip->address);
@@ -538,7 +538,7 @@ static int lxcContainerRenameAndEnableInterfaces(virDomainDefPtr vmDef,
VIR_FREE(ipStr);
}
- if (netDef->nips ||
+ if (netDef->guestIP.nips ||
netDef->linkstate == VIR_DOMAIN_NET_INTERFACE_LINK_STATE_UP) {
VIR_DEBUG("Enabling %s", newname);
rc = virNetDevSetOnline(newname, true);
@@ -546,8 +546,8 @@ static int lxcContainerRenameAndEnableInterfaces(virDomainDefPtr vmDef,
goto error_out;
/* Set the routes */
- for (j = 0; j < netDef->nroutes; j++) {
- virNetDevIPRoutePtr route = netDef->routes[j];
+ for (j = 0; j < netDef->guestIP.nroutes; j++) {
+ virNetDevIPRoutePtr route = netDef->guestIP.routes[j];
if (virNetDevIPRouteAdd(newname,
virNetDevIPRouteGetAddress(route),
diff --git a/src/lxc/lxc_native.c b/src/lxc/lxc_native.c
index c261b88184a8019dbbd548cb3d121c76dddd74f4..acbc20b2b34f52995d91eda020a21ffd40240400 100644
--- a/src/lxc/lxc_native.c
+++ b/src/lxc/lxc_native.c
@@ -522,19 +522,19 @@ lxcAddNetworkDefinition(lxcNetworkParseData *data)
data->name)))
goto error;
- net->ips = data->ips;
- net->nips = data->nips;
+ net->guestIP.ips = data->ips;
+ net->guestIP.nips = data->nips;
if (data->gateway_ipv4 &&
lxcAddNetworkRouteDefinition(data->gateway_ipv4, AF_INET,
- &net->routes,
- &net->nroutes) < 0)
+ &net->guestIP.routes,
+ &net->guestIP.nroutes) < 0)
goto error;
if (data->gateway_ipv6 &&
lxcAddNetworkRouteDefinition(data->gateway_ipv6, AF_INET6,
- &net->routes,
- &net->nroutes) < 0)
+ &net->guestIP.routes,
+ &net->guestIP.nroutes) < 0)
goto error;
if (VIR_EXPAND_N(data->def->nets, data->def->nnets, 1) < 0)
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
index b114246fa82993fb3275a6039cb1103b8fb2cba0..48c264b0ba1639e8d8d2f9fa2fc20d6450035708 100644
--- a/src/openvz/openvz_driver.c
+++ b/src/openvz/openvz_driver.c
@@ -1,7 +1,7 @@
/*
* openvz_driver.c: core driver methods for managing OpenVZ VEs
*
- * Copyright (C) 2010-2015 Red Hat, Inc.
+ * Copyright (C) 2010-2016 Red Hat, Inc.
* Copyright (C) 2006, 2007 Binary Karma
* Copyright (C) 2006 Shuveb Hussain
* Copyright (C) 2007 Anoop Joe Cyriac
@@ -856,7 +856,7 @@ openvzDomainSetNetwork(virConnectPtr conn, const char *vpsid,
if (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE ||
(net->type == VIR_DOMAIN_NET_TYPE_ETHERNET &&
- net->nips == 0)) {
+ net->guestIP.nips == 0)) {
virBuffer buf = VIR_BUFFER_INITIALIZER;
int veid = openvzGetVEID(vpsid);
@@ -906,12 +906,12 @@ openvzDomainSetNetwork(virConnectPtr conn, const char *vpsid,
virCommandAddArg(cmd, "--netif_add");
virCommandAddArgBuffer(cmd, &buf);
} else if (net->type == VIR_DOMAIN_NET_TYPE_ETHERNET &&
- net->nips > 0) {
+ net->guestIP.nips > 0) {
size_t i;
/* --ipadd ip */
- for (i = 0; i < net->nips; i++) {
- char *ipStr = virSocketAddrFormat(&net->ips[i]->address);
+ for (i = 0; i < net->guestIP.nips; i++) {
+ char *ipStr = virSocketAddrFormat(&net->guestIP.ips[i]->address);
if (!ipStr)
goto cleanup;
virCommandAddArgList(cmd, "--ipadd", ipStr, NULL);
diff --git a/src/uml/uml_conf.c b/src/uml/uml_conf.c
index a97ae64507b6f913ac873977e26d79150c8d209c..dc68203de174d6bb66b6b1bfb75d50a9a9312507 100644
--- a/src/uml/uml_conf.c
+++ b/src/uml/uml_conf.c
@@ -1,7 +1,7 @@
/*
* uml_conf.c: UML driver configuration
*
- * Copyright (C) 2006-2014 Red Hat, Inc.
+ * Copyright (C) 2006-2014, 2016 Red Hat, Inc.
* Copyright (C) 2006 Daniel P. Berrange
*
* This library is free software; you can redistribute it and/or
@@ -173,7 +173,7 @@ umlBuildCommandLineNet(virConnectPtr conn,
virBufferAddLit(&buf, "tuntap,");
if (def->ifname)
virBufferAdd(&buf, def->ifname, -1);
- if (def->nips > 0) {
+ if (def->guestIP.nips > 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("IP address not supported for ethernet interface"));
goto error;
diff --git a/src/vbox/vbox_common.c b/src/vbox/vbox_common.c
index 6dd5b9c6de43de4d91d1a92648601e7d035a92ca..8e492684f9a387be6811b11cf8215135e6d639e9 100644
--- a/src/vbox/vbox_common.c
+++ b/src/vbox/vbox_common.c
@@ -1313,11 +1313,11 @@ vboxAttachNetwork(virDomainDefPtr def, vboxGlobalData *data, IMachine *machine)
} else if (def->nets[i]->type == VIR_DOMAIN_NET_TYPE_BRIDGE) {
VIR_DEBUG("NIC(%zu): brname: %s", i, def->nets[i]->data.bridge.brname);
VIR_DEBUG("NIC(%zu): script: %s", i, def->nets[i]->script);
- if (def->nets[i]->nips == 1) {
- char *ipStr = virSocketAddrFormat(&def->nets[i]->ips[0]->address);
+ if (def->nets[i]->guestIP.nips == 1) {
+ char *ipStr = virSocketAddrFormat(&def->nets[i]->guestIP.ips[0]->address);
VIR_DEBUG("NIC(%zu): ipaddr: %s", i, ipStr);
VIR_FREE(ipStr);
- } else if (def->nets[i]->nips > 1) {
+ } else if (def->nets[i]->guestIP.nips > 1) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Driver does not support setting multiple IP addresses"));
return -1;
diff --git a/src/vz/vz_sdk.c b/src/vz/vz_sdk.c
index 33bd5a56d1c4fcdd12fe4c18501419f8116772b3..1203ed6d347c268461080249c8cab3c83db5f6ee 100644
--- a/src/vz/vz_sdk.c
+++ b/src/vz/vz_sdk.c
@@ -2654,7 +2654,7 @@ static int prlsdkCheckNetUnsupportedParams(virDomainNetDefPtr net)
return -1;
}
- if (net->ifname_guest) {
+ if (net->guestIf.name) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Setting guest interface name is not "
"supported by vz driver."));
diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c
index 2fe29fd3f7aec5fc7c88df87e7a7297bef5cf3d5..f62a5b19fc8e8954ee4d1fb58e4d404fa4aa2d1d 100644
--- a/src/xenconfig/xen_common.c
+++ b/src/xenconfig/xen_common.c
@@ -1153,11 +1153,11 @@ xenFormatNet(virConnectPtr conn,
switch (net->type) {
case VIR_DOMAIN_NET_TYPE_BRIDGE:
virBufferAsprintf(&buf, ",bridge=%s", net->data.bridge.brname);
- if (net->nips == 1) {
- char *ipStr = virSocketAddrFormat(&net->ips[0]->address);
+ if (net->guestIP.nips == 1) {
+ char *ipStr = virSocketAddrFormat(&net->guestIP.ips[0]->address);
virBufferAsprintf(&buf, ",ip=%s", ipStr);
VIR_FREE(ipStr);
- } else if (net->nips > 1) {
+ } else if (net->guestIP.nips > 1) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Driver does not support setting multiple IP addresses"));
goto cleanup;
@@ -1168,11 +1168,11 @@ xenFormatNet(virConnectPtr conn,
case VIR_DOMAIN_NET_TYPE_ETHERNET:
if (net->script)
virBufferAsprintf(&buf, ",script=%s", net->script);
- if (net->nips == 1) {
- char *ipStr = virSocketAddrFormat(&net->ips[0]->address);
+ if (net->guestIP.nips == 1) {
+ char *ipStr = virSocketAddrFormat(&net->guestIP.ips[0]->address);
virBufferAsprintf(&buf, ",ip=%s", ipStr);
VIR_FREE(ipStr);
- } else if (net->nips > 1) {
+ } else if (net->guestIP.nips > 1) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Driver does not support setting multiple IP addresses"));
goto cleanup;
diff --git a/src/xenconfig/xen_sxpr.c b/src/xenconfig/xen_sxpr.c
index 21de1a2771cea39b9f4e9d3df8b03ecf5109c3fc..ea6c177a9f3c17f96ecacb2b25a3de2fa8f4f662 100644
--- a/src/xenconfig/xen_sxpr.c
+++ b/src/xenconfig/xen_sxpr.c
@@ -1875,11 +1875,11 @@ xenFormatSxprNet(virConnectPtr conn,
script = def->script;
virBufferEscapeSexpr(buf, "(script '%s')", script);
- if (def->nips == 1) {
- char *ipStr = virSocketAddrFormat(&def->ips[0]->address);
+ if (def->guestIP.nips == 1) {
+ char *ipStr = virSocketAddrFormat(&def->guestIP.ips[0]->address);
virBufferEscapeSexpr(buf, "(ip '%s')", ipStr);
VIR_FREE(ipStr);
- } else if (def->nips > 1) {
+ } else if (def->guestIP.nips > 1) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Driver does not support setting multiple IP addresses"));
return -1;
@@ -1916,11 +1916,11 @@ xenFormatSxprNet(virConnectPtr conn,
if (def->script)
virBufferEscapeSexpr(buf, "(script '%s')",
def->script);
- if (def->nips == 1) {
- char *ipStr = virSocketAddrFormat(&def->ips[0]->address);
+ if (def->guestIP.nips == 1) {
+ char *ipStr = virSocketAddrFormat(&def->guestIP.ips[0]->address);
virBufferEscapeSexpr(buf, "(ip '%s')", ipStr);
VIR_FREE(ipStr);
- } else if (def->nips > 1) {
+ } else if (def->guestIP.nips > 1) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("Driver does not support setting multiple IP addresses"));
return -1;