[PATCH] bridge_driver: Don't define network if XML contains more IPv4 adreses.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Only one IPv4 DHCP definition is supported. Originaly the code checked
for a multiple definition and returned an error, but the new domain
definition was already added to networks. This patch moves the check
before the newly defined network is added to active networks.

 *src/network/bridge_driver.c: networkDefine(): - move multiple IPv4
                                                  adresses check before
                                                  definition is used.
---
 src/network/bridge_driver.c |   29 +++++++++++++++--------------
 1 files changed, 15 insertions(+), 14 deletions(-)

diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index c49c25b..0c1563a 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -2261,70 +2261,71 @@ static virNetworkPtr networkDefine(virConnectPtr conn, const char *xml) {

     if (!(def = virNetworkDefParseString(xml)))
         goto cleanup;

     if (virNetworkObjIsDuplicate(&driver->networks, def, 0) < 0)
         goto cleanup;

     /* Only the three L3 network types that are configured by libvirt
      * need to have a bridge device name / mac address provided
      */
     if (def->forwardType == VIR_NETWORK_FORWARD_NONE ||
         def->forwardType == VIR_NETWORK_FORWARD_NAT ||
         def->forwardType == VIR_NETWORK_FORWARD_ROUTE) {

         if (virNetworkSetBridgeName(&driver->networks, def, 1))
             goto cleanup;

         virNetworkSetBridgeMacAddr(def);
     }

-    if (!(network = virNetworkAssignDef(&driver->networks,
-                                        def)))
-        goto cleanup;
-    freeDef = false;
-
-    network->persistent = 1;
-
-    if (virNetworkSaveConfig(driver->networkConfigDir, def) < 0) {
-        virNetworkRemoveInactive(&driver->networks, network);
-        network = NULL;
-        goto cleanup;
-    }
-
     /* We only support dhcp on one IPv4 address per defined network */
     for (ii = 0;
          (ipdef = virNetworkDefGetIpByIndex(def, AF_UNSPEC, ii));
          ii++) {
         if (VIR_SOCKET_ADDR_IS_FAMILY(&ipdef->address, AF_INET)) {
             if (ipdef->nranges || ipdef->nhosts) {
                 if (ipv4def) {
                     networkReportError(VIR_ERR_CONFIG_UNSUPPORTED,
                                        "%s", _("Multiple dhcp sections found. dhcp is supported only for a single IPv4 address on each network"));
                     goto cleanup;
                 } else {
                     ipv4def = ipdef;
                 }
             }
         }
     }
-    if (ipv4def) {
+
+    if (!(network = virNetworkAssignDef(&driver->networks,
+                                        def)))
+        goto cleanup;
+    freeDef = false;
+
+    network->persistent = 1;
+
+    if (virNetworkSaveConfig(driver->networkConfigDir, def) < 0) {
+        virNetworkRemoveInactive(&driver->networks, network);
+        network = NULL;
+        goto cleanup;
+    }
+
+   if (ipv4def) {
         dctx = dnsmasqContextNew(def->name, DNSMASQ_STATE_DIR);
         if (dctx == NULL ||
             networkBuildDnsmasqHostsfile(dctx, ipv4def, def->dns) < 0 ||
             dnsmasqSave(dctx) < 0)
             goto cleanup;
     }

     VIR_INFO("Defining network '%s'", def->name);
     ret = virGetNetwork(conn, def->name, def->uuid);

 cleanup:
     if (freeDef)
        virNetworkDefFree(def);
     dnsmasqContextFree(dctx);
     if (network)
         virNetworkObjUnlock(network);
     networkDriverUnlock(driver);
     return ret;
 }

-- 
1.7.3.4

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


[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]