|
|
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 |
|