Blame SOURCES/libvirt-network-Add-another-collision-check-into-networkCheckRouteCollision.patch

7a3408
From 83e667d206d16867cfc640b118a37e46d1ef897d Mon Sep 17 00:00:00 2001
7a3408
Message-Id: <83e667d206d16867cfc640b118a37e46d1ef897d@dist-git>
7a3408
From: Martin Kletzander <mkletzan@redhat.com>
7a3408
Date: Thu, 6 Aug 2015 13:10:24 +0200
7a3408
Subject: [PATCH] network: Add another collision check into
7a3408
 networkCheckRouteCollision
7a3408
7a3408
The comment above that function says: "This function can be a lot more
7a3408
exhaustive, ...", so let's be.
7a3408
7a3408
Check for collisions between routes in the system and static routes
7a3408
being added explicitly from the <route/> element of the network XML.
7a3408
7a3408
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1094205
7a3408
7a3408
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
7a3408
(cherry picked from commit 0e3ad241f3f421c23bbe2cbe11a70f8e9184dc65)
7a3408
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
7a3408
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
7a3408
---
7a3408
 src/network/bridge_driver_linux.c | 29 +++++++++++++++++++++++++++++
7a3408
 1 file changed, 29 insertions(+)
7a3408
7a3408
diff --git a/src/network/bridge_driver_linux.c b/src/network/bridge_driver_linux.c
7a3408
index e394daf..bd7508c 100644
7a3408
--- a/src/network/bridge_driver_linux.c
7a3408
+++ b/src/network/bridge_driver_linux.c
7a3408
@@ -69,6 +69,7 @@ int networkCheckRouteCollision(virNetworkDefPtr def)
7a3408
         char iface[17], dest[128], mask[128];
7a3408
         unsigned int addr_val, mask_val;
7a3408
         virNetworkIpDefPtr ipdef;
7a3408
+        virNetworkRouteDefPtr routedef;
7a3408
         int num;
7a3408
         size_t i;
7a3408
 
7a3408
@@ -123,6 +124,34 @@ int networkCheckRouteCollision(virNetworkDefPtr def)
7a3408
                 goto out;
7a3408
             }
7a3408
         }
7a3408
+
7a3408
+        for (i = 0;
7a3408
+             (routedef = virNetworkDefGetRouteByIndex(def, AF_INET, i));
7a3408
+             i++) {
7a3408
+
7a3408
+            virSocketAddr r_mask, r_addr;
7a3408
+            virSocketAddrPtr tmp_addr = virNetworkRouteDefGetAddress(routedef);
7a3408
+            int r_prefix = virNetworkRouteDefGetPrefix(routedef);
7a3408
+
7a3408
+            if (!tmp_addr ||
7a3408
+                virSocketAddrMaskByPrefix(tmp_addr, r_prefix, &r_addr) < 0 ||
7a3408
+                virSocketAddrPrefixToNetmask(r_prefix, &r_mask, AF_INET) < 0)
7a3408
+                continue;
7a3408
+
7a3408
+            if ((r_addr.data.inet4.sin_addr.s_addr == addr_val) &&
7a3408
+                (r_mask.data.inet4.sin_addr.s_addr == mask_val)) {
7a3408
+                char *addr_str = virSocketAddrFormat(&r_addr);
7a3408
+                if (!addr_str)
7a3408
+                    virResetLastError();
7a3408
+                virReportError(VIR_ERR_INTERNAL_ERROR,
7a3408
+                               _("Route address '%s' conflicts "
7a3408
+                                 "with IP address for '%s'"),
7a3408
+                               NULLSTR(addr_str), iface);
7a3408
+                VIR_FREE(addr_str);
7a3408
+                ret = -1;
7a3408
+                goto out;
7a3408
+            }
7a3408
+        }
7a3408
     }
7a3408
 
7a3408
  out:
7a3408
-- 
7a3408
2.5.0
7a3408