Since "peer" is really the address of the tap interface, while
"address" is actually the peer address of the tap interface, and since
you can't set the peer address of a POINTOPOINT tap device without
setting the local address, we need to require "peer" in the config.
---
 src/qemu/qemu_domain.c | 44 +++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 39 insertions(+), 5 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index f2488ad..03baa5a 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1788,15 +1788,49 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
     virQEMUCapsPtr qemuCaps = NULL;
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
     int ret = -1;
+    size_t i;
 
     qemuCaps = virQEMUCapsCacheLookup(driver->qemuCapsCache, def->emulator);
 
-    if (dev->type == VIR_DOMAIN_DEVICE_NET &&
-        dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
-        !dev->data.net->model) {
-        if (VIR_STRDUP(dev->data.net->model,
-                       qemuDomainDefaultNetModel(def, qemuCaps)) < 0)
+    if (dev->type == VIR_DOMAIN_DEVICE_NET) {
+        virDomainNetDefPtr net = dev->data.net;
+
+        if (net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV && !net->model &&
+            VIR_STRDUP(net->model,
+                       qemuDomainDefaultNetModel(def, qemuCaps)) < 0) {
             goto cleanup;
+        }
+
+        if (net->nips) {
+            /* we currently only support setting an IP address
+             * for <interface type='ethernet'>
+             */
+            if (net->type != VIR_DOMAIN_NET_TYPE_ETHERNET) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                               _("ip addresses cannot be set in config "
+                                 "for interfaces of type '%s'"),
+                               virDomainNetTypeToString(net->type));
+                goto cleanup;
+            }
+            /* verify that every ip has a peer address set,
+             * since the "peer" attribute in the config becomes
+             * the tap device's local IP address, which is required
+             */
+            for (i = 0; i < net->nips; i++) {
+                virDomainNetIpDefPtr ip = net->ips[i];
+
+                if (!VIR_SOCKET_ADDR_VALID(&ip->peer)) {
+                    char *ipStr = virSocketAddrFormat(&ip->address);
+
+                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                                   _("interface ip address '%s' must "
+                                     "have a peer address set in config"),
+                                   ipStr ? ipStr : "(unknown)");
+                    VIR_FREE(ipStr);
+                    goto cleanup;
+                }
+            }
+        }
     }
 
     /* set default disk types and drivers */
-- 
2.5.5

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to