From 58bfdecefa216a7edc2170d46abe3f138066ef81 Mon Sep 17 00:00:00 2001 From: Franco Fichtner Date: Thu, 8 Aug 2024 23:04:02 +0200 Subject: [PATCH] interfaces: backwards compat move of PPP IPv6 to linkup #7446 --- plist | 1 + src/etc/inc/interfaces.inc | 38 ++++++++++- src/etc/rc.newwanip | 13 +--- src/opnsense/scripts/interfaces/ppp-ipv6.php | 64 +++++++++++++++++++ src/opnsense/scripts/interfaces/ppp-linkup.sh | 1 + 5 files changed, 103 insertions(+), 14 deletions(-) create mode 100755 src/opnsense/scripts/interfaces/ppp-ipv6.php diff --git a/plist b/plist index b9ff3886d..26b768ce9 100644 --- a/plist +++ b/plist @@ -1085,6 +1085,7 @@ /usr/local/opnsense/scripts/interfaces/mpd.script /usr/local/opnsense/scripts/interfaces/ping.py /usr/local/opnsense/scripts/interfaces/portprobe.py +/usr/local/opnsense/scripts/interfaces/ppp-ipv6.php /usr/local/opnsense/scripts/interfaces/ppp-linkdown.sh /usr/local/opnsense/scripts/interfaces/ppp-linkup.sh /usr/local/opnsense/scripts/interfaces/ppp-rename.sh diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index 63d06b9f3..3bad1dbad 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -932,6 +932,40 @@ function interfaces_ptpid_next() return $ptpid; } +function interface_ppps_bound($interface, $family = null) +{ + global $config; + + $ifcfg = $config['interfaces'][$interface] ?? null; + $ppps = $config['ppps']['ppp'] ?? null; + $bound = false; + + if (!interface_ppps_capable($ifcfg, $ppps)) { + return $bound; + } + + /* XXX ignore $family for backwards compat at the moment */ + $bound = isset($wancfg['dhcp6usev4iface']); + + return $bound; +} + +function interface_ppps_capable($ifcfg, $ppps) +{ + if (empty($ifcfg) || empty($ppps)) { + return false; + } + + foreach ($ppps as $ppp) { + if ($ifcfg['if'] == $ppp['if']) { + /* we only test for PPP capability that needs mpd5 */ + return true; + } + } + + return false; +} + function interface_ppps_configure($interface) { global $config; @@ -2380,7 +2414,7 @@ function interface_configure($verbose = false, $interface = 'wan', $reload = fal case 'dhcp6': mwexecf('/sbin/ifconfig %s inet6 accept_rtadv -ifdisabled up', $realifv6); - if (!isset($wancfg['dhcp6usev4iface'])) { + if (!interface_ppps_bound($interface)) { interface_dhcpv6_prepare($interface, $wancfg); interface_dhcpv6_configure($interface, $wancfg); } @@ -2395,7 +2429,7 @@ function interface_configure($verbose = false, $interface = 'wan', $reload = fal interface_track6_configure($interface, $wancfg, $reload || $linkup); break; default: - if (!isset($wancfg['dhcp6usev4iface'])) { + if (!interface_ppps_bound($interface)) { interface_static6_configure($interface, $wancfg); } break; diff --git a/src/etc/rc.newwanip b/src/etc/rc.newwanip index 27490c431..340bdec94 100755 --- a/src/etc/rc.newwanip +++ b/src/etc/rc.newwanip @@ -2,7 +2,7 @@ + * Copyright (C) 2017-2024 Franco Fichtner * Copyright (C) 2006 Scott Ullrich * Copyright (C) 2003-2005 Manuel Kasper * All rights reserved. @@ -91,18 +91,7 @@ switch (isset($config['system']['ipv6allow']) ? ($config['interfaces'][$interfac interface_6rd_configure($interface, $config['interfaces'][$interface], true); system_routing_configure(false, $interface); /* XXX interface recreation breaks attached routes */ break; - case 'dhcp6': - case 'slaac': - if (isset($config['interfaces'][$interface]['dhcp6usev4iface'])) { - interface_dhcpv6_prepare($interface, $config['interfaces'][$interface]); - interface_dhcpv6_configure($interface, $config['interfaces'][$interface]); - } - break; default: - if (isset($config['interfaces'][$interface]['dhcp6usev4iface'])) { - interface_static6_configure($interface, $config['interfaces'][$interface]); - system_routing_configure(false, $interface, true, 'inet6'); - } break; } diff --git a/src/opnsense/scripts/interfaces/ppp-ipv6.php b/src/opnsense/scripts/interfaces/ppp-ipv6.php new file mode 100755 index 000000000..18babf10f --- /dev/null +++ b/src/opnsense/scripts/interfaces/ppp-ipv6.php @@ -0,0 +1,64 @@ +#!/usr/local/bin/php + + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +require_once 'config.inc'; +require_once 'util.inc'; +require_once 'system.inc'; +require_once 'interfaces.inc'; +require_once 'filter.inc'; +require_once 'auth.inc'; + +if (empty($argv[1]) || empty($argv[2])) { + exit(1); +} + +$interface = convert_real_interface_to_friendly_interface_name($argv[1]); +$family = $argv[2]; + +if (empty($interface) || ($family != 4 && $family != 6)) { + exit(1); +} + +if (!interface_ppps_bound($interface, $family)) { + exit(1); +} + +switch (isset($config['system']['ipv6allow']) ? ($config['interfaces'][$interface]['ipaddrv6'] ?? 'none') : 'none') { + case 'dhcp6': + case 'slaac': + interface_dhcpv6_prepare($interface, $config['interfaces'][$interface]); + interface_dhcpv6_configure($interface, $config['interfaces'][$interface]); + /* signal this succeeded to avoid triggering a newwanip event right away */ + exit(0); + default: + interface_static6_configure($interface, $config['interfaces'][$interface]); + system_routing_configure(false, $interface, true, 'inet6'); +} + +exit(1); diff --git a/src/opnsense/scripts/interfaces/ppp-linkup.sh b/src/opnsense/scripts/interfaces/ppp-linkup.sh index 95fe99df6..7aa783bb4 100755 --- a/src/opnsense/scripts/interfaces/ppp-linkup.sh +++ b/src/opnsense/scripts/interfaces/ppp-linkup.sh @@ -21,6 +21,7 @@ fi if [ "${2}" = "inet" ]; then /usr/local/sbin/ifctl -i ${1} -4nd ${DNS1} ${DNS2} /usr/local/sbin/ifctl -i ${1} -4rd ${ROUTER} + /usr/local/opnsense/scripts/interfaces/ppp-ipv6.php ${1} 4 /usr/local/sbin/configctl -d interface newip ${1} force elif [ "${2}" = "inet6" ]; then /usr/local/sbin/ifctl -i ${1} -6nd ${DNS1} ${DNS2}