mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 12:35:17 +00:00
network: don't allow multiple dhcp sections
This resolves: https://bugzilla.redhat.com/show_bug.cgi?id=907779 A <dhcp> element can exist in only one IPv4 address and one IPv6 address per network. This patch enforces that in virNetworkUpdate.
This commit is contained in:
parent
b0fbe7459b
commit
5adc6031fa
@ -3508,6 +3508,30 @@ virNetworkIpDefByIndex(virNetworkDefPtr def, int parentIndex)
|
||||
return ipdef;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virNetworkDefUpdateCheckMultiDHCP(virNetworkDefPtr def,
|
||||
virNetworkIpDefPtr ipdef)
|
||||
{
|
||||
int family = VIR_SOCKET_ADDR_FAMILY(&ipdef->address);
|
||||
size_t i;
|
||||
virNetworkIpDefPtr ip;
|
||||
|
||||
for (i = 0; (ip = virNetworkDefGetIpByIndex(def, family, i)); i++) {
|
||||
if (ip != ipdef) {
|
||||
if (ip->nranges || ip->nhosts) {
|
||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
||||
_("dhcp is supported only for a "
|
||||
"single %s address on each network"),
|
||||
(family == AF_INET) ? "IPv4" : "IPv6");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
virNetworkDefUpdateIPDHCPHost(virNetworkDefPtr def,
|
||||
unsigned int command,
|
||||
@ -3573,6 +3597,9 @@ virNetworkDefUpdateIPDHCPHost(virNetworkDefPtr def,
|
||||
} else if ((command == VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) ||
|
||||
(command == VIR_NETWORK_UPDATE_COMMAND_ADD_LAST)) {
|
||||
|
||||
if (virNetworkDefUpdateCheckMultiDHCP(def, ipdef) < 0)
|
||||
goto cleanup;
|
||||
|
||||
/* log error if an entry with same name/address/ip already exists */
|
||||
for (i = 0; i < ipdef->nhosts; i++) {
|
||||
if ((host.mac &&
|
||||
@ -3680,6 +3707,9 @@ virNetworkDefUpdateIPDHCPRange(virNetworkDefPtr def,
|
||||
if ((command == VIR_NETWORK_UPDATE_COMMAND_ADD_FIRST) ||
|
||||
(command == VIR_NETWORK_UPDATE_COMMAND_ADD_LAST)) {
|
||||
|
||||
if (virNetworkDefUpdateCheckMultiDHCP(def, ipdef) < 0)
|
||||
goto cleanup;
|
||||
|
||||
if (i < ipdef->nranges) {
|
||||
char *startip = virSocketAddrFormat(&range.start);
|
||||
char *endip = virSocketAddrFormat(&range.end);
|
||||
|
Loading…
x
Reference in New Issue
Block a user