diff --git a/src/etc/inc/system.inc b/src/etc/inc/system.inc index 73e945ff7..37e5ddf93 100644 --- a/src/etc/inc/system.inc +++ b/src/etc/inc/system.inc @@ -517,6 +517,8 @@ function system_routing_configure($interface = '') $gatewayipv6 = ""; $interfacegwv6 = ""; $foundgwv6 = false; + $fargw = false; + /* tack on all the hard defined gateways as well */ if (isset($config['gateways']['gateway_item'])) { array_map('unlink', glob('/tmp/*_defaultgw{,v6}', GLOB_BRACE)); @@ -529,6 +531,7 @@ function system_routing_configure($interface = '') if ($gateway['gateway'] == "dynamic") { $gateway['gateway'] = get_interface_gateway($gateway['interface']); } + $fargw = isset($gateway['fargw']); $gatewayip = $gateway['gateway']; $interfacegw = $gateway['interface']; if (!empty($gateway['interface'])) { @@ -542,6 +545,7 @@ function system_routing_configure($interface = '') if ($gateway['gateway'] == "dynamic") { $gateway['gateway'] = get_interface_gateway_v6($gateway['interface']); } + $fargw = isset($gateway['fargw']); $gatewayipv6 = $gateway['gateway']; $interfacegwv6 = $gateway['interface']; if (!empty($gateway['interface'])) { @@ -574,22 +578,28 @@ function system_routing_configure($interface = '') if (!empty($interface) && $interface != $interfacegw) ; elseif (is_ipaddrv4($gatewayip)) { - log_error("ROUTING: remove current default route to $gatewayip"); - mwexec("/sbin/route delete default"); - log_error("ROUTING: setting default route to $gatewayip"); - mwexec("/sbin/route add -inet default " . escapeshellarg($gatewayip)); + log_error("ROUTING: setting IPv4 default route to {$gatewayip}"); + mwexecf('/sbin/route delete -inet %s', 'default'); + if ($fargw) { + mwexecf('/sbin/route delete -inet %s -interface %s', array($gatewayip, $interfacegw)); + mwexecf('/sbin/route add -inet %s -interface %s', array($gatewayip, $interfacegw)); + } + mwexecf('/sbin/route add -inet %s %s', array('default', $gatewayip)); } if (!empty($interface) && $interface != $interfacegwv6) ; elseif (is_ipaddrv6($gatewayipv6)) { - $ifscope = ""; if (is_linklocal($gatewayipv6)) { - $ifscope = "%{$defaultifv6}"; + $gatewayipv6 .= "%{$defaultifv6}"; } - log_error("ROUTING: setting IPv6 default route to {$gatewayipv6}{$ifscope}"); - mwexec("/sbin/route delete -inet6 default " . escapeshellarg("{$gatewayipv6}{$ifscope}")); - mwexec("/sbin/route add -inet6 default " . escapeshellarg("{$gatewayipv6}{$ifscope}")); + log_error("ROUTING: setting IPv6 default route to {$gatewayipv6}"); + mwexecf('/sbin/route delete -inet6 %s %s', array('default', $gatewayipv6)); + if ($fargw) { + mwexecf('/sbin/route delete -inet6 %s -interface %s', array($gatewayipv6, $interfacegwv6)); + mwexecf('/sbin/route add -inet6 %s -interface %s', array($gatewayipv6, $interfacegwv6)); + } + mwexecf('/sbin/route add -inet6 %s %s', array('default', $gatewayipv6)); } system_staticroutes_configure($interface, false); @@ -716,15 +726,15 @@ function system_staticroutes_configure($interface = '', $update_dns = false) $ip .= "/128"; } $inet = (is_subnetv6($ip) ? "-inet6" : "-inet"); - $iface = $needs_iface ? ' -iface ' . escapeshellarg($interfacegw) . ' ' : ''; + $iface = $needs_iface ? ' -interface ' . escapeshellarg($interfacegw) . ' ' : ''; $cmd = " {$inet} {$blackhole} " . escapeshellarg($ip) . " "; if (is_subnet($ip)) { if (is_ipaddr($gatewayip)) { - mwexec("/sbin/route delete".$cmd . $iface . escapeshellarg($gatewayip)); - mwexec("/sbin/route add".$cmd . $iface . escapeshellarg($gatewayip)); + mwexec("/sbin/route delete".$cmd . escapeshellarg($gatewayip) . $iface); + mwexec("/sbin/route add".$cmd . escapeshellarg($gatewayip) . $iface); } elseif (!empty($interfacegw)) { - mwexec("/sbin/route delete".$cmd . "-iface " . escapeshellarg($interfacegw)); - mwexec("/sbin/route add".$cmd . "-iface " . escapeshellarg($interfacegw)); + mwexec("/sbin/route delete".$cmd . "-interface " . escapeshellarg($interfacegw)); + mwexec("/sbin/route add".$cmd . "-interface " . escapeshellarg($interfacegw)); } } }