From 276b8ecdc521520ea9d55d31b8fa71f7badfd420 Mon Sep 17 00:00:00 2001 From: Franco Fichtner Date: Mon, 26 Jan 2026 07:57:22 +0100 Subject: [PATCH] net/isc-dhcp: support idassoc6 mode correctly Slightly simplify the previous code conditions since the new GUI code does auto-track6 separately now and both modes have 'track6-interface' set. PR: https://forum.opnsense.org/index.php?topic=50474.msg257718#msg257718 --- net/isc-dhcp/Makefile | 2 +- net/isc-dhcp/pkg-descr | 2 +- .../src/etc/inc/plugins.inc.d/dhcpd.inc | 11 ++++--- net/isc-dhcp/src/www/services_dhcpv6.php | 30 +++++++++++-------- 4 files changed, 26 insertions(+), 19 deletions(-) diff --git a/net/isc-dhcp/Makefile b/net/isc-dhcp/Makefile index 839e83462..93478a0aa 100644 --- a/net/isc-dhcp/Makefile +++ b/net/isc-dhcp/Makefile @@ -1,6 +1,6 @@ PLUGIN_NAME= isc-dhcp PLUGIN_VERSION= 1.0 -PLUGIN_REVISION= 1 +PLUGIN_REVISION= 2 PLUGIN_COMMENT= ISC DHCPv4/v6 server PLUGIN_DEPENDS= isc-dhcp44-server PLUGIN_MAINTAINER= franco@opnsense.org diff --git a/net/isc-dhcp/pkg-descr b/net/isc-dhcp/pkg-descr index 8e9525483..fe0e35dae 100644 --- a/net/isc-dhcp/pkg-descr +++ b/net/isc-dhcp/pkg-descr @@ -13,5 +13,5 @@ Plugin Changelog * First release resembling the core state of 25.7.11 * Minor changes due to "radvd" extraction out of DHCPv6 configuration -* Minor changes regarding "track6" mode handling +* Minor changes regarding "track6" and "idassoc6" mode handling * Added DHCPv6 static mappings export diff --git a/net/isc-dhcp/src/etc/inc/plugins.inc.d/dhcpd.inc b/net/isc-dhcp/src/etc/inc/plugins.inc.d/dhcpd.inc index 96900d285..aaea6aff3 100644 --- a/net/isc-dhcp/src/etc/inc/plugins.inc.d/dhcpd.inc +++ b/net/isc-dhcp/src/etc/inc/plugins.inc.d/dhcpd.inc @@ -886,7 +886,7 @@ function dhcpd_dhcp6_configure($verbose = false, $ignorelist = []) if (isset($ignorelist[$ifname])) { continue; } - if (($config['interfaces'][$ifname]['ipaddrv6'] ?? 'none') == 'track6') { + if (isset($config['interfaces'][$ifname]['track6-interface'])) { list ($ifcfgipv6) = interfaces_primary_address6($ifname, $ifconfig_details); if (!is_ipaddrv6($ifcfgipv6)) { continue; @@ -895,7 +895,10 @@ function dhcpd_dhcp6_configure($verbose = false, $ignorelist = []) $ifcfgipv6 = Net_IPv6::getNetmask($ifcfgipv6, 64); $ifcfgipv6arr = explode(':', $ifcfgipv6); - if (!isset($config['interfaces'][$ifname]['dhcpd6track6allowoverride'])) { + if ( + ($config['interfaces'][$ifname]['ipaddrv6'] ?? 'none') == 'track6' && + !isset($config['interfaces'][$ifname]['dhcpd6track6allowoverride']) + ) { /* mock a real server */ if (!empty($dhcpdv6cfg[$ifname]['enable']) && $dhcpdv6cfg[$ifname]['enable'] == '-1') { /* tracking, but dhcpv6 disabled */ @@ -1132,7 +1135,7 @@ host s_{$dhcpv6if}_{$i} { EOD; if (!empty($sm['ipaddrv6'])) { - if (isset($config['interfaces'][$dhcpv6if]['dhcpd6track6allowoverride'])) { + if (isset($config['interfaces'][$dhcpv6if]['track6-interface'])) { $sm['ipaddrv6'] = merge_ipv6_address($ifcfgipv6, $sm['ipaddrv6']); } $dhcpdv6conf .= " fixed-address6 {$sm['ipaddrv6']};\n"; @@ -1209,7 +1212,7 @@ function dhcpd_staticmap($proto = null, $valid_addresses = true, $ifconfig_detai } $ifconf = config_read_array('interfaces', $dhcpif); - list ($ipaddrv6) = $inet == 6 && isset($ifconf['dhcpd6track6allowoverride']) ? + list ($ipaddrv6) = $inet == 6 && isset($ifconf['track6-interface']) ? interfaces_primary_address6($dhcpif, $ifconfig_details) : [null]; foreach ($dhcpifconf['staticmap'] as $host) { diff --git a/net/isc-dhcp/src/www/services_dhcpv6.php b/net/isc-dhcp/src/www/services_dhcpv6.php index dfe2e587e..8f1f17e6f 100644 --- a/net/isc-dhcp/src/www/services_dhcpv6.php +++ b/net/isc-dhcp/src/www/services_dhcpv6.php @@ -141,7 +141,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { if (!empty($_GET['if']) && !empty($config['interfaces'][$_GET['if']]) && isset($config['interfaces'][$_GET['if']]['enable']) && (is_ipaddr($config['interfaces'][$_GET['if']]['ipaddrv6']) || - $config['interfaces'][$_GET['if']]['ipaddrv6'] == 'track6')) { + in_array($config['interfaces'][$_GET['if']]['ipaddrv6'], ['idassoc6', 'track6']))) { $if = $_GET['if']; } } elseif ($_SERVER['REQUEST_METHOD'] === 'POST') { @@ -154,29 +154,33 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { } } -/** - * XXX: In case of tracking, show different form and only handle on/off options. - * this code injection is intended to keep changes as minimal as possible and avoid regressions on existing isc-dhcp6 installs, - * while showing current state for tracking interfaces. - **/ if ($if === null) { /* if no interface is provided this invoke is invalid */ header(url_safe('Location: /index.php')); exit; } elseif (($config['interfaces'][$if]['ipaddrv6'] ?? 'none') == 'track6' && !isset($config['interfaces'][$if]['dhcpd6track6allowoverride'])) { + /* + * In case of automatic tracking, show different form and only handle on/off options. + * This code injection is intended to keep changes as minimal as possible and avoid + * regressions on existing isc-dhcp installs, while showing current state for tracking + * interfaces. + */ if ($_SERVER['REQUEST_METHOD'] === 'GET') { show_track6_form($if); } elseif ($_SERVER['REQUEST_METHOD'] === 'POST') { process_track6_form($if); + } else { + header(url_safe('Location: /index.php')); } exit; } -/* default form processing */ + +/* default form processing (for manual track6 and idassoc6 but handled via 'track6-interface') */ $ifcfgip = $config['interfaces'][$if]['ipaddrv6']; $ifcfgsn = $config['interfaces'][$if]['subnetv6']; -if (isset($config['interfaces'][$if]['dhcpd6track6allowoverride'])) { +if (isset($config['interfaces'][$if]['track6-interface'])) { list ($ifcfgip,, $ifcfgsn) = interfaces_primary_address6($if); $pdlen = calculate_ipv6_delegation_length($config['interfaces'][$if]['track6-interface']) - 1; } @@ -316,7 +320,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { $range_from = $pconfig['range_from']; $range_to = $pconfig['range_to']; - if (isset($config['interfaces'][$if]['dhcpd6track6allowoverride'])) { + if (isset($config['interfaces'][$if]['track6-interface'])) { $range_from = merge_ipv6_address($ifcfgip, $pconfig['range_from']); $range_to = merge_ipv6_address($ifcfgip, $pconfig['range_to']); } @@ -606,11 +610,11 @@ include("head.inc");