diff options
author | David Wood <david@wood2.org.uk> | 2015-10-11 17:05:40 +0100 |
---|---|---|
committer | David Wood <david@wood2.org.uk> | 2015-10-11 17:05:40 +0100 |
commit | c3485245640f29c0eabc40aebad5ec6dfe54cf15 (patch) | |
tree | 4a3173297c0d42da6a9a49bf9d9d632847740c32 /usr | |
parent | 8ed4a1392990544e6dc7731ad9ac474dbc2f0bb1 (diff) | |
download | pfsense-c3485245640f29c0eabc40aebad5ec6dfe54cf15.zip pfsense-c3485245640f29c0eabc40aebad5ec6dfe54cf15.tar.gz |
Add /usr/local/sbin/ppp-ipv6 helper script
/usr/local/sbin/ppp-ipv6 <real interface> up|down
Interface using SLAAC or DHCP6 going down:
* bring down dhcp6c if it is running
* disable router advertisements (and therefore SLAAC)
* remove any autoconfigured IPv6 addresses
Interface using SLAAC or DHCP6 coming up:
* call interface_dhcpv6_configure() if dhcp6c not running and router advertisements off
interface_dhcpv6_configure() will enable router advertisements,
configure rtsold and dhcp6c, then set rtsold to prime dhcp6c as
required.
Diffstat (limited to 'usr')
-rwxr-xr-x | usr/local/sbin/ppp-ipv6 | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/usr/local/sbin/ppp-ipv6 b/usr/local/sbin/ppp-ipv6 new file mode 100755 index 0000000..a05a4c2 --- /dev/null +++ b/usr/local/sbin/ppp-ipv6 @@ -0,0 +1,123 @@ +#!/usr/local/bin/php -f +<?php +/* + ppp-ipv6 + + PPP IPv6 helper + + pfSense_BUILDER_BINARIES: /sbin/ifconfig /usr/local/sbin/dhcp6c + +*/ + +require_once("globals.inc"); +require_once("interfaces.inc"); + +function interface_ipv6_lower($interface_real) { + global $g, $config; + + if (!empty($interface_real)) { + $interface = convert_real_interface_to_friendly_interface_name($interface_real); + + if (!empty($interface) && is_array($config['interfaces'][$interface]) && interface_isppp_type($interface)) { + $ifcfg = $config['interfaces'][$interface]; + + if (!empty($ifcfg['ipaddrv6'])) { + switch ($ifcfg['ipaddrv6']) { + case 'slaac': + case 'dhcp6': + // bring down dhcp6c if it is running + $pidv6 = find_dhcp6c_process($interface_real); + if ($pidv6) { + posix_kill($pidv6, SIGTERM); + sleep(3); + } + unlink_if_exists("{$g['varetc_path']}/dhcp6c_{$interface}.conf"); + + // disable router advertisements (and therefore SLAAC) + mwexec("/sbin/ifconfig " . escapeshellarg($interface_real) . " inet6 -accept_rtadv"); + + // remove any autoconfigured IPv6 addresses + exec("/sbin/ifconfig " . escapeshellarg($interface_real) . " inet6", $ifconfig_output); + foreach ($ifconfig_output as $output) { + if (preg_match('{ \A \s+ inet6 \s+ (\S+) .* autoconf .* \Z}xmsi', $output, $matches)) { + mwexec("/sbin/ifconfig " . escapeshellarg($interface_real) . " inet6 " . escapeshellarg($matches[1]) . " delete"); + } + } + break; + default: + break; + } + } + } + } +} + +function interface_ipv6_raise($interface_real) { + global $config; + + if (!empty($interface_real)) { + $interface = convert_real_interface_to_friendly_interface_name($interface_real); + + if (!empty($interface) && is_array($config['interfaces'][$interface]) && interface_isppp_type($interface)) { + $ifcfg = $config['interfaces'][$interface]; + + if (!empty($ifcfg['ipaddrv6'])) { + switch ($ifcfg['ipaddrv6']) { + case 'slaac': + case 'dhcp6': + $pidv6 = find_dhcp6c_process($interface_real); + if (empty($pidv6)) { + // only fire if router advertisements off + // (if router advertisements are on, rtsold might be primed to fire dhcp6c already) + exec("/sbin/ifconfig " . escapeshellarg($interface_real) . " inet6", $ifconfig_output); + $start = true; + foreach ($ifconfig_output as $output) { + if (preg_match('{ \A .* ACCEPT_RTADV .* \Z}xmsi', $output)) { + $start = false; + break; + } + } + if ($start) { + interface_dhcpv6_configure($interface, $ifcfg); + } + } + break; + default: + break; + } + } + } + } +} + +// main entry point +if ($argc != 3) { + goto error; +} + +$interface_real = trim($argv[1], " \n\t"); +if (empty($interface_real)) { + goto error; +} + +switch (strtolower($argv[2])) { + case 'up': + interface_ipv6_raise($interface_real); + break; + case 'down': + interface_ipv6_lower($interface_real); + break; + default: + goto error; + break; +} + +exit(0); + +error: +if (!empty($argv[0])) { + echo("Usage: " . substr(strrchr('/' . $argv[0], '/'), 1) . " <PPP interface> up|down\n"); +} +exit(1); + +?> |