diff --git a/plist b/plist
index 23eb787ab..5d143df17 100644
--- a/plist
+++ b/plist
@@ -738,6 +738,7 @@
/usr/local/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.xml
/usr/local/opnsense/mvc/app/models/OPNsense/Dnsmasq/FieldTypes/AliasesField.php
/usr/local/opnsense/mvc/app/models/OPNsense/Dnsmasq/FieldTypes/DomainIPField.php
+/usr/local/opnsense/mvc/app/models/OPNsense/Dnsmasq/FieldTypes/RangeAddressField.php
/usr/local/opnsense/mvc/app/models/OPNsense/Dnsmasq/Menu/Menu.xml
/usr/local/opnsense/mvc/app/models/OPNsense/Dnsmasq/Migrations/M1_0_0.php
/usr/local/opnsense/mvc/app/models/OPNsense/Firewall/ACL/ACL.xml
diff --git a/src/opnsense/mvc/app/controllers/OPNsense/Dnsmasq/forms/dialogDHCPrange.xml b/src/opnsense/mvc/app/controllers/OPNsense/Dnsmasq/forms/dialogDHCPrange.xml
index bb9535afd..846de8a9b 100644
--- a/src/opnsense/mvc/app/controllers/OPNsense/Dnsmasq/forms/dialogDHCPrange.xml
+++ b/src/opnsense/mvc/app/controllers/OPNsense/Dnsmasq/forms/dialogDHCPrange.xml
@@ -15,7 +15,7 @@
range.start_addr
text
- Start of the range.
+ Start of the range, e.g. 192.168.1.100, 2000::1 or when constructor is used a partial like ::1.
range.end_addr
@@ -23,6 +23,19 @@
text
End of the range.
+
+ range.constructor
+
+ dropdown
+ Interface to use to calculate the proper range, when selected, a range maybe specified as partial (e.g. ::1, ::400)
+
+
+ range.prefix_len
+
+ text
+ 64
+ Prefix lenght offered to the client.
+
range.mode
diff --git a/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.php b/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.php
index db2946dbf..ef6841e65 100644
--- a/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.php
+++ b/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.php
@@ -83,6 +83,8 @@ class Dnsmasq extends BaseModel
if (!$validateFullModel && !$range->isFieldChanged()) {
continue;
}
+ $start_inet = strpos($range->start_addr, ':') !== false ? 'inet6' : 'inet';
+ $end_inet = strpos($range->end_addr, ':') !== false ? 'inet6' : 'inet';
$key = $range->__reference;
if (!$range->domain->isEmpty() && $range->end_addr->isEmpty()) {
$messages->appendMessage(
@@ -92,6 +94,71 @@ class Dnsmasq extends BaseModel
)
);
}
+
+ if ($start_inet != $end_inet && !$range->end_addr->isEmpty()) {
+ $messages->appendMessage(
+ new Message(
+ gettext("Protocol family doesn't match."),
+ $key . ".end_addr"
+ )
+ );
+ }
+
+ if (!$range->constructor->isEmpty()) {
+ if ($start_inet == 'inet') {
+ $messages->appendMessage(
+ new Message(
+ gettext("A constructor can only be configured for ipv6."),
+ $key . ".constructor"
+ )
+ );
+ }
+ if (!str_starts_with($range->start_addr, '::')) {
+ $messages->appendMessage(
+ new Message(
+ gettext("A constructor expects a partial address (e.g. ::1)."),
+ $key . ".start_addr"
+ )
+ );
+ }
+ if (!$range->end_addr->isEmpty() && !str_starts_with($range->end_addr, '::')) {
+ $messages->appendMessage(
+ new Message(
+ gettext("A constructor expects a partial address (e.g. ::1)."),
+ $key . ".end_addr"
+ )
+ );
+ }
+ }
+
+ if ($range->constructor->isEmpty() &&
+ (str_starts_with($range->start_addr, '::') || str_starts_with($range->end_addr, '::'))
+ ) {
+ $messages->appendMessage(
+ new Message(
+ gettext("Partial addresses can only be used with a constructor."),
+ $key . ".start_addr"
+ )
+ );
+ }
+
+ if (!$range->prefix_len->isEmpty() && $start_inet != 'inet6') {
+ $messages->appendMessage(
+ new Message(
+ gettext("Prefix length can only be used for IPv6."),
+ $key . ".prefix_len"
+ )
+ );
+ }
+
+ if (in_array('static', explode(',', $range->mode)) && $start_inet == 'inet6') {
+ $messages->appendMessage(
+ new Message(
+ gettext("Static is only available IPv4."),
+ $key . ".mode"
+ )
+ );
+ }
}
if (
diff --git a/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.xml b/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.xml
index 6973113b9..2c735dff1 100644
--- a/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.xml
+++ b/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/Dnsmasq.xml
@@ -134,21 +134,24 @@
-
+
N
- ipv4
Y
-
+
N
- ipv4
+
static
Y
+
+ 1
+ 64
+
1
diff --git a/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/FieldTypes/RangeAddressField.php b/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/FieldTypes/RangeAddressField.php
new file mode 100644
index 000000000..48be19db3
--- /dev/null
+++ b/src/opnsense/mvc/app/models/OPNsense/Dnsmasq/FieldTypes/RangeAddressField.php
@@ -0,0 +1,44 @@
+