diff --git a/src/etc/inc/gwlb.inc b/src/etc/inc/gwlb.inc index 3c6e051ae..b5e9b5929 100644 --- a/src/etc/inc/gwlb.inc +++ b/src/etc/inc/gwlb.inc @@ -661,7 +661,7 @@ function return_gateways_array($disabled = false, $localhost = false, $inactive $gateway = array(); $gateway['dynamic'] = false; - $gateway['ipprotocol'] = "inet"; + $gateway['ipprotocol'] = 'inet'; $gateway['gateway'] = get_interface_gateway($ifname, $gateway['dynamic']); $gateway['interface'] = get_real_interface($ifname); $gateway['friendlyiface'] = $ifname; @@ -757,9 +757,9 @@ function return_gateways_array($disabled = false, $localhost = false, $inactive $gateway = array(); $gateway['dynamic'] = false; - $gateway['ipprotocol'] = "inet6"; + $gateway['ipprotocol'] = 'inet6'; $gateway['gateway'] = get_interface_gateway_v6($ifname, $gateway['dynamic']); - $gateway['interface'] = get_real_interface($ifname, "inet6"); + $gateway['interface'] = get_real_interface($ifname, 'inet6'); switch ($ifcfg['ipaddrv6']) { case "6rd": case "6to4": @@ -818,16 +818,16 @@ function return_gateways_array($disabled = false, $localhost = false, $inactive $gateway['gateway'] = get_interface_gateway($gateway['interface']); /* no IP address found, set to dynamic */ if (!is_ipaddrv4($gateway['gateway'])) { - $gateway['gateway'] = "dynamic"; + $gateway['gateway'] = 'dynamic'; } $gateway['dynamic'] = true; - } elseif ($gateway['ipprotocol'] == "inet6") { + } elseif ($gateway['ipprotocol'] == 'inet6') { /* if the gateway is dynamic and we can find the IPv6, Great! */ /* we know which interfaces is dynamic, this should be made a function, and for v6 too */ $gateway['gateway'] = get_interface_gateway_v6($gateway['interface']); /* no IPv6 address found, set to dynamic */ if (!is_ipaddrv6($gateway['gateway'])) { - $gateway['gateway'] = "dynamic"; + $gateway['gateway'] = 'dynamic'; } $gateway['dynamic'] = true; } @@ -840,13 +840,10 @@ function return_gateways_array($disabled = false, $localhost = false, $inactive } $gateway['friendlyiface'] = $gateway['interface']; - - /* special treatment for tunnel interfaces */ - if ($gateway['ipprotocol'] == "inet6") { - $gateway['interface'] = get_real_interface($gateway['interface'], 'inet6'); - } else { - $gateway['interface'] = get_real_interface($gateway['interface'], 'all'); - } + $gateway['interface'] = get_real_interface( + $gateway['interface'], + $gateway['ipprotocol'] != 'inet6' ? 'all' : 'inet6' + ); /* entry has a default flag, use it */ if (isset($gateway['defaultgw'])) { @@ -1081,64 +1078,68 @@ function get_interface_gateway($interface, &$dynamic = false) { global $config; - $gw = NULL; + $gw = null; - if (isset($config['interfaces'][$interface])) { - $gwcfg = $config['interfaces'][$interface]; - if (!empty($gwcfg['gateway']) && isset($config['gateways']['gateway_item'])) { - foreach ($config['gateways']['gateway_item'] as $gateway) { - if (($gateway['name'] == $gwcfg['gateway']) && (is_ipaddrv4($gateway['gateway']))) { - $gw = $gateway['gateway']; - break; - } - } - } - - // for dynamic interfaces we handle them through the $interface_router file. - if (!is_ipaddrv4($gw) && !is_ipaddrv4($gwcfg['ipaddr'])) { - $realif = get_real_interface($interface); - if (file_exists("/tmp/{$realif}_router")) { - $gw = trim(file_get_contents("/tmp/{$realif}_router"), " \n"); - $dynamic = true; - } - if (file_exists("/tmp/{$realif}_defaultgw")) { - $dynamic = "default"; - } - } + if (!isset($config['interfaces'][$interface])) { + return $gw; } - /* return gateway */ - return ($gw); -} - -function get_interface_gateway_v6($interface, &$dynamic = false) -{ - global $config; - - $gw = NULL; $gwcfg = $config['interfaces'][$interface]; - if (!empty($gwcfg['gatewayv6']) && isset($config['gateways']['gateway_item'])) { + if (!empty($gwcfg['gateway']) && isset($config['gateways']['gateway_item'])) { foreach ($config['gateways']['gateway_item'] as $gateway) { - if (($gateway['name'] == $gwcfg['gatewayv6']) && (is_ipaddrv6($gateway['gateway']))) { + if (($gateway['name'] == $gwcfg['gateway']) && (is_ipaddrv4($gateway['gateway']))) { $gw = $gateway['gateway']; break; } } } - // for dynamic interfaces we handle them through the $interface_router file. - if (!is_ipaddrv6($gw) && ( !isset($gwcfg['ipaddrv6']) || !is_ipaddrv6($gwcfg['ipaddrv6']))) { - $realif = get_real_interface($interface); + if (!is_ipaddrv4($gw) && !is_ipaddrv4($gwcfg['ipaddr'])) { + $realif = get_real_interface($interface); + if (file_exists("/tmp/{$realif}_router")) { + $gw = trim(file_get_contents("/tmp/{$realif}_router"), " \n"); + $dynamic = true; + } + if (file_exists("/tmp/{$realif}_defaultgw")) { + $dynamic = 'default'; + } + } + + return $gw; +} + +function get_interface_gateway_v6($interface, &$dynamic = false) +{ + global $config; + + $gw = null; + + if (!isset($config['interfaces'][$interface])) { + return $gw; + } + + $gwcfg = $config['interfaces'][$interface]; + if (!empty($gwcfg['gatewayv6']) && isset($config['gateways']['gateway_item'])) { + foreach ($config['gateways']['gateway_item'] as $gateway) { + if ($gateway['name'] == $gwcfg['gatewayv6'] && is_ipaddrv6($gateway['gateway'])) { + $gw = $gateway['gateway']; + break; + } + } + } + + if (!is_ipaddrv6($gw) && (!isset($gwcfg['ipaddrv6']) || !is_ipaddrv6($gwcfg['ipaddrv6']))) { + $realif = get_real_interface($interface, 'inet6'); if (file_exists("/tmp/{$realif}_routerv6")) { $gw = trim(file_get_contents("/tmp/{$realif}_routerv6"), " \n"); $dynamic = true; } if (file_exists("/tmp/{$realif}_defaultgwv6")) { - $dynamic = "default"; + $dynamic = 'default'; } } - /* return gateway */ - return ($gw); + + return $gw; } /* diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index d620e669b..d2946f3ab 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -1087,8 +1087,10 @@ function interface_bring_down($interface = "wan", $ifacecfg = false) $pfctlflush[$realif] = 1; } - /* apparently deletes the first IP it finds */ - mwexecf('/sbin/ifconfig %s delete', $realif); + $ip4 = find_interface_ip($realif, true); + if (is_ipaddrv4($ip4)) { + mwexecf('/sbin/ifconfig %s delete %s', array($realif, $ip4)); + } } if (does_interface_exist($realifv6)) { @@ -1098,7 +1100,7 @@ function interface_bring_down($interface = "wan", $ifacecfg = false) $pfctlflush[$realifv6] = 1; } - $ip6 = find_interface_ipv6($interface); + $ip6 = find_interface_ipv6($realifv6, true); if (is_ipaddrv6($ip6)) { mwexecf('/sbin/ifconfig %s inet6 %s delete', array($realifv6, $ip6)); } @@ -2622,7 +2624,7 @@ function interface_track6_6rd_configure($interface = 'lan', $lancfg) /* 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); + $lanif = get_real_interface($interface, 'inet6'); $oip = find_interface_ipv6($lanif); if (is_ipaddrv6($oip)) { mwexec("/sbin/ifconfig {$lanif} inet6 {$oip} delete"); @@ -2662,7 +2664,7 @@ function interface_track6_6to4_configure($interface = 'lan', $lancfg) /* 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); + $lanif = get_real_interface($interface, 'inet6'); $oip = find_interface_ipv6($lanif); if (is_ipaddrv6($oip)) { mwexec("/sbin/ifconfig {$lanif} inet6 {$oip} delete"); @@ -3884,42 +3886,51 @@ function link_interface_to_gif($interface) /* * find_interface_ip($interface): return the interface ip (first found) */ -function find_interface_ip($interface) +function find_interface_ip($interface, $exists = false) { $interface = trim($interface); - if (does_interface_exist($interface)) { - $ifinfo = legacy_get_interface_addresses($interface); - if (isset($ifinfo['ipaddr'])) { - return $ifinfo['ipaddr']; - } + + if (!$exists && !does_interface_exist($interface)) { + return null; } + + $ifinfo = legacy_get_interface_addresses($interface); + + if (isset($ifinfo['ipaddr'])) { + return $ifinfo['ipaddr']; + } + return null; } /* * find_interface_ipv6($interface): return the interface ip (first found) */ -function find_interface_ipv6($interface) +function find_interface_ipv6($interface, $exists = false) { - // a bit obscure, why should this be different then find_interface_ip? - $interface = get_real_interface(trim($interface)); - if (does_interface_exist($interface)) { - $ifinfo = legacy_get_interface_addresses($interface); - if (isset($ifinfo['ipaddr6'])) { - return $ifinfo['ipaddr6']; - } + $interface = trim($interface); + + if (!$exists && !does_interface_exist($interface)) { + return null; } + + $ifinfo = legacy_get_interface_addresses($interface); + + if (isset($ifinfo['ipaddr6'])) { + return $ifinfo['ipaddr6']; + } + return null; } /* * find_interface_ipv6_ll($interface): return the interface ipv6 link local (first found) */ -function find_interface_ipv6_ll($interface) +function find_interface_ipv6_ll($interface, $exists = false) { $interface = trim($interface); - if (!does_interface_exist($interface)) { + if (!$exists && !does_interface_exist($interface)) { return null; } @@ -3991,7 +4002,7 @@ function get_interface_ip($interface = 'wan') { $realif = get_failover_interface($interface); if (!$realif) { - if (strstr($interface, "_vip")) { + if (strstr($interface, '_vip')) { return get_configured_carp_interface_list($interface); } else { return null; @@ -3999,7 +4010,7 @@ function get_interface_ip($interface = 'wan') } $curip = find_interface_ip($realif); - if ($curip && is_ipaddr($curip) && $curip != '0.0.0.0') { + if (is_ipaddrv4($curip)) { return $curip; } @@ -4012,8 +4023,8 @@ function get_interface_ipv6($interface = 'wan') $realif = get_failover_interface($interface, 'inet6'); if (!$realif) { - if (strstr($interface, "_vip")) { - return get_configured_carp_interface_list($interface, "inet6"); + if (strstr($interface, '_vip')) { + return get_configured_carp_interface_list($interface, 'inet6'); } else { return null; } @@ -4021,7 +4032,7 @@ function get_interface_ipv6($interface = 'wan') $curip = isset($config['interfaces'][$interface]['dhcp6prefixonly']) ? find_interface_ipv6_ll($realif) : find_interface_ipv6($realif); - if ($curip && is_ipaddrv6($curip) && $curip != '::') { + if (is_ipaddrv6($curip)) { return $curip; } diff --git a/src/etc/inc/plugins.inc.d/unbound.inc b/src/etc/inc/plugins.inc.d/unbound.inc index 4a97a6ad3..a400f76f2 100644 --- a/src/etc/inc/plugins.inc.d/unbound.inc +++ b/src/etc/inc/plugins.inc.d/unbound.inc @@ -530,11 +530,11 @@ function unbound_add_host_entries() if ($interface == 'lo0') { continue; } - $if = get_real_interface($interface); - if (!does_interface_exist($if)) { - continue; - } - $laddr = find_interface_ip($if); + + $realifv4 = get_real_interface($interface); + $realifv6 = get_real_interface($interface, 'inet6'); + + $laddr = find_interface_ip($realifv4); if (is_ipaddrv4($laddr)) { $domain = $config['system']['domain']; if (isset($config['dhcpd'][$interface]['enable']) && !empty($config['dhcpd'][$interface]['domain'])) { @@ -544,7 +544,7 @@ function unbound_add_host_entries() $unbound_entries .= "local-data: \"{$config['system']['hostname']}.{$domain} A {$laddr}\"\n"; $unbound_entries .= "local-data: \"{$config['system']['hostname']} A {$laddr}\"\n"; } - $laddr6 = find_interface_ipv6($if); + $laddr6 = find_interface_ipv6($realifv6); if (is_ipaddrv6($laddr6)) { $domain = $config['system']['domain']; if (isset($config['dhcpdv6'][$interface]['enable']) && !empty($config['dhcpdv6'][$interface]['domain'])) { @@ -555,7 +555,7 @@ function unbound_add_host_entries() $unbound_entries .= "local-data: \"{$config['system']['hostname']} AAAA {$laddr6}\"\n"; } if (empty($config['unbound']['noreglladdr6'])) { - $lladdr6 = find_interface_ipv6_ll($if); + $lladdr6 = find_interface_ipv6_ll($realifv6); if (is_ipaddrv6($lladdr6)) { $domain = $config['system']['domain']; if (isset($config['dhcpdv6'][$interface]['enable']) && !empty($config['dhcpdv6'][$interface]['domain'])) { diff --git a/src/etc/inc/system.inc b/src/etc/inc/system.inc index 724ef8657..08adb494a 100644 --- a/src/etc/inc/system.inc +++ b/src/etc/inc/system.inc @@ -408,7 +408,7 @@ function system_host_route($host, $gateway, $delete = true, $add = true) function system_default_route($gateway, $family, $interface, $far = false) { - $realif = get_real_interface($interface); + $realif = get_real_interface($interface, $family == 'inet' ? 'all' : 'inet6'); switch ($family) { case 'inet': @@ -994,7 +994,7 @@ function get_possible_listen_ips($include_ipv6_link_local = false, $include_loop $tmp["value"] = $iface; $listenips[] = $tmp; if ($include_ipv6_link_local) { - $llip = find_interface_ipv6_ll(get_real_interface($iface)); + $llip = find_interface_ipv6_ll(get_real_interface($iface, 'inet6')); if (!empty($llip)) { $tmp["name"] = "{$ifacename} IPv6 Link-Local"; $tmp["value"] = $llip;