mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-24 13:35:17 +00:00
network: Add another collision check into networkCheckRouteCollision
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>
This commit is contained in:
parent
0f10eb6a28
commit
0e3ad241f3
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user