]> xenbits.xensource.com Git - libvirt.git/commitdiff
libxl: add support for multiple IP addresses
authorMarek Marczykowski-Górecki <marmarek@invisiblethingslab.com>
Thu, 7 Dec 2017 02:27:45 +0000 (03:27 +0100)
committerJim Fehlig <jfehlig@suse.com>
Fri, 8 Dec 2017 20:55:07 +0000 (13:55 -0700)
vif-* scripts support it for a long time, and expect addresses to be
separated by spaces. Add appropriate support to libxl driver.

Reviewed-by: Jim Fehlig <jfehlig@suse.com>
src/libxl/libxl_conf.c
src/libxl/libxl_domain.c
src/xenconfig/xen_common.c
src/xenconfig/xen_common.h

index 2a9be6967795c9f8cdea40c142434c147602b69e..970cff205b6df8140bf0dba5abb11347c0762afd 100644 (file)
@@ -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;
             }
index d054b07624c1ad08cec8af6bdb7723c474aee02f..395c8a921b455021ef4aaf2823f4bed53ecfbe43 100644 (file)
@@ -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)) {
index ded0acab9d8f7a582d10e680caaecce4f555e417..7f838b65e9edbfc11e103302818573380ac919f9 100644 (file)
@@ -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]);
+    return ret;
+}
 
 static int
 xenFormatNet(virConnectPtr conn,
index 905569299caf26e3a2fffb297f6edf0c5f21c10a..3b7a5db4f3b1c86d2fbe4431760ca2c319ac00d8 100644 (file)
@@ -67,6 +67,7 @@ int xenFormatConfigCommon(virConfPtr conf,
                           virConnectPtr conn,
                           const char *nativeFormat);
 
+char *xenMakeIPList(virNetDevIPInfoPtr guestIP);
 
 int xenDomainDefAddImplicitInputDevice(virDomainDefPtr def);