diff options
Diffstat (limited to 'src/etc/inc/interfaces.inc')
-rw-r--r-- | src/etc/inc/interfaces.inc | 278 |
1 files changed, 48 insertions, 230 deletions
diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index 60ba40e..dc984fd 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -1188,20 +1188,7 @@ function interface_reconfigure($interface = "wan", $reloadall = false) { function interface_vip_bring_down($vip) { global $g; - if (strpos($vip['interface'], '_vip')) { - if (is_ipaddrv6($vip['subnet'])) { - $family = 'inet6'; - } else { - $family = 'inet'; - } - - $carpvip = get_configured_carp_interface_list($vip['interface'], $family, 'vip'); - $iface = $carpvip['interface']; - } else { - $iface = $vip['interface']; - } - - $vipif = get_real_interface($iface); + $vipif = get_real_interface($vip['interface']); switch ($vip['mode']) { case "proxyarp": if (file_exists("{$g['varrun_path']}/choparp_{$vipif}.pid")) { @@ -2324,60 +2311,30 @@ function interface_ipalias_configure(&$vip) { return; } - if ($vip['interface'] != 'lo0' && stripos($vip['interface'], '_vip') === false) { - if (!isset($config['interfaces'][$vip['interface']])) { + $realif = get_real_interface("_vip{$vip['uniqid']}"); + if ($realif != "lo0") { + $if = convert_real_interface_to_friendly_interface_name($realif); + if (!isset($config['interfaces'][$if])) { return; } - if (!isset($config['interfaces'][$vip['interface']]['enable'])) { + if (!isset($config['interfaces'][$if]['enable'])) { return; } } $af = 'inet'; - if (is_ipaddrv6($vip['subnet'])) { + if (is_ipaddrv6($vip['subnet'])) $af = 'inet6'; - } $iface = $vip['interface']; - $vipadd = ''; - if (strpos($vip['interface'], '_vip')) { - $carpvip = get_configured_carp_interface_list($vip['interface'], $af, 'vip'); + $vhid = ''; + if (substr($vip['interface'], 0, 4) == "_vip") { + $carpvip = get_configured_vip($vip['interface']); $iface = $carpvip['interface']; - $vipadd = "vhid {$carpvip['vhid']}"; - } - $if = get_real_interface($iface); - mwexec("/sbin/ifconfig " . escapeshellarg($if) ." {$af} ". escapeshellarg($vip['subnet']) ."/" . escapeshellarg($vip['subnet_bits']) . " alias {$vipadd}"); - unset($iface, $af, $if, $carpvip, $vipadd); -} - -function interface_reload_carps($cif) { - global $config; - - $carpifs = link_ip_to_carp_interface(find_interface_ip($cif)); - if (empty($carpifs)) { - return; - } - - $carps = explode(" ", $carpifs); - if (is_array($config['virtualip']['vip'])) { - $viparr = &$config['virtualip']['vip']; - foreach ($viparr as $vip) { - if (in_array($vip['carpif'], $carps)) { - switch ($vip['mode']) { - case "carp": - interface_vip_bring_down($vip); - sleep(1); - interface_carp_configure($vip); - break; - case "ipalias": - interface_vip_bring_down($vip); - sleep(1); - interface_ipalias_configure($vip); - break; - } - } - } + $vhid = "vhid {$carpvip['vhid']}"; } + mwexec("/sbin/ifconfig " . escapeshellarg($realif) ." {$af} ". escapeshellarg($vip['subnet']) ."/" . escapeshellarg($vip['subnet_bits']) . " alias {$vhid}"); + unset($iface, $af, $realif, $carpvip, $vhid); } function interface_carp_configure(&$vip) { @@ -4535,16 +4492,6 @@ function get_current_wan_address($interface = "wan") { function convert_real_interface_to_friendly_interface_name($interface = "wan", $checkparent = false) { global $config; - if (stripos($interface, "_vip")) { - foreach ($config['virtualip']['vip'] as $counter => $vip) { - if ($vip['mode'] == "carp") { - if ($interface == "_vip{$vip['uniqid']}") { - return $vip['interface']; - } - } - } - } - /* XXX: For speed reasons reference directly the interface array */ $ifdescrs = &$config['interfaces']; //$ifdescrs = get_configured_interface_list(false, true); @@ -4781,10 +4728,9 @@ function get_real_interface($interface = "wan", $family = "all", $realv6iface = break; default: if (substr($interface, 0, 4) == '_vip') { - $wanif = get_configured_carp_interface_list($interface, $family, 'iface'); - if (!empty($wanif)) { - $wanif = get_real_interface($wanif, $family); - } + $wanif = get_configured_vip_interface($interface); + if (!empty($wanif)) + $wanif = get_real_interface($wanif); break; } else if (substr($interface, 0, 5) == '_lloc') { $interface = substr($interface, 5); @@ -4961,123 +4907,6 @@ function find_virtual_ip_alias($ip, $bits = null) { return false; } -/* - * find_number_of_created_carp_interfaces: return the number of carp interfaces - */ -function find_number_of_created_carp_interfaces() { - return `/sbin/ifconfig | /usr/bin/grep "carp:" | /usr/bin/wc -l`; -} - -/* - * find_carp_interface($ip): return the carp interface where an ip is defined - */ -function find_carp_interface($ip) { - global $config; - if (is_array($config['virtualip']['vip'])) { - foreach ($config['virtualip']['vip'] as $vip) { - if ($vip['mode'] == "carp") { - if (is_ipaddrv4($ip)) { - $carp_ip = get_interface_ip($vip['interface']); - } - if (is_ipaddrv6($ip)) { - $carp_ip = get_interface_ipv6($vip['interface']); - } - exec("/sbin/ifconfig", $output, $return); - foreach ($output as $line) { - $elements = preg_split("/[ ]+/i", $line); - if (strstr($elements[0], "vip")) { - $curif = str_replace(":", "", $elements[0]); - } - if (stristr($line, $ip)) { - $if = $curif; - continue; - } - } - - if ($if) { - return $if; - } - } - } - } -} - -function link_carp_interface_to_parent($interface) { - global $config; - - if (empty($interface)) { - return; - } - - $carp_ip = get_interface_ip($interface); - $carp_ipv6 = get_interface_ipv6($interface); - - if ((!is_ipaddrv4($carp_ip)) && (!is_ipaddrv6($carp_ipv6))) { - return; - } - - /* if list */ - $ifdescrs = get_configured_interface_list(); - foreach ($ifdescrs as $ifdescr => $ifname) { - /* check IPv4 */ - if (is_ipaddrv4($carp_ip)) { - $interfaceip = get_interface_ip($ifname); - $subnet_bits = get_interface_subnet($ifname); - $subnet_ip = gen_subnet("{$interfaceip}", "{$subnet_bits}"); - if (ip_in_subnet($carp_ip, "{$subnet_ip}/{$subnet_bits}")) { - return $ifname; - } - } - /* Check IPv6 */ - if (is_ipaddrv6($carp_ipv6)) { - $interfaceipv6 = get_interface_ipv6($ifname); - $prefixlen = get_interface_subnetv6($ifname); - if (ip_in_subnet($carp_ipv6, "{$interfaceipv6}/{$prefixlen}")) { - return $ifname; - } - } - } - return ""; -} - - -/****f* interfaces/link_ip_to_carp_interface - * NAME - * link_ip_to_carp_interface - Find where a CARP interface links to. - * INPUTS - * $ip - * RESULT - * $carp_ints - ******/ -function link_ip_to_carp_interface($ip) { - global $config; - - if (!is_ipaddr($ip)) { - return; - } - - $carp_ints = ""; - if (is_array($config['virtualip']['vip'])) { - $first = 0; - $carp_int = array(); - foreach ($config['virtualip']['vip'] as $vip) { - if ($vip['mode'] == "carp") { - $carp_ip = $vip['subnet']; - $carp_sn = $vip['subnet_bits']; - $carp_nw = gen_subnet($carp_ip, $carp_sn); - if (ip_in_subnet($ip, "{$carp_nw}/{$carp_sn}")) { - $carp_int[] = get_real_interface($vip['interface']); - } - } - } - if (!empty($carp_int)) { - $carp_ints = implode(" ", array_unique($carp_int)); - } - } - - return $carp_ints; -} - function link_interface_to_track6($int, $action = "") { global $config; @@ -5433,22 +5262,11 @@ function get_possible_listen_ips($include_ipv6_link_local=false) { } } } - /* XXX: Maybe use array_merge below? */ - $carplist = get_configured_carp_interface_list(); - foreach ($carplist as $cif => $carpip) { - if (get_vip_descr($carpip)) { - $interfaces[$cif] = $carpip . ' (' . get_vip_descr($carpip) . ')'; - } else { - $interfaces[$cif] = $carpip; - } - } - $aliaslist = get_configured_ip_aliases_list(); - foreach ($aliaslist as $aliasip => $aliasif) { - if (get_vip_descr($aliasip)) { - $interfaces[$aliasip] = $aliasip . ' (' . get_vip_descr($aliasip) . ')'; - } else { - $interfaces[$aliasip] = $aliasip; - } + $viplist = get_configured_vip_list(); + foreach ($viplist as $vip => $address) { + $interfaces[$vip] = $address; + if (get_vip_descr($address)) + $interfaces[$vip] .= " (". get_vip_descr($address) .")"; } $interfaces['lo0'] = 'Localhost'; @@ -5476,7 +5294,7 @@ function get_possible_traffic_source_addresses($include_ipv6_link_local=false) { function get_interface_ip($interface = "wan") { if (substr($interface, 0, 4) == '_vip') { - return get_configured_carp_interface_list($interface); + return get_configured_vip_ipv4($interface); } else if (substr($interface, 0, 5) == '_lloc') { /* No link-local address for v4. */ return null; @@ -5488,7 +5306,7 @@ function get_interface_ip($interface = "wan") { } if (substr($realif, 0, 4) == '_vip') { - return get_configured_carp_interface_list($realif, 'inet', 'ip'); + return get_configured_vip_ipv4($realif); } else if (substr($realif, 0, 5) == '_lloc') { /* No link-local address for v4. */ return null; @@ -5505,15 +5323,21 @@ function get_interface_ip($interface = "wan") { function get_interface_ipv6($interface = "wan", $flush = false) { global $config; + if (substr($interface, 0, 4) == '_vip') { + return get_configured_vip_ipv6($interface); + } else if (substr($interface, 0, 5) == '_lloc') { + return get_interface_linklocal($interface); + } + $realif = get_failover_interface($interface, 'inet6'); if (!$realif) { return null; } - if (substr($interface, 0, 4) == '_vip') { - return get_configured_carp_interface_list($interface, 'inet6', 'ip'); - } else if (substr($interface, 0, 5) == '_lloc') { - return get_interface_linklocal($interface); + if (substr($realif, 0, 4) == '_vip') { + return get_configured_vip_ipv6($realif); + } else if (substr($realif, 0, 5) == '_lloc') { + return get_interface_linklocal($realif); } if (is_array($config['interfaces'][$interface])) { @@ -5570,42 +5394,36 @@ function get_interface_linklocal($interface = "wan") { function get_interface_subnet($interface = "wan") { - if (substr($interface, 0, 4) == '_vip') { - return get_configured_carp_interface_list($interface, 'inet', 'subnet'); - } + if (substr($interface, 0, 4) == '_vip') + return (get_configured_vip_subnetv4($interface)); $realif = get_real_interface($interface); - if (!$realif) { - return null; - } + if (!$realif) + return (NULL); $cursn = find_interface_subnet($realif); - if (!empty($cursn)) { - return $cursn; - } + if (!empty($cursn)) + return ($cursn); - return null; + return (NULL); } function get_interface_subnetv6($interface = "wan") { - if (substr($interface, 0, 4) == '_vip') { - return get_configured_carp_interface_list($interface, 'inet6', 'subnet'); - } else if (substr($interface, 0, 5) == '_lloc') { + if (substr($interface, 0, 4) == '_vip') + return (get_configured_vip_subnetv6($interface)); + else if (substr($interface, 0, 5) == '_lloc') $interface = substr($interface, 5); - } $realif = get_real_interface($interface, 'inet6'); - if (!$realif) { - return null; - } + if (!$realif) + return (NULL); $cursn = find_interface_subnetv6($realif); - if (!empty($cursn)) { - return $cursn; - } + if (!empty($cursn)) + return ($cursn); - return null; + return (NULL); } /* return outside interfaces with a gateway */ |