diff options
Diffstat (limited to 'etc/inc')
-rw-r--r-- | etc/inc/interfaces.inc | 184 |
1 files changed, 88 insertions, 96 deletions
diff --git a/etc/inc/interfaces.inc b/etc/inc/interfaces.inc index aa1e4ab..92c5470 100644 --- a/etc/inc/interfaces.inc +++ b/etc/inc/interfaces.inc @@ -2639,8 +2639,11 @@ function find_dhclient_process($interface) { } function find_dhcp6c_process($interface) { + global $g; + if ($interface) - $pid = `/bin/ps auxw|grep "[d]hcp6c" |grep "{$interface}"|awk '{print $2}'`; + if (isvalidpid("{$g['varrun_path']}/dhcp6c_{$interface}.pid")) + $pid = trim(file_get_contents("{$g['varrun_path']}/dhcp6c_{$interface}.pid"), " \n"); else return(false); @@ -2901,19 +2904,14 @@ function interface_configure($interface = "wan", $reloadall = false, $linkupeven function interface_track6_configure($interface = "lan") { global $config, $g; - $iflist = get_configured_interface_with_descr(false, true); $wancfg = $config['interfaces'][$interface]; - $wanif = $wancfg['if']; - if (empty($wancfg)) - $wancfg = array(); - - $wanif = get_real_interface($interface); + if (empty($config['interfaces'][$interface])) + return; /* If the interface is not configured via another, exit */ - if(!$wancfg['track6-interface'] <> "") { - return(false); - } + if (empty($wancfg['track6-interface'])) + return; /* always configure a link-local of fe80::1:1 on the track6 interfaces */ $realif = get_real_interface($interface); @@ -2922,52 +2920,49 @@ function interface_track6_configure($interface = "lan") { $type = $config['interfaces'][$wancfg['track6-interface']]['ipaddrv6']; switch($type) { case "6to4": - log_error("Interface {$interface} configured via {$wancfg['track6-interface']} type {$type}"); + if ($g['debug']) + log_error("Interface {$interface} configured via {$wancfg['track6-interface']} type {$type}"); interface_track6_6to4_configure($interface); break; case "6rd": - log_error("Interface {$interface} configured via {$wancfg['track6-interface']} type {$type}"); + if ($g['debug']) + log_error("Interface {$interface} configured via {$wancfg['track6-interface']} type {$type}"); interface_track6_6rd_configure($interface); break; case "dhcp6": - log_error("Interface {$interface} configured via {$wancfg['track6-interface']} type {$type}"); + if ($g['debug']) + log_error("Interface {$interface} configured via {$wancfg['track6-interface']} type {$type}"); interface_track6_dhcp6_configure($interface); break; - default: - log_error("Interface {$interface} configured via {$wancfg['track6-interface']} but unknown type {$type}"); - break; } + return 0; } function interface_track6_6rd_configure($interface = "lan") { global $config, $g; - $iflist = get_configured_interface_with_descr(false, true); $lancfg = $config['interfaces'][$interface]; - $lanif = $lancfg['if']; - if (empty($lancfg)) - $lancfg = array(); - - $lanif = get_real_interface($interface); + if (empty($config['interfaces'][$interface])) + return; /* If the interface is not configured via another, exit */ - if(!$lancfg['track6-interface'] <> "") { - return(false); - } - if(!is_numeric($lancfg['track6-prefix-id'])) + if (empty($lancfg['track6-interface'])) + return; + + if (!is_numeric($lancfg['track6-prefix-id'])) $lancfg['track6-prefix-id'] = 0; $wancfg = $config['interfaces'][$lancfg['track6-interface']]; - $wanif = $wancfg['if']; if (empty($wancfg)) - $wancfg = array(); + return; + $wanif = get_real_interface($lancfg['track6-interface']); $ip4address = find_interface_ip($wanif); - if((!is_ipaddrv4($ip4address)) || (is_private_ip($ip4address))) { + if ((!is_ipaddrv4($ip4address)) || (is_private_ip($ip4address))) { log_error("The interface IPv4 '{$ip4address}' address on interface '{$wanif}' is not public, not configuring 6RD tunnel"); - return false; + return; } $hexwanv4 = return_hex_ipv4($ip4address); @@ -2995,38 +2990,38 @@ function interface_track6_6rd_configure($interface = "lan") { /* convert the 128 bits for the lan address back into a valid IPv6 address */ $rd6lan = convert_128bit_to_ipv6($rd6lanbin) ."1"; + $lanif = get_real_interface($interface); log_error("rd6 {$interface} with ipv6 address {$rd6lan} based on {$lancfg['track6-interface']} ipv4 {$ip4address}"); mwexec("/sbin/ifconfig {$lanif} inet6 {$rd6lan} prefixlen 64"); + return 0; } function interface_track6_6to4_configure($interface = "lan") { global $config, $g; - $iflist = get_configured_interface_with_descr(false, true); $lancfg = $config['interfaces'][$interface]; - $lanif = $lancfg['if']; - if (empty($lancfg)) - $lancfg = array(); - - $lanif = get_real_interface($interface); + if (empty($config['interfaces'][$interface])) + return; /* If the interface is not configured via another, exit */ - if(!$lancfg['track6-interface'] <> "") { - return(false); - } - if(!is_numeric($lancfg['track6-prefix-id'])) + if (empty($lancfg['track6-interface'])) + return; + + if (!is_numeric($lancfg['track6-prefix-id'])) $lancfg['track6-prefix-id'] = 0; + $wanif = get_real_interface($lancfg['track6-interface']); + if (!$wanif) + return; $wancfg = $config['interfaces'][$lancfg['track6-interface']]; - $wanif = $wancfg['if']; if (empty($wancfg)) $wancfg = array(); $ip4address = find_interface_ip($wanif); - if((!is_ipaddrv4($ip4address)) || (is_private_ip($ip4address))) { + if (!is_ipaddrv4($ip4address) || is_private_ip($ip4address)) { log_error("The interface IPv4 '{$ip4address}' address on interface '{$wanif}' is not public, not configuring 6RD tunnel"); - return false; + return; } $hexwanv4 = return_hex_ipv4($ip4address); @@ -3050,72 +3045,68 @@ function interface_track6_6to4_configure($interface = "lan") { /* convert the 128 bits for the lan address back into a valid IPv6 address */ $sixto4lan = convert_128bit_to_ipv6($sixto4lanbin) ."1"; + $lanif = get_real_interface($interface); log_error("sixto4 {$interface} with ipv6 address {$sixto4lan} based on {$lancfg['track6-interface']} ipv4 {$ip4address}"); mwexec("/sbin/ifconfig {$lanif} inet6 {$sixto4lan} prefixlen 64"); + return 0; } function interface_track6_dhcp6_configure($interface = "lan") { global $config, $g; - $iflist = get_configured_interface_with_descr(false, true); $lancfg = $config['interfaces'][$interface]; - $lanif = $lancfg['if']; - if (empty($lancfg)) - $lancfg = array(); - - $lanif = get_real_interface($interface); + if (empty($config['interfaces'][$interface])) + return; /* If the interface is not configured via another, exit */ - if(!$lancfg['track6-interface'] <> "") { - return(false); - } - if(!is_numeric($lancfg['track6-prefix-id'])) + if (empty($lancfg['track6-interface'])) + return; + + if (!is_numeric($lancfg['track6-prefix-id'])) $lancfg['track6-prefix-id'] = 0; $wancfg = $config['interfaces'][$lancfg['track6-interface']]; - $wanif = $wancfg['if']; if (empty($wancfg)) $wancfg = array(); - - $ifcfgipv6 = find_interface_ipv6($lanif); - if(is_ipaddrv6($ifcfgipv6)) { + $wanif = get_real_interface($lancfg['track6-interface']); + $ifcfgipv6 = find_interface_ipv6($wanif); + if (is_ipaddrv6($ifcfgipv6)) { $dhcp6lanarr = explode(":", Net_IPv6::uncompress($ifcfgipv6)); $dhcp6lanarr[4] = 0; $dhcp6lanarr[5] = 0; $dhcp6lanarr[6] = 0; $dhcp6lanarr[7] = 1; $dhcp6lan = Net_IPv6::compress(implode(":", $dhcp6lanarr)); + $lanif = get_real_interface($interface); log_error("dhcp6 {$interface} with ipv6 address {$dhcp6lan} based on {$lancfg['track6-interface']}"); mwexec("/sbin/ifconfig {$lanif} inet6 {$dhcp6lan} prefixlen 64"); } + return 0; } function interface_6rd_configure($interface = "wan") { global $config, $g; - $iflist = get_configured_interface_with_descr(false, true); /* because this is a tunnel interface we can only function * with a public IPv4 address on the interface */ $wancfg = $config['interfaces'][$interface]; - $wanif = $wancfg['if']; if (empty($wancfg)) - $wancfg = array(); + return; $wanif = get_real_interface($interface); - $ip4address = find_interface_ip($wanif); $ip4gateway = get_interface_gateway($wanif); - if((!is_ipaddrv4($ip4address)) || (is_private_ip($ip4address))) { + if ((!is_ipaddrv4($ip4address)) || (is_private_ip($ip4address))) { log_error("The interface IPv4 '{$ip4address}' address on interface '{$wanif}' is not public, not configuring 6RD tunnel"); return false; } $hexwanv4 = return_hex_ipv4($ip4address); - if(!is_numeric($wancfg['prefix-6rd-v4plen'])) + if (!is_numeric($wancfg['prefix-6rd-v4plen'])) $wancfg['prefix-6rd-v4plen'] = 0; /* create the long prefix notation for math, save the prefix length */ @@ -3153,18 +3144,21 @@ function interface_6rd_configure($interface = "wan") { mwexec("/sbin/ifconfig stf0 create"); pfSense_interface_flags("stf0", IFF_LINK2); mwexec("/sbin/ifconfig stf0 inet6 {$rd6prefix}/{$rd6prefixlen}"); - log_error("Created 6rd interface stf0 {$rd6prefix}/{$rd6prefixlen}"); + if ($g['debug']) + log_error("Created 6rd interface stf0 {$rd6prefix}/{$rd6prefixlen}"); /* write out a default router file */ file_put_contents("{$g['tmp_path']}/{$wanif}_routerv6", "{$rd6brgw}\n"); file_put_contents("{$g['tmp_path']}/{$wanif}_defaultgwv6", "{$rd6brgw}\n"); if (is_ipaddrv4($ip4gateway)) - mwexec("route change -host " . $wancfg['gateway-6rd'] . " {$ip4gateway}"); + mwexec("/sbin/route change -host " . $wancfg['gateway-6rd'] . " {$ip4gateway}"); /* configure dependent interfaces */ + /* XXX: Really necessary? */ + $iflist = get_configured_interface_with_descr(false, true); foreach($iflist as $if => $ifname) { - if($config['interfaces'][$if]['track6-interface'] == $interface) + if ($config['interfaces'][$if]['track6-interface'] == $interface) interface_track6_configure($if); } @@ -3271,22 +3265,13 @@ function interface_6to4_configure($interface = "wan"){ function interface_dhcpv6_configure($interface = "wan") { global $config, $g; - $iflist = get_configured_interface_with_descr(false, true); $wancfg = $config['interfaces'][$interface]; - $wanif = $wancfg['if']; - if (empty($wancfg)) - $wancfg = array(); + if (empty($config['interfaces'][$interface])) + return; $wanif = get_real_interface($interface); - /* wide-dhcp6c works for now. */ - $fd = fopen("{$g['varetc_path']}/dhcp6c_{$interface}.conf", "w"); - if (!$fd) { - printf("Error: cannot open dhcp6c_{$interface}.conf in interface_dhcpv6_configure() for writing.\n"); - return 1; - } - $dhcp6cconf = ""; $dhcp6cconf .= "interface {$wanif} {\n"; @@ -3300,9 +3285,8 @@ function interface_dhcpv6_configure($interface = "wan") { } else { $dhcp6cconf .= " send ia-na 0; # request stateful address\n"; - if(is_numeric($wancfg['dhcp6-ia-pd-len'])) { + if(is_numeric($wancfg['dhcp6-ia-pd-len'])) $dhcp6cconf .= " send ia-pd 0; # request prefix delegation\n"; - } $dhcp6cconf .= "request domain-name-servers;\n"; $dhcp6cconf .= "request domain-name;\n"; $dhcp6cconf .= "script \"{$g['varetc_path']}/dhcp6c_{$interface}_script.sh\"; # we'd like some nameservers please\n"; @@ -3312,11 +3296,12 @@ function interface_dhcpv6_configure($interface = "wan") { if(is_numeric($wancfg['dhcp6-ia-pd-len'])) { /* Setup the prefix delegation */ $dhcp6cconf .= "id-assoc pd 0 {\n"; + $iflist = get_configured_interface_with_descr(false, true); foreach($iflist as $friendly => $ifdescr) { if($config['interfaces'][$friendly]['track6-interface'] != $interface) continue; - if(is_numeric($config['interfaces'][$friendly]['track6-prefix-id'])) { - log_error("setting up $friendly - {$config['interfaces'][$friendly]['track6-prefix-id']}"); + if (is_numeric($config['interfaces'][$friendly]['track6-prefix-id'])) { + log_error("setting up $ifdescr - {$config['interfaces'][$friendly]['track6-prefix-id']}"); $realif = get_real_interface($friendly); $dhcp6cconf .= " prefix-interface {$realif} {\n"; $dhcp6cconf .= " sla-id {$config['interfaces'][$friendly]['track6-prefix-id']};\n"; @@ -3327,22 +3312,25 @@ function interface_dhcpv6_configure($interface = "wan") { $dhcp6cconf .= "};\n"; } } - fwrite($fd, $dhcp6cconf); - fclose($fd); + /* wide-dhcp6c works for now. */ + if (!@file_put_contents("{$g['varetc_path']}/dhcp6c_{$interface}.conf", $dhcp6cconf)) { + printf("Error: cannot open dhcp6c_{$interface}.conf in interface_dhcpv6_configure() for writing.\n"); + unet($dhcp6cconf); + return 1; + } + unet($dhcp6cconf); + $dhcp6cscript = "#!/bin/sh\n"; + $dhcp6cscript .= "# This shell script launches /etc/rc.newwanipv6 with a interface argument.\n"; + $dhcp6cscript .= "/etc/rc.newwanipv6 {$wanif} \n"; /* Add wide-dhcp6c shell script here. Because we can not pass a argument to it. */ - $fds = fopen("{$g['varetc_path']}/dhcp6c_{$interface}_script.sh", "w"); - if (!$fds) { + if (!@file_put_contents("{$g['varetc_path']}/dhcp6c_{$interface}_script.sh", $dhcp6cscript)) { printf("Error: cannot open dhcp6c_{$interface}_script.sh in interface_dhcpv6_configure() for writing.\n"); + unet($dhcp6cscript); return 1; } - $dhcp6cscript = "#!/bin/sh\n"; - $dhcp6cscript .= "# This shell script launches /etc/rc.newwanipv6 with a interface argument.\n"; - $dhcp6cscript .= "/etc/rc.newwanipv6 $wanif \n"; - - fwrite($fds, $dhcp6cscript); - fclose($fds); - chmod("{$g['varetc_path']}/dhcp6c_{$interface}_script.sh", 0755); + unet($dhcp6cscript); + @chmod("{$g['varetc_path']}/dhcp6c_{$interface}_script.sh", 0755); /* accept router advertisements for this interface */ @@ -3355,10 +3343,11 @@ function interface_dhcpv6_configure($interface = "wan") { filter_configure_sync(); /* fire up dhcp6c for IPv6 first, this backgrounds immediately */ - mwexec("/usr/local/sbin/dhcp6c -d -c {$g['varetc_path']}/dhcp6c_{$interface}.conf {$wanif}"); + mwexec("/usr/local/sbin/dhcp6c -d -c {$g['varetc_path']}/dhcp6c_{$interface}.conf -p {$g['varrun_path']}/dhcp6c_{$interface}.pid {$wanif}"); sleep(1); + unset($out); exec("/sbin/rtsol -d {$wanif} 2>&1", $out, $ret); - if(!empty($out)) { + if (!empty($out)) { foreach($out as $line) { if((stristr($line, "received")) && (!stristr($line, "unexpected"))) { $parts = explode(" ", $line); @@ -3372,13 +3361,16 @@ function interface_dhcpv6_configure($interface = "wan") { } } /* worst case is that the rc.newwanipv6 handles setting up the track6 interface */ - if($wancfg['ippaddrv6'] != "slaac") { + if ($wancfg['ippaddrv6'] != "slaac") { /* configure dependent interfaces */ + /* XXX: Really necessary? */ + $iflist = get_configured_interface_with_descr(false, true); foreach($iflist as $if => $ifname) { - if($config['interfaces'][$if]['track6-interface'] == $interface) + if ($config['interfaces'][$if]['track6-interface'] == $interface) interface_track6_configure($if); } } + return 0; } |