On 12/06/2017 09:27 PM, Marek Marczykowski-Górecki wrote:
vif-* scripts support it for a long time, and expect addresses to be
separated by spaces. Add appropriate support to libxl driver.
---
changed in v2:
- moved libxlMakeIPList function to xenconfig/xen_common.c and renamed
to xenMakeIPList
---
src/libxl/libxl_conf.c | 5 +++--
src/libxl/libxl_domain.c | 12 ------------
src/xenconfig/xen_common.c | 24 ++++++++++++++++++++++++
src/xenconfig/xen_common.h | 1 +
4 files changed, 28 insertions(+), 14 deletions(-)
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 2a9be69..970cff2 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -49,6 +49,7 @@
#include "virstoragefile.h"
#include "secret_util.h"
#include "cpu/cpu.h"
+#include "xen_common.h"
#define VIR_FROM_THIS VIR_FROM_LIBXL
@@ -1144,7 +1145,7 @@ libxlMakeNic(virDomainDefPtr def,
if (VIR_STRDUP(x_nic->script, l_nic->script) < 0)
goto cleanup;
if (l_nic->guestIP.nips > 0) {
- x_nic->ip =
virSocketAddrFormat(&l_nic->guestIP.ips[0]->address);
+ x_nic->ip = xenMakeIPList(&l_nic->guestIP);
if (!x_nic->ip)
goto cleanup;
}
@@ -1160,7 +1161,7 @@ libxlMakeNic(virDomainDefPtr def,
}
if (l_nic->guestIP.nips > 0) {
- x_nic->ip =
virSocketAddrFormat(&l_nic->guestIP.ips[0]->address);
+ x_nic->ip = xenMakeIPList(&l_nic->guestIP);
if (!x_nic->ip)
goto cleanup;
}
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index d054b07..395c8a9 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -294,18 +294,6 @@ libxlDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
def->os.type != VIR_DOMAIN_OSTYPE_HVM)
dev->data.chr->targetType = VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_XEN;
- if (dev->type == VIR_DOMAIN_DEVICE_NET &&
- (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->guestIP.nips > 1) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
- _("multiple IP addresses not supported on device type
%s"),
- virDomainNetTypeToString(dev->data.net->type));
- return -1;
- }
- }
-
if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV ||
(dev->type == VIR_DOMAIN_DEVICE_NET &&
dev->data.net->type == VIR_DOMAIN_NET_TYPE_HOSTDEV)) {
diff --git a/src/xenconfig/xen_common.c b/src/xenconfig/xen_common.c
index ded0aca..7f838b6 100644
--- a/src/xenconfig/xen_common.c
+++ b/src/xenconfig/xen_common.c
@@ -1166,6 +1166,30 @@ xenFormatSerial(virConfValuePtr list, virDomainChrDefPtr serial)
return -1;
}
+char *
+xenMakeIPList(virNetDevIPInfoPtr guestIP)
+{
+ size_t i;
+ char **address_array;
+ char *ret = NULL;
+
+ if (VIR_ALLOC_N(address_array, guestIP->nips + 1) < 0)
+ return NULL;
+
+ for (i = 0; i < guestIP->nips; i++) {
+ address_array[i] = virSocketAddrFormat(&guestIP->ips[i]->address);
+ if (!address_array[i])
+ goto cleanup;
+ }
+ address_array[guestIP->nips] = NULL;
+
+ ret = virStringListJoin((const char**)address_array, " ");
+
+ cleanup:
+ while (i > 0)
+ VIR_FREE(address_array[--i]);
Coverity notes that address_array is leaked. May I sugguest
"virStringListFree()" on address array?
John
+ return ret;
+}
static int
xenFormatNet(virConnectPtr conn,
diff --git a/src/xenconfig/xen_common.h b/src/xenconfig/xen_common.h
index 9055692..3b7a5db 100644
--- a/src/xenconfig/xen_common.h
+++ b/src/xenconfig/xen_common.h
@@ -67,6 +67,7 @@ int xenFormatConfigCommon(virConfPtr conf,
virConnectPtr conn,
const char *nativeFormat);
+char *xenMakeIPList(virNetDevIPInfoPtr guestIP);
int xenDomainDefAddImplicitInputDevice(virDomainDefPtr def);
base-commit: 9f0ccc717ba9026c30ce38951a354dd66fa12e3b