]> xenbits.xensource.com Git - libvirt.git/commitdiff
network: Add another collision check into networkCheckRouteCollision
authorMartin Kletzander <mkletzan@redhat.com>
Thu, 9 Jul 2015 13:53:25 +0000 (15:53 +0200)
committerMartin Kletzander <mkletzan@redhat.com>
Tue, 14 Jul 2015 07:56:44 +0000 (09:56 +0200)
The comment above that function says: "This function can be a lot more
exhaustive, ...", so let's be.

Check for collisions between routes in the system and static routes
being added explicitly from the <route/> element of the network XML.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1094205

Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
src/network/bridge_driver_linux.c

index e394dafb22167f56751ea38fed9d4dc48a35da0c..bd7508c96c8add7fcf884744ffdd7f5d9f9dbd95 100644 (file)
@@ -69,6 +69,7 @@ int networkCheckRouteCollision(virNetworkDefPtr def)
         char iface[17], dest[128], mask[128];
         unsigned int addr_val, mask_val;
         virNetworkIpDefPtr ipdef;
+        virNetworkRouteDefPtr routedef;
         int num;
         size_t i;
 
@@ -123,6 +124,34 @@ int networkCheckRouteCollision(virNetworkDefPtr def)
                 goto out;
             }
         }
+
+        for (i = 0;
+             (routedef = virNetworkDefGetRouteByIndex(def, AF_INET, i));
+             i++) {
+
+            virSocketAddr r_mask, r_addr;
+            virSocketAddrPtr tmp_addr = virNetworkRouteDefGetAddress(routedef);
+            int r_prefix = virNetworkRouteDefGetPrefix(routedef);
+
+            if (!tmp_addr ||
+                virSocketAddrMaskByPrefix(tmp_addr, r_prefix, &r_addr) < 0 ||
+                virSocketAddrPrefixToNetmask(r_prefix, &r_mask, AF_INET) < 0)
+                continue;
+
+            if ((r_addr.data.inet4.sin_addr.s_addr == addr_val) &&
+                (r_mask.data.inet4.sin_addr.s_addr == mask_val)) {
+                char *addr_str = virSocketAddrFormat(&r_addr);
+                if (!addr_str)
+                    virResetLastError();
+                virReportError(VIR_ERR_INTERNAL_ERROR,
+                               _("Route address '%s' conflicts "
+                                 "with IP address for '%s'"),
+                               NULLSTR(addr_str), iface);
+                VIR_FREE(addr_str);
+                ret = -1;
+                goto out;
+            }
+        }
     }
 
  out: