From 2db56bfeefb9dd522dbb3495d6ffb6cc892ba7c1 Mon Sep 17 00:00:00 2001 From: Franco Fichtner Date: Wed, 28 Jan 2026 22:52:37 +0100 Subject: [PATCH] interfaces: multi-dhcp6c support #7647 This splits off rtsold and dhcp6c into separate processes. I'm not entirely sure why we settled for a single deamon of dhcp6c back in the day, but there are certianly downsides to it and I don't see something that wasn't fixed in the meantime that makes this not work. --- src/etc/inc/interfaces.inc | 26 +++++-------------- .../scripts/interfaces/rtsold_script.sh | 12 ++++----- 2 files changed, 12 insertions(+), 26 deletions(-) diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index 610377bc24..e353697f9b 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -868,7 +868,7 @@ function interface_reset($interface, $ifacecfg = false, $suspend = false) case 'slaac': case 'dhcp6': interface_dhcpv6_prepare($interface, $ifcfg, true); - killbypid('/var/run/dhcp6c.pid', 'HUP'); + killbypid("/var/run/dhcp6c.{$device}.pid", 'HUP'); break; case 'idassoc6': case 'track6': @@ -2609,7 +2609,7 @@ function interface_track6_configure($interface, $lancfg, $reload = false) case 'dhcp6': if ($reload || !isset($lancfg['enable'])) { interface_dhcpv6_prepare($lancfg['track6-interface'], $trackcfg); - killbypid('/var/run/dhcp6c.pid', 'HUP'); + killbypid("/var/run/dhcp6c.{$trackcfg['if']}.pid", 'HUP'); } break; } @@ -2893,15 +2893,16 @@ function interface_dhcpv6_configure($interface, $wancfg) } /* always kill rtsold in case of reconfigure */ - killbypid('/var/run/rtsold.pid'); + killbypid("/var/run/rtsold.{$wancfg['if']}.pid"); @unlink("/tmp/rtsold.{$wancfg['if']}.done"); - $rtsold_frmt = ['/usr/sbin/rtsold -%s -aiu -p %s -A %s -R %s']; + $rtsold_frmt = ['/usr/sbin/rtsold -%s -iu -p %s -A %s -R %s %s']; $rtsold_args = [ $settings->dhcp6_debug->isEmpty() ? 'd' : 'D', - '/var/run/rtsold.pid', + "/var/run/rtsold.{$wancfg['if']}.pid", '/usr/local/opnsense/scripts/interfaces/rtsold_script.sh', '/usr/local/opnsense/scripts/interfaces/rtsold_resolvconf.sh', + $wancfg['if'], ]; /* fire up rtsold for IPv6 RAs first */ @@ -2978,21 +2979,6 @@ function interface_dhcpv6_prepare($interface, $wancfg, $cleanup = false) } else { @unlink("/var/etc/dhcp6c.{$device}.conf"); } - - $dhcp6cconf = ''; - - /* merge configs and prepare single instance of dhcp6c for startup */ - foreach (legacy_config_get_interfaces(['enable' => true, 'virtual' => false]) as $_interface => $_wancfg) { - if (empty($_wancfg['ipaddrv6']) || ($_wancfg['ipaddrv6'] != 'dhcp6' && $_wancfg['ipaddrv6'] != 'slaac')) { - continue; - } - - if (file_exists("/var/etc/dhcp6c.{$_wancfg['if']}.conf")) { - $dhcp6cconf .= file_get_contents("/var/etc/dhcp6c.{$_wancfg['if']}.conf"); - } - } - - @file_put_contents('/var/etc/dhcp6c.conf', $dhcp6cconf); } function DHCP6_Config_File_Basic($interface, $wancfg, $wanif, $id = 0) diff --git a/src/opnsense/scripts/interfaces/rtsold_script.sh b/src/opnsense/scripts/interfaces/rtsold_script.sh index f9e09a89ac..d87ac0f2e1 100755 --- a/src/opnsense/scripts/interfaces/rtsold_script.sh +++ b/src/opnsense/scripts/interfaces/rtsold_script.sh @@ -33,17 +33,17 @@ if [ -z "${IFNAME}" ]; then fi if grep -q "^interface ${IFNAME} " /var/etc/radvd.conf; then - /usr/bin/logger -t dhcp6c "rtsold_script: rejecting dhcp6c" + /usr/bin/logger -t dhcp6c "rtsold_script: rejecting dhcp6c on ${IFNAME}" echo "Rejecting own configuration." exit 0 fi +CONFFILE="/var/etc/dhcp6c.${IFNAME}.conf" +PIDFILE="/var/run/dhcp6c.${IFNAME}.pid" DONEFILE="/tmp/rtsold.${IFNAME}.done" -CONFFILE="/var/etc/dhcp6c.conf" -PIDFILE="/var/run/dhcp6c.pid" if [ ! -f "${CONFFILE}" ]; then - /usr/bin/logger -t dhcp6c "rtsold_script: skipping dhcp6c" + /usr/bin/logger -t dhcp6c "rtsold_script: skipping dhcp6c on ${IFNAME}" exit 0 fi @@ -74,10 +74,10 @@ if [ -f "${PIDFILE}" ]; then fi if [ -f "${PIDFILE}" ]; then - /usr/bin/logger -t dhcp6c "rtsold_script: reloading dhcp6c" + /usr/bin/logger -t dhcp6c "rtsold_script: reloading dhcp6c on ${IFNAME}" /bin/pkill -HUP -F "${PIDFILE}" else - /usr/bin/logger -t dhcp6c "rtsold_script: starting dhcp6c" + /usr/bin/logger -t dhcp6c "rtsold_script: starting dhcp6c on ${IFNAME}" /usr/local/sbin/dhcp6c $(get_var EXTRAOPTS) -c "${CONFFILE}" -p "${PIDFILE}" fi