diff --git a/src/opnsense/mvc/app/models/OPNsense/Kea/KeaDhcpv6.php b/src/opnsense/mvc/app/models/OPNsense/Kea/KeaDhcpv6.php index 173bb7efc2..dad955106e 100644 --- a/src/opnsense/mvc/app/models/OPNsense/Kea/KeaDhcpv6.php +++ b/src/opnsense/mvc/app/models/OPNsense/Kea/KeaDhcpv6.php @@ -91,6 +91,31 @@ class KeaDhcpv6 extends BaseModel } } } + // validate changed pd_pools + foreach ($this->pd_pools->pd_pool->iterateItems() as $pool) { + if (!$validateFullModel && !$pool->isFieldChanged()) { + continue; + } + $key = $pool->__reference; + if ($pool->prefix_len->getValue() >= $pool->delegated_len->getValue()) { + $messages->appendMessage(new Message(gettext("Delegated length must be longer than or equal to prefix length"), $key . ".delegated_len")); + } + $subnet = $pool->prefix->getValue() . "/" . $pool->prefix_len->getValue(); + $trange = Util::cidrToRange($subnet); + if (!Util::isSubnetStrict($subnet)) { + $messages->appendMessage(new Message(gettext("Invalid Pool boundaries, offered address is not the first address in the prefix."), $key . ".prefix")); + } + foreach ($this->pd_pools->pd_pool->iterateItems() as $tmppool) { + if ($key === $tmppool->__reference) { + continue; + } + $osubnet = $tmppool->prefix->getValue() . "/" . $tmppool->prefix_len->getValue(); + $orange = Util::cidrToRange($osubnet); + if (Util::isIPInCIDR($orange[0], $subnet) || Util::isIPInCIDR($trange[0], $osubnet)) { + $messages->appendMessage(new Message(gettext("Pool overlaps with an existing one."), $key . ".prefix")); + } + } + } return $messages; }