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.
This commit is contained in:
Franco Fichtner 2026-01-28 22:52:37 +01:00
parent 838873a544
commit 2db56bfeef
2 changed files with 12 additions and 26 deletions

View file

@ -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)

View file

@ -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