diff options
Diffstat (limited to 'etc/inc/interfaces.inc')
-rw-r--r-- | etc/inc/interfaces.inc | 740 |
1 files changed, 369 insertions, 371 deletions
diff --git a/etc/inc/interfaces.inc b/etc/inc/interfaces.inc index fc10e07..80b798e 100644 --- a/etc/inc/interfaces.inc +++ b/etc/inc/interfaces.inc @@ -75,10 +75,10 @@ function interface_vlan_configure($if, $tag, $vlanif = "") { if ($g['booting'] || !(empty($vlanif))) { mwexec("/sbin/ifconfig {$vlanif} destroy"); - mwexec("/sbin/ifconfig {$vlanif} create"); - } else - $vlanif = exec("/sbin/ifconfig vlan create"); - + mwexec("/sbin/ifconfig {$vlanif} create"); + } else + $vlanif = exec("/sbin/ifconfig vlan create"); + mwexec("/sbin/ifconfig {$vlanif} vlan " . escapeshellarg($tag) . " vlandev " . escapeshellarg($if)); @@ -87,15 +87,15 @@ function interface_vlan_configure($if, $tag, $vlanif = "") { for ($j = 0; $j < strlen($if); $j++) { if ($if[$j] >= '0' && $if[$j] <= '9') break; - } + } $drvname = substr($if, 0, $j); if (in_array($drvname, $vlan_native_supp)) - mwexec("/sbin/ifconfig {$vlanif} link0"); + mwexec("/sbin/ifconfig {$if} vlanhwtag"); else if (in_array($drvname, $vlan_long_frame)) - mwexec("/sbin/ifconfig {$vlanif} vlanmtu 1500"); + mwexec("/sbin/ifconfig {$if} vlanmtu 1500"); - mwexec("/sbin/ifconfig {$vlanif} up"); + mwexec("/sbin/ifconfig {$vlanif} up"); /* invalidate interface cache */ get_interface_arr(true); @@ -158,32 +158,33 @@ function interfaces_lan_configure() { mwexec("/sbin/ifconfig bridge{$bridges_total} create"); /* force all bridged interfaces to use same mtu */ - $mtu = get_interface_mtu($config['interfaces'][$lancfg['bridge']]['if']); + $bridgedif = get_real_wan_interface($lancfg['bridge']); + $mtu = get_interface_mtu($bridgedif); mwexec("/sbin/ifconfig {$lancfg['if']} mtu {$mtu}"); - mwexec("/sbin/ifconfig {$config['interfaces'][$lancfg['bridge']]['if']} mtu {$mtu}"); + mwexec("/sbin/ifconfig {$bridgeidf} mtu {$mtu}"); /* assign items to a bridge */ - mwexec("/sbin/ifconfig bridge{$bridges_total} addm {$lancfg['if']} addm {$config['interfaces'][$lancfg['bridge']]['if']}"); + mwexec("/sbin/ifconfig bridge{$bridges_total} addm {$lancfg['if']} addm {$bridgedif}"); if(!is_interface_wireless($lancfg['if']) and - !is_interface_wireless($config['interfaces'][$lancfg['bridge']]['if'])) - mwexec("/sbin/ifconfig bridge{$bridges_total} stp {$config['interfaces'][$lancfg['bridge']]['if']} stp {$lancfg['if']}"); + !is_interface_wireless($bridgedif)) + mwexec("/sbin/ifconfig bridge{$bridges_total} stp {$bridgedif} stp {$lancfg['if']}"); /* log commands run for debugging in /tmp/ */ $fd = fopen("{$g['tmp_path']}/bridge_config_{$lancfg['if']}", "w"); fwrite($fd, "/sbin/ifconfig {$lancfg['if']} mtu {$mtu}\n"); - fwrite($fd, "/sbin/ifconfig {$config['interfaces'][$lancfg['bridge']]['if']} mtu {$mtu}\n"); + fwrite($fd, "/sbin/ifconfig {$bridgedif} mtu {$mtu}\n"); fwrite($fd, "/sbin/ifconfig bridge{$bridges_total} create\n"); - fwrite($fd, "/sbin/ifconfig bridge{$bridges_total} addm {$lancfg['if']} addm {$config['interfaces'][$lancfg['bridge']]['if']}\n"); + fwrite($fd, "/sbin/ifconfig bridge{$bridges_total} addm {$lancfg['if']} addm {$bridgedif}\n"); if(!is_interface_wireless($lancfg['if']) and - !is_interface_wireless($config['interfaces'][$lancfg['bridge']]['if'])) - fwrite($fd, "/sbin/ifconfig bridge{$bridges_total} stp {$lancfg['if']} stp {$config['interfaces'][$lancfg['bridge']]['if']}\n"); + !is_interface_wireless($bridgedif)) + fwrite($fd, "/sbin/ifconfig bridge{$bridges_total} stp {$lancfg['if']} stp {$bridgedif}\n"); fclose($fd); /* bring up interfaces */ mwexec("/sbin/ifconfig bridge{$bridges_total} down"); usleep(100); - mwexec("/sbin/ifconfig {$config['interfaces'][$lancfg['bridge']]['if']} up"); + mwexec("/sbin/ifconfig {$bridgedif} up"); usleep(5); mwexec("/sbin/ifconfig {$lancfg['if']} up"); usleep(5); @@ -235,15 +236,26 @@ function interfaces_lan_configure() { return 0; } -function interfaces_optional_configure() { +function interfaces_configure() { global $g; /* XXX: unify with wan when pppoe/pptp fixups are done. */ /* optional interface if list */ - $iflist = get_configured_interface_list(true); + $iflist = get_configured_interface_with_descr(); - foreach($iflist as $if => $ifname) - interfaces_optional_configure_if($if); + foreach($iflist as $if => $ifname) { + if ($g['booting']) + echo "Configuring {$ifname} interface..."; + if($debug) + log_error("Configuring {$ifname}"); + + if ($if == "lan") + interfaces_lan_configure(); + else + interfaces_wan_configure($if); + if ($g['booting']) + echo "done.\n"; + } if (!$g['booting']) { /* reconfigure static routes (kernel may have deleted them) */ @@ -268,124 +280,11 @@ function interfaces_optional_configure() { return 0; } -function interfaces_optional_configure_if($opti) { - global $config, $g; - global $bridgeconfig, $debugging; - - $bridges_total = get_next_available_bridge_interface(); - - $optcfg = $config['interfaces'][$opti]; - - if ($g['booting']) { - $optdescr = ""; - if ($optcfg['descr']) - $optdescr = " ({$optcfg['descr']})"; - print "\t{$opti}{$optdescr}... "; - } - - if(file_exists("/tmp/{$optcfg['if']}_router")) - unlink("/tmp/{$optcfg['if']}_router"); - - if (isset($optcfg['enable'])) { - if($optcfg['gateway']) - system("echo " . $optcfg['gateway'] . " > /tmp/" . $optcfg['if'] . "_router"); - - /* wireless configuration? */ - if (is_array($optcfg['wireless'])) - interfaces_wireless_configure($optcfg['if'], $optcfg['wireless']); - - /* PPP configuration */ - if (isset($optcfg['pointtopoint'])) - interfaces_ppp_configure_if($optcfg); - - /* MAC spoofing? */ - if ($optcfg['spoofmac']) { - mwexec("/sbin/ifconfig " . escapeshellarg($optcfg['if']) . - " link " . escapeshellarg($optcfg['spoofmac'])); - } else { - $mac = get_interface_mac_address($optcfg['if']); - if($mac == "ff:ff:ff:ff:ff:ff") { - /* this is not a valid mac address. generate a - * temporary mac address so the machine can get online. - */ - echo "Generating new MAC address."; - $random_mac = generate_random_mac_address(); - mwexec("/sbin/ifconfig " . escapeshellarg($optcfg['if']) . - " link " . escapeshellarg($random_mac)); - $optcfg['spoofmac'] = $random_mac; - write_config(); - file_notice("MAC Address altered", "The INVALID MAC address (ff:ff:ff:ff:ff:ff) on interface {$optcfg['if']} has been automatically replaced with {$random_mac}", "Interfaces"); - } - } - - /* media */ - if ($optcfg['media'] || $optcfg['mediaopt']) { - $cmd = "/sbin/ifconfig " . escapeshellarg($optcfg['if']); - if ($optcfg['media']) - $cmd .= " media " . escapeshellarg($optcfg['media']); - if ($optcfg['mediaopt']) - $cmd .= " mediaopt " . escapeshellarg($optcfg['mediaopt']); - mwexec($cmd); - } - - /* bridged? */ - if ($optcfg['bridge']) { - mwexec("/sbin/ifconfig " . escapeshellarg($optcfg['if']) . " delete up"); - /* use open/netBSD style bridge */ - mwexec("/sbin/ifconfig bridge{$bridges_total} create"); - - /* invalidate interface cache */ - get_interface_arr(true); +function interface_bring_down($interface) { + global $config; - /* force all bridged interfaces to use same mtu */ - $mtu = get_interface_mtu($config['interfaces'][$optcfg['bridge']]['if']); - mwexec("/sbin/ifconfig {$optcfg['if']} mtu {$mtu}"); - mwexec("/sbin/ifconfig {$config['interfaces'][$optcfg['bridge']]['if']} mtu {$mtu}"); - - /* assign items to a bridge */ - mwexec("/sbin/ifconfig bridge{$bridges_total} addm {$optcfg['if']} addm {$config['interfaces'][$optcfg['bridge']]['if']}"); - - if(!is_interface_wireless($optcfg['if']) and - !is_interface_wireless($config['interfaces'][$optcfg['bridge']]['if'])) - mwexec("/sbin/ifconfig bridge{$bridges_total} stp {$config['interfaces'][$optcfg['bridge']]['if']} stp {$optcfg['if']}"); - - /* log commands run for debugging in /tmp/ */ - $fd = fopen("{$g['tmp_path']}/bridge_config_{$optcfg['if']}", "w"); - fwrite($fd, "/sbin/ifconfig {$optcfg['if']} mtu {$mtu}\n"); - fwrite($fd, "/sbin/ifconfig {$config['interfaces'][$optcfg['bridge']]['if']} mtu {$mtu}\n"); - fwrite($fd, "/sbin/ifconfig bridge{$bridges_total} create\n"); - fwrite($fd, "/sbin/ifconfig bridge{$bridges_total} addm {$optcfg['if']} addm {$config['interfaces'][$optcfg['bridge']]['if']} up\n"); - if(!is_interface_wireless($optcfg['if']) and - !is_interface_wireless($config['interfaces'][$optcfg['bridge']]['if'])) - fwrite($fd, "/sbin/ifconfig bridge{$bridges_total} stp {$optcfg['if']} stp {$config['interfaces'][$optcfg['bridge']]['if']}\n"); - fclose($fd); - - /* bring up interfaces */ - mwexec("/sbin/ifconfig bridge{$bridges_total} down"); - usleep(100); - mwexec("/sbin/ifconfig {$config['interfaces'][$optcfg['bridge']]['if']} up"); - usleep(5); - mwexec("/sbin/ifconfig {$optcfg['if']} up"); - usleep(5); - mwexec("/sbin/ifconfig bridge{$bridges_total} up"); - - $bridges_total++; - /* update cache */ - if ($bridges_total != find_number_of_created_bridges()) - find_number_of_created_bridges(true); - } else { - /* if user has selected DHCP type then act accordingly */ - if($optcfg['ipaddr'] == "dhcp") { - interfaces_opt_dhcp_configure($opti); - } else { - mwexec("/sbin/ifconfig " . escapeshellarg($optcfg['if']) . " " . - escapeshellarg($optcfg['ipaddr'] . "/" . $optcfg['subnet'])); - } - } - } else { - mwexec("/sbin/ifconfig " . escapeshellarg($optcfg['if']) . " delete down"); - } - return 0; + $cfg = $config['interfaces'][$interface]; + mwexec("/sbin/ifconfig " . escapeshellarg($cfg['if']) . " delete down"); } function interfaces_ppp_configure_if($ifcfg) { @@ -500,11 +399,10 @@ function interfaces_carp_configure() { /* install rules to alllow pfsync to sync up during boot * carp interfaces will remain down until the bootup sequence finishes */ - log_error("Installing minimal CARP rules..."); exec("echo pass quick proto carp all keep state > /tmp/rules.boot"); exec("echo pass quick proto pfsync all >> /tmp/rules.boot"); exec("echo pass out quick from any to any keep state >> /tmp/rules.boot"); - exec("/sbin/pfctl -f /tmp/rules.boot"); +// exec("/sbin/pfctl -f /tmp/rules.boot"); } /* setup pfsync interface */ if($carp_sync_int and $pfsyncenabled) { @@ -516,6 +414,7 @@ function interfaces_carp_configure() { } else { mwexec("/sbin/ifconfig pfsync0 syncdev lo0 up"); } + //$fd = fopen("/tmp/carp.sh", "w"); $viparr = &$config['virtualip']['vip']; if($config['virtualip']['vip']) { mwexec("/sbin/sysctl net.inet.carp.allow=1"); @@ -532,14 +431,17 @@ function interfaces_carp_configure() { $viparr_temp['password'] = $config['system']['hostname'] . "pfS"; $viparr = $viparr_temp; } - if(!is_array($viparr)) - return; - exec("/sbin/ifconfig > /tmp/before_carpinit"); - $fd = fopen("/tmp/carp.sh", "w"); + if(is_array($viparr)) foreach ($viparr as $vip) { - if ($vip['mode'] == "carp" or $vip['mode'] == "carpdev-dhcp") { - $vip_password = $vip['password']; - $vip_password = str_replace(" ", "", $vip_password); + $vip_password = $vip['password']; + $vip_password = str_replace(" ", "", $vip_password); + if($vip['password'] != "") + $password = " pass \"" . $vip_password . "\""; + $interface = filter_translate_type_to_real_interface($vip['interface']); + $carpint = "carp" . $carp_instances_counter; + + switch ($vip['mode']) { + case "carp": /* ensure CARP IP really exists prior to loading up */ $found = false; $iflist = get_configured_interface_list(); @@ -549,77 +451,81 @@ function interfaces_carp_configure() { if (ip_in_subnet($vip['subnet'], gen_subnet($ww_subnet_ip, $ww_subnet_bits) . "/" . $ww_subnet_bits)) $found = true; } - if($found == false and $vip['mode'] =="carp") { + if($found == false) { file_notice("CARP", "Sorry but we could not find a matching real interface subnet for the virtual IP address {$vip['subnet']}.", "Firewall: Virtual IP", ""); continue; } /* create the carp interface and setup */ - mwexec("/sbin/ifconfig carp" . $carp_instances_counter . " create"); + mwexec("/sbin/ifconfig {$carpint} create"); /* invalidate interface cache */ get_interface_arr(true); - - if($vip['mode'] =="carp") - $broadcast_address = "broadcast " . gen_subnet_max($vip['subnet'], $vip['subnet_bits']) . " "; - else - $broadcast_address = ""; + $broadcast_address = gen_subnet_max($vip['subnet'], $vip['subnet_bits']); + mwexec("/sbin/ifconfig {$carpint} " . $vip['subnet'] . "/" . $vip['subnet_bits'] . " broadcast " . $broadcast_address . " vhid " . $vip['vhid'] . " advskew " . $vip['advskew'] . $password); + mwexec("/sbin/ifconfig {$carpint} up"); + $carp_instances_counter++; + usleep(10); + break; + case "carpdev-dhcp": + log_error("Found carpdev interface {$vip['interface']} on top of interface {$interface}"); + if(!empty($interface)) { + mwexec("/sbin/ifconfig {$interface} up"); + mwexec("/sbin/ifconfig {$carpint} create"); + sleep(3); + mwexec("/sbin/ifconfig {$carpint} carpdev ". $interface . " vhid " . $vip['vhid'] . " advskew " . $vip['advskew'] . $password); + mwexec("/sbin/ifconfig {$carpint} up"); + /* + * XXX: BIG HACK but carpdev needs ip services active + * before even starting something as dhclient. + * I do not know if this is a feature or a bug + * but better than track it make it work ;) . + */ + $fakeiptouse = "10.254.254." . ($carp_instances_counter+1); + mwexec("/sbin/ifconfig {$carpint} inet {$fakeiptouse}"); - if($vip['password'] != "") - $password = "pass \"" . $vip_password . "\""; - - $carpint = "carp{$carp_instances_counter}"; + sleep(3); + /* generate dhclient_wan.conf */ + $fd = fopen("{$g['varetc_path']}/dhclient_{$carpint}.conf", "w"); + if ($fd) { - /* - * XXX: BIG HACK but carpdev needs ip services active - * before even starting something as dhclient. - * I do not know if this is a feature or a bug - * but better than track it make it work ;) . - */ - $fakeiptouse = "10.254.254." . ($carp_instances_counter+1); - mwexec("/sbin/ifconfig {$carpint} inet {$fakeiptouse}"); - sleep(2); - - if($vip['mode'] =="carp") { - $carp_cmd = "ifconfig carp" . $carp_instances_counter . " "; - $carp_cmd .= $vip['subnet'] . "/" . $vip['subnet_bits'] . " "; - $carp_cmd .= $broadcast_address; - $carp_cmd .= "vhid " . $vip['vhid'] . " "; - $carp_cmd .= "advskew " . $vip['advskew'] . " "; - $carp_cmd .= $password; - - /* bring up CARP ip */ - exec($carp_cmd); - exec("/sbin/ifconfig {$carpint} up"); - - /* Write out exact commands for easier debugging */ - fwrite($fd, "#!/bin/sh\n"); - fwrite($fd, $carp_cmd . "\n"); - fwrite($fd, "/sbin/ifconfig {$carpint} up\n"); - - mwexec("/bin/sh /tmp/carp.sh"); - } else if($vip['mode'] == "carpdev-dhcp") { - log_error("Found carpdev interface {$vip['interface']}"); - $interface = convert_friendly_interface_to_real_interface_name($vip['interface']); - if($interface) { - mwexec("ifconfig {$carpint} carpdev $interface"); - mwexec("/sbin/ifconfig {$carpint} vhid " . $vip['vhid'] . " advskew " . $vip['advskew'] . $password); - mwexec("/sbin/ifconfig {$carpint} up"); - sleep(1); - mwexec("/sbin/dhclient -b {$carpint}"); + $dhclientconf = ""; + + $dhclientconf .= <<<EOD +interface "{$carpint}" { +timeout 60; +retry 1; +select-timeout 0; +initial-interval 1; +script "/sbin/dhclient-script"; +} + +EOD; + + fwrite($fd, $dhclientconf); + fclose($fd); + + /* fire up dhclient */ + mwexec("/sbin/dhclient -c {$g['varetc_path']}/dhclient_{$carpint}.conf {$carpint} >/tmp/{$carpint}_output >/tmp/{$carpint}_error_output"); } else { - log_error("Could not determine CarpDEV parent interface for {$vip['descr']}."); + log_error("Error: cannot open dhclient_{$carpint}.conf in interfaces_carp_configure() for writing.\n"); + mwexec("/sbin/dhclient -b {$carpint}"); } + + + $fout = fopen("/tmp/ifconfig_{$carpint}","w"); + fwrite($fout, "/sbin/dhclient -c {$g['varetc_path']}/dhclient_{$carpint}.conf {$carpint}"); + + fclose($fout); + + } else { + log_error("Could not determine CarpDEV parent interface for {$vip['descr']}."); } - - usleep(10); - $carp_instances_counter++; - + usleep(10); + break; } - } - fclose($fd); + } - exec("/sbin/ifconfig > /tmp/after_carpinit"); if ($g['booting']) { unmute_kernel_msgs(); echo "done.\n"; @@ -907,33 +813,36 @@ function find_dhclient_process($interface) { return $pid; } -function interfaces_wan_configure() { +function interfaces_wan_configure($interface = "wan") { global $config, $g, $bridges_total; - $wancfg = $config['interfaces']['wan']; + $wancfg = $config['interfaces'][$interface]; + + $realif = get_real_wan_interface($interface); - if(file_exists("/tmp/{$config['interfaces']['wan']['if']}_router")) - unlink("/tmp/{$config['interfaces']['wan']['if']}_router"); + if(file_exists("/tmp/{$wancfg['if']}_router")) + unlink("/tmp/{$wancfg['if']}_router"); if(!$g['booting']) { mute_kernel_msgs(); /* find dhclient process for wan and kill it */ - killbypid(find_dhclient_process("wan")); + killbypid(find_dhclient_process($interface)); /* remove wanup file if it exists */ - unlink_if_exists("{$g['tmp_path']}/wanup"); + unlink_if_exists("{$g['tmp_path']}/{$interface}up"); /* kill PPPoE client (mpd) */ - killbypid("{$g['varrun_path']}/mpd.pid"); + killbypid("{$g['varrun_path']}/pppoe_{$interface}.pid"); + killbypid("{$g['varrun_path']}/pptp_{$interface}.pid"); /* wait for processes to die */ sleep(3); - unlink_if_exists("{$g['varetc_path']}/dhclient_wan.conf"); - unlink_if_exists("{$g['varetc_path']}/mpd.conf"); - unlink_if_exists("{$g['varetc_path']}/mpd.links"); - unlink_if_exists("{$g['vardb_path']}/wanip"); + unlink_if_exists("{$g['varetc_path']}/dhclient_{$interface}.conf"); + unlink_if_exists("{$g['varetc_path']}/mpd_{$interface}.conf"); + unlink_if_exists("{$g['varetc_path']}/mpd_{$interface}.links"); + unlink_if_exists("{$g['vardb_path']}/{$interface}ip"); unlink_if_exists("{$g['varetc_path']}/nameservers.conf"); } @@ -977,23 +886,23 @@ function interfaces_wan_configure() { switch ($wancfg['ipaddr']) { case 'carpdev-dhcp': - interfaces_wan_carpdev_dhcp_configure(); + interfaces_wan_carpdev_dhcp_configure($interface); break; case 'dhcp': - interfaces_wan_dhcp_configure(); + interfaces_wan_dhcp_configure($interface); break; case 'pppoe': - interfaces_wan_pppoe_configure(); + interfaces_wan_pppoe_configure($interface); break; case 'pptp': - interfaces_wan_pptp_configure(); + interfaces_wan_pptp_configure($interface); break; case 'bigpond': /* just configure DHCP for now; fire up bpalogin when we've got the lease */ - interfaces_wan_dhcp_configure(); + interfaces_wan_dhcp_configure($interface); break; default: @@ -1006,10 +915,11 @@ function interfaces_wan_configure() { escapeshellarg($wancfg['ipaddr'] . "/" . $wancfg['subnet'])); } - if($config['interfaces']['wan']['gateway']) - system("echo " . $config['interfaces']['wan']['gateway'] . " > /tmp/" . $config['interfaces']['wan']['if'] . "_router"); + if (is_ipaddr($wancfg['gateway'])) + system("echo " . $wancfg['gateway'] . " > /tmp/" . $wancfg['if'] . "_router"); /* resync pf (done automatically for DHCP/PPPoE/PPTP) */ + /* XXX: shouldn't the caller do this?! */ filter_configure(); } @@ -1021,32 +931,33 @@ function interfaces_wan_configure() { get_interface_arr(true); /* force all bridged interfaces to use same mtu */ - $mtu = get_interface_mtu($config['interfaces'][$wancfg['bridge']]['if']); + $bridgedif = get_real_wan_interface($wancfg['bridge']); + $mtu = get_interface_mtu($bridgedif); mwexec("/sbin/ifconfig {$wancfg['if']} mtu {$mtu}"); - mwexec("/sbin/ifconfig {$config['interfaces'][$wancfg['bridge']]['if']} mtu {$mtu}"); + mwexec("/sbin/ifconfig {$bridgedif} mtu {$mtu}"); /* assign items to a bridge */ - mwexec("/sbin/ifconfig bridge{$bridges_total} addm {$wancfg['if']} addm {$config['interfaces'][$wancfg['bridge']]['if']}"); + mwexec("/sbin/ifconfig bridge{$bridges_total} addm {$wancfg['if']} addm {$bridgedif}"); if(!is_interface_wireless($wancfg['if']) and - !is_interface_wireless($config['interfaces'][$wancfg['bridge']]['if'])) - mwexec("/sbin/ifconfig bridge{$bridges_total} stp {$config['interfaces'][$wancfg['bridge']]['if']} stp {$wancfg['if']}"); + !is_interface_wireless($bridgedif)) + mwexec("/sbin/ifconfig bridge{$bridges_total} stp {$bridgedif} stp {$wancfg['if']}"); /* log commands run for debugging in /tmp/ */ $fd = fopen("{$g['tmp_path']}/bridge_config_{$wancfg['if']}", "w"); fwrite($fd, "/sbin/ifconfig {$wancfg['if']} mtu {$mtu}\n"); - fwrite($fd, "/sbin/ifconfig {$config['interfaces'][$wancfg['bridge']]['if']} mtu {$mtu}\n"); + fwrite($fd, "/sbin/ifconfig {$bridgedif} mtu {$mtu}\n"); fwrite($fd, "/sbin/ifconfig bridge{$bridges_total} create\n"); - fwrite($fd, "/sbin/ifconfig bridge{$bridges_total} addm {$wancfg['if']} addm {$config['interfaces'][$wancfg['bridge']]['if']}\n"); + fwrite($fd, "/sbin/ifconfig bridge{$bridges_total} addm {$wancfg['if']} addm {$bridgedif}\n"); if(!is_interface_wireless($wancfg['if']) and - !is_interface_wireless($config['interfaces'][$wancfg['bridge']]['if'])) - fwrite($fd, "/sbin/ifconfig bridge{$bridges_total} stp {$wancfg['if']} stp {$config['interfaces'][$wancfg['bridge']]['if']}\n"); + !is_interface_wireless($bridgedif)) + fwrite($fd, "/sbin/ifconfig bridge{$bridges_total} stp {$wancfg['if']} stp {$bridgedif}\n"); fclose($fd); /* bring up interfaces */ mwexec("/sbin/ifconfig bridge{$bridges_total} down"); usleep(100); - mwexec("/sbin/ifconfig {$config['interfaces'][$wancfg['bridge']]['if']} up"); + mwexec("/sbin/ifconfig {$bridgedif} up"); usleep(5); mwexec("/sbin/ifconfig {$wancfg['if']} up"); usleep(5); @@ -1058,6 +969,7 @@ function interfaces_wan_configure() { find_number_of_created_bridges(true); } + /* XXX: Shouldn't the caller do this?! */ if (!$g['booting']) { /* reconfigure static routes (kernel may have deleted them) */ system_routing_configure(); @@ -1211,10 +1123,10 @@ EOD; return 0; } -function interfaces_wan_carpdev_dhcp_configure() { +function interfaces_wan_carpdev_dhcp_configure($interface = "wan") { global $config, $g; - $wancfg = $config['interfaces']['wan']; + $wancfg = $config['interfaces'][$interface]; $wanif = $wancfg['if']; /* bring wan interface up before starting dhclient */ mwexec("/sbin/ifconfig {$wanif} up"); @@ -1222,15 +1134,15 @@ function interfaces_wan_carpdev_dhcp_configure() { return 0; } -function interfaces_wan_dhcp_configure() { +function interfaces_wan_dhcp_configure($interface = "wan") { global $config, $g; - $wancfg = $config['interfaces']['wan']; + $wancfg = $config['interfaces'][$interface]; /* generate dhclient_wan.conf */ - $fd = fopen("{$g['varetc_path']}/dhclient_wan.conf", "w"); + $fd = fopen("{$g['varetc_path']}/dhclient_{$interface}.conf", "w"); if (!$fd) { - printf("Error: cannot open dhclient_wan.conf in interfaces_wan_dhcp_configure() for writing.\n"); + printf("Error: cannot open dhclient_{$interface}.conf in interfaces_wan_dhcp_configure() for writing.\n"); return 1; } @@ -1241,10 +1153,12 @@ function interfaces_wan_dhcp_configure() { $dhclientconf_hostname = ""; } - $dhclientconf = ""; + $wanif = get_real_wan_interface($interface); + $dhclientconf = ""; + $dhclientconf .= <<<EOD -interface "{$wancfg['if']}" { +interface "{$wanif}" { timeout 60; retry 1; select-timeout 0; @@ -1259,7 +1173,7 @@ if(is_ipaddr($wancfg['alias-address'])) { $subnetmask = gen_subnet_mask($wancfg['alias-subnet']); $dhclientconf .= <<<EOD alias { - interface "{$wancfg['if']}"; + interface "{$wanif}"; fixed-address {$wancfg['alias-address']}; option subnet-mask {$subnetmask}; } @@ -1269,24 +1183,24 @@ EOD; fwrite($fd, $dhclientconf); fclose($fd); - $wanif = $wancfg['if']; + $relwanif = $wancfg['if']; /* bring wan interface up before starting dhclient */ - mwexec("/sbin/ifconfig {$wanif} up"); + mwexec("/sbin/ifconfig {$realwanif} up"); /* fire up dhclient */ - mwexec("/sbin/dhclient -c {$g['varetc_path']}/dhclient_wan.conf {$wanif} >/tmp/{$wanif}_output >/tmp/{$wanif}_error_output"); + mwexec("/sbin/dhclient -c {$g['varetc_path']}/dhclient_{$interface}.conf {$wanif} >/tmp/{$wanif}_output >/tmp/{$wanif}_error_output"); $fout = fopen("/tmp/ifconfig_{$wanif}","w"); - fwrite($fout, "/sbin/dhclient -c {$g['varetc_path']}/dhclient_wan.conf {$wanif}"); + fwrite($fout, "/sbin/dhclient -c {$g['varetc_path']}/dhclient_{$interface}.conf {$wanif}"); fclose($fout); return 0; } -function interfaces_wan_dhcp_down() { +function interfaces_wan_dhcp_down($interface = "wan") { global $config; - $wancfg = $config['interfaces']['wan']; + $wancfg = $config['interfaces'][$interface]; $wanif = $wancfg['if']; mwexec("/sbin/ifconfig {$wanif} delete"); sleep(1); @@ -1303,35 +1217,34 @@ function interfaces_dhcp_down($interface) { mwexec("kill {$pid}"); } -function interfaces_dhcp_up($interface) { +function interfaces_dhcp_up($interface = "wan") { interfaces_dhcp_configure($interface); sleep(1); } -function interfaces_wan_dhcp_up() { - interfaces_wan_dhcp_configure(); +function interfaces_wan_dhcp_up($interface = "wan") { + interfaces_wan_dhcp_configure($interface); sleep(1); } -function interfaces_wan_pppoe_configure() { +function interfaces_wan_pppoe_configure($interface = "wan") { global $config, $g; - $wancfg = $config['interfaces']['wan']; - $pppoecfg = $config['pppoe']; + $wancfg = $config['interfaces'][$interface]; /* generate mpd.conf */ - $fd = fopen("{$g['varetc_path']}/mpd.conf", "w"); + $fd = fopen("{$g['varetc_path']}/mpd_{$interface}.conf", "w"); if (!$fd) { - printf("Error: cannot open mpd.conf in interfaces_wan_pppoe_configure().\n"); + printf("Error: cannot open mpd_{$interface}.conf in interfaces_wan_pppoe_configure().\n"); return 1; } $idle = 0; - if (isset($pppoecfg['ondemand'])) { + if (isset($wancfg['ondemand'])) { $ondemand = "enable"; - if ($pppoecfg['timeout']) - $idle = $pppoecfg['timeout']; + if ($wancfg['timeout']) + $idle = $wancfg['timeout']; } else { $ondemand = "disable"; } @@ -1339,28 +1252,38 @@ function interfaces_wan_pppoe_configure() { $mpdconf = <<<EOD startup: pppoeclient: - new -i pppoe0 pppoeclient pppoeclient - set iface route default - set iface {$ondemand} on-demand - set iface idle {$idle} - set iface up-script /usr/local/sbin/ppp-linkup EOD; - /* Check for ppp-linkdown Script in /usr/local/sbin - * Create reference in mpd.conf - */ - if ( file_exists("/usr/local/sbin/ppp-linkdown") ){ + if ($interface == "wan") + $realif = "pppoe0"; + else { + // Here code assumes only that strings of form "opt#" will be passed. + $realif = "pppoe" . substr($interface, 3); + } + + $mpdconf .= <<<EOD + new -i {$realif} pppoeclient pppoeclient + +EOD; + if ($interface == "wan") $mpdconf .= <<<EOD + set iface route default + +EOD; + + $mpdconf .= <<<EOD + set iface {$ondemand} on-demand + set iface idle {$idle} + set iface up-script /usr/local/sbin/ppp-linkup set iface down-script /usr/local/sbin/ppp-linkdown EOD; - } - if (isset($pppoecfg['ondemand'])) { - if (isset($pppoecfg['local-ip']) && isset($pppoecfg['remote-ip'])) { + if (isset($wancfg['ondemand'])) { + if (isset($wancfg['local-ip']) && isset($wancfg['remote-ip'])) { $mpdconf .= <<<EOD - set iface addrs {$pppoecfg['local-ip']} {$pppoecfg['remote-ip']} + set iface addrs {$wancfg['local-ip']} {$wancfg['remote-ip']} EOD; } else { @@ -1373,8 +1296,8 @@ EOD; $mpdconf .= <<<EOD set bundle disable multilink - set auth authname "{$pppoecfg['username']}" - set auth password "{$pppoecfg['password']}" + set auth authname "{$wancfg['username']}" + set auth password "{$wancfg['password']}" set link keep-alive 10 60 set link max-redial 0 set link no acfcomp protocomp @@ -1393,7 +1316,7 @@ EOD; EOD; } - if (!isset($config['pppoe']['dnsnosec'])) { + if (!isset($wancfg['dnsnosec'])) { $mpdconf .= <<<EOD set ipcp enable req-sec-dns @@ -1409,9 +1332,9 @@ EOD; fclose($fd); /* generate mpd.links */ - $fd = fopen("{$g['varetc_path']}/mpd.links", "w"); + $fd = fopen("{$g['varetc_path']}/mpd_{$interface}.links", "w"); if (!$fd) { - printf("Error: cannot open mpd.links in interfaces_wan_pppoe_configure().\n"); + printf("Error: cannot open mpd_{$interface}.links in interfaces_wan_pppoe_configure().\n"); return 1; } @@ -1419,7 +1342,7 @@ EOD; pppoeclient: set link type pppoe set pppoe iface {$wancfg['if']} - set pppoe service "{$pppoecfg['provider']}" + set pppoe service "{$wancfg['provider']}" set pppoe enable originate set pppoe disable incoming @@ -1428,16 +1351,16 @@ EOD; fwrite($fd, $mpdconf); fclose($fd); - if(file_exists("{$g['varrun_path']}/mpdpppoe.pid") and $g['booting']) { + if(file_exists("{$g['varrun_path']}/pppoe_{$interface}.pid") and $g['booting']) { /* if we are booting and mpd has already been started then don't start again. */ } else { /* if mpd is active, lets take it down */ - if(file_exists("{$g['varrun_path']}/mpdpppoe.pid")) { - killbypid("{$g['varrun_path']}/mpdpppoe.pid"); + if(file_exists("{$g['varrun_path']}/pppoe_{$interface}.pid")) { + killbypid("{$g['varrun_path']}/pppoe_{$interface}.pid"); sleep(3); } /* fire up mpd */ - mwexec("/usr/local/sbin/mpd4 -b -d {$g['varetc_path']} -p {$g['varrun_path']}/mpdpppoe.pid pppoeclient"); + mwexec("/usr/local/sbin/mpd4 -b -d {$g['varetc_path']} -f mpd_{$interface}.conf -l mpd_{$interface}.links -p {$g['varrun_path']}/pppoe_{$interface}.pid pppoeclient"); } /* sleep until wan is up - or 30 seconds, whichever comes first */ @@ -1453,68 +1376,78 @@ EOD; return 0; } -function interfaces_wan_pppoe_restart() { - interfaces_wan_pppoe_down(); +function interfaces_wan_pppoe_restart($interface = "wan") { + interfaces_wan_pppoe_down($interface); sleep(1); - interfaces_wan_pppoe_up(); + interfaces_wan_pppoe_up($interface); } -function interfaces_wan_pppoe_down() { +function interfaces_wan_pppoe_down($interface = "wan") { global $g; - sigkillbypid("{$g['varrun_path']}/mpdpppoe.pid", "SIGUSR2"); + sigkillbypid("{$g['varrun_path']}/pppoe_{$interface}.pid", "SIGUSR2"); sleep(1); } -function interfaces_wan_pppoe_up() { +function interfaces_wan_pppoe_up($interface = "wan") { global $g; - sigkillbypid("{$g['varrun_path']}/mpdpppoe.pid", "SIGUSR1"); + sigkillbypid("{$g['varrun_path']}/pppoe_{$interface}.pid", "SIGUSR1"); sleep(1); } -function interfaces_wan_pptp_configure() { +function interfaces_wan_pptp_configure($interface) { global $config, $g; - $wancfg = $config['interfaces']['wan']; - $pptpcfg = $config['pptp']; + $wancfg = $config['interfaces'][$interface]; /* generate mpd.conf */ - $fd = fopen("{$g['varetc_path']}/mpd.conf", "w"); + $fd = fopen("{$g['varetc_path']}/mpd_{$interface}.conf", "w"); if (!$fd) { - printf("Error: cannot open mpd.conf in interfaces_wan_pptp_configure().\n"); + printf("Error: cannot open mpd_{$interface}.conf in interfaces_wan_pptp_configure().\n"); return 1; } $idle = 0; - if (isset($pptpcfg['ondemand'])) { + if (isset($wancfg['ondemand'])) { $ondemand = "enable"; - if ($pptpcfg['timeout']) - $idle = $pptpcfg['timeout']; + if ($wancfg['timeout']) + $idle = $wancfg['timeout']; } else { $ondemand = "disable"; } $mpdconf = <<<EOD +startup: pptp: - new -i pptp0 pptp pptp - set iface route default - set iface {$ondemand} on-demand - set iface idle {$idle} - set iface up-script /usr/local/sbin/ppp-linkup EOD; - /* Check for ppp-linkdown Script in /usr/local/sbin - * Create reference in mpd.conf - */ - if ( file_exists("/usr/local/sbin/ppp-linkdown") ){ - $mpdconf .= <<<EOD + if ($interface == "wan") + $realif = "pptp0"; + else { + // Here code assumes only that strings of form "opt#" will be passed. + $realif = "pptp" . substr($interface, 3); + } + + $mpdconf .= <<<EOD + new -i {$realif} pptp pptp + +EOD; + if ($interface == "wan") + $mpdconf .= <<<EOD + set iface route default + +EOD; + + $mpdconf .= <<<EOD + set iface {$ondemand} on-demand + set iface idle {$idle} + set iface up-script /usr/local/sbin/ppp-linkup set iface down-script /usr/local/sbin/ppp-linkdown EOD; - } - if (isset($pptpcfg['ondemand'])) { + if (isset($wanfg['ondemand'])) { $mpdconf .= <<<EOD set iface addrs 10.0.0.1 10.0.0.2 @@ -1523,8 +1456,8 @@ EOD; $mpdconf .= <<<EOD set bundle disable multilink - set bundle authname "{$pptpcfg['username']}" - set bundle password "{$pptpcfg['password']}" + set bundle authname "{$wancfg['username']}" + set bundle password "{$wancfg['password']}" set bundle no noretry set link keep-alive 10 60 set link max-redial 0 @@ -1551,9 +1484,9 @@ EOD; fclose($fd); /* generate mpd.links */ - $fd = fopen("{$g['varetc_path']}/mpd.links", "w"); + $fd = fopen("{$g['varetc_path']}/mpd_{$interface}.links", "w"); if (!$fd) { - printf("Error: cannot open mpd.links in interfaces_wan_pptp_configure().\n"); + printf("Error: cannot open mpd_{$interface}.links in interfaces_wan_pptp_configure().\n"); return 1; } @@ -1562,8 +1495,8 @@ pptp: set link type pptp set pptp enable originate outcall set pptp disable windowing - set pptp self {$pptpcfg['local']} - set pptp peer {$pptpcfg['remote']} + set pptp self {$wancfg['local']} + set pptp peer {$wancfg['remote']} EOD; @@ -1572,29 +1505,29 @@ EOD; /* configure interface */ mwexec("/sbin/ifconfig " . escapeshellarg($wancfg['if']) . " " . - escapeshellarg($pptpcfg['local'] . "/" . $pptpcfg['subnet'])); + escapeshellarg($wancfg['local'] . "/" . $wancfg['subnet']) . " up"); /* fire up mpd */ - mwexec("/usr/local/sbin/mpd -b -d {$g['varetc_path']} -p {$g['varrun_path']}/mpd.pid pptp"); + mwexec("/usr/local/sbin/mpd4 -b -d {$g['varetc_path']} -f mpd_{$interface}.conf -l mpd_{$interface}.links -p {$g['varrun_path']}/pptp_{$interface}.pid pptp"); return 0; } -function interfaces_wan_pptp_restart() { - interfaces_wan_pptp_down(); +function interfaces_wan_pptp_restart($interface = "wan") { + interfaces_wan_pptp_down($interface); sleep(1); - interfaces_wan_pptp_up(); + interfaces_wan_pptp_up($interface); } -function interfaces_wan_pptp_down() { +function interfaces_wan_pptp_down($interface = "wan") { global $g; - sigkillbypid("{$g['varrun_path']}/mpd.pid", "SIGUSR2"); + sigkillbypid("{$g['varrun_path']}/pptp_{$interface}.pid", "SIGUSR2"); sleep(1); } -function interfaces_wan_pptp_up() { +function interfaces_wan_pptp_up($interface = "wan") { global $g; - sigkillbypid("{$g['varrun_path']}/mpd.pid", "SIGUSR1"); + sigkillbypid("{$g['varrun_path']}/pptp_{$interface}.pid", "SIGUSR1"); sleep(1); } @@ -1654,47 +1587,97 @@ EOD; return 0; } -function get_real_wan_interface() { - global $config, $g; +function get_real_wan_interface($interface = "wan") { + global $config; - $wancfg = $config['interfaces']['wan']; + $wanif = $interface; - if($config['interfaces']['wan']['ipaddr'] == "carpdev-dhcp") { - $viparr = &$config['virtualip']['vip']; - $counter = 0; - if(is_array($viparr)) - foreach ($viparr as $vip) { - if ($vip['mode'] == "carpdev-dhcp") { - if($vip['interface'] == "wan") { - if($counter == 0) - $wanif = ""; - return "carp{$counter}"; + switch ($interface) { + case "pptp": + $wanif = "pptp"; + break; + case "pppoe": + $wanif = "pppoe"; + break; + case "openvpn": + $wanif = "openvpn"; + break; + case "enc0": + $wanif = "enc0"; + break; + /* XXX: dial in support?! + case "ppp": + $wanif = "ppp"; + break; + */ + default: + $iflist = get_configured_interface_with_descr(); + + foreach ($iflist as $if => $ifdesc) { + if ($interface == $if || $interface == $ifdesc) { + + $cfg = $config['interfaces'][$if]; + + switch ($cfg['ipaddr']) { + case "carpdev-dhcp": + $viparr = &$config['virtualip']['vip']; + $counter = 0; + if(is_array($viparr)) + foreach ($viparr as $vip) { + if ($vip['mode'] == "carpdev-dhcp") { + if($vip['interface'] == $if) { + $wanif = "carp{$counter}"; + break; + } + $counter++; + } else if ($vip['mode'] = "carp") + $counter++; } - $counter++; + break; + case "pppoe": + if ($if == "wan") + $wanif = "pppoe0"; + else + $wanif = "pppoe" . substr($if,3); + break; + case "pptp": + if ($if == "wan") + $wanif = "pptp0"; + else + $wanif = "pptp" . substr($if, 3); + break; + default: + if (isset($cfg['ispointtopoint']) && $cfg['pointtopoint']) + $wanif = "ppp0"; // XXX: PPP needs to convert to mpd + else + $wanif = $cfg['if']; + break; + } + + break; } } + break; } - $wanif = $wancfg['if']; - if ($wancfg['ipaddr'] == "pppoe") - $wanif = "pppoe0"; - if ($wancfg['ipaddr'] == "pptp") - $wanif = "pptp0"; - - return $wanif; + return $wanif; } function get_current_wan_address($interface = "wan") { global $config, $g; - $wancfg = $config['interfaces'][$interface]; + $realif = get_real_wan_interface($interface); + /* Do we really come here for these interfaces ?! */ + if (in_array($realif, array("pptp", "pppoe", "openvpn", "enc0" /* , "ppp" */))) + return ""; - $interface = filter_translate_type_to_real_interface($interface); + $wancfg = $config['interfaces'][$interface]; $ifinfo = ""; - if(in_array($wancfg['ipaddr'], array('dhcp'))) { + switch ($wancfg['ipaddr']) { + case "dhcp": /* get interface info with netstat */ - exec("/usr/bin/netstat -nWI " . escapeshellarg($interface) . " -f inet", $ifinfo); + exec("/usr/bin/netstat -nWI " . escapeshellarg($realif) . " -f inet", $ifinfo); if (isset($ifinfo[1])) { $aif = preg_split("/\s+/", $ifinfo[1]); @@ -1705,13 +1688,12 @@ function get_current_wan_address($interface = "wan") { } return null; - } else if (in_array($wancfg['ipaddr'], array('pppoe','pptp','bigpond'))) { - /* dynamic WAN IP address, find out which one */ - $wanif = get_real_wan_interface(); - + break; + case "pppoe": + case "pptp": + case "bigpond": /* get interface info with netstat */ - exec("/usr/bin/netstat -nWI " . escapeshellarg($wanif) . " -f inet", $ifinfo); - + exec("/usr/bin/netstat -nWI " . escapeshellarg($realif) . " -f inet", $ifinfo); if (isset($ifinfo[1])) { $aif = preg_split("/\s+/", $ifinfo[1]); $curwanip = chop($aif[3]); @@ -1721,26 +1703,42 @@ function get_current_wan_address($interface = "wan") { } return null; - } else { - if($wancfg['ipaddr'] == "carpdev-dhcp") { - /* carpdev support on WAN */ - if($config['interfaces']['wan']['ipaddr'] == "carpdev-dhcp") { - $viparr = &$config['virtualip']['vip']; - $counter = 0; - if(is_array($viparr)) - foreach ($viparr as $vip) { - if ($vip['mode'] == "carpdev-dhcp") { - if($vip['interface'] == "wan") - return str_replace("\n", "", `ifconfig carp{$counter} | grep inet | awk '{ print $2 }'`); - $counter++; - } + break; + /* carpdev support */ + case "carpdev-dhcp": + $viparr = &$config['virtualip']['vip']; + $counter = 0; + if (is_array($viparr)) + foreach ($viparr as $vip) { + if ($vip['mode'] == "carpdev-dhcp" && + $vip['interface'] == $interface) { + return str_replace("\n", "", `ifconfig carp{$counter} | grep inet | awk '{ print $2 }'`); + $counter++; + } else if ($vip['mode'] == "carp") + $counter++; } - } + return null; + break; + default: + if (isset($cfg['ispointtopoint']) && $cfg['pointtopoint']) { + /* get interface info with netstat */ + exec("/usr/bin/netstat -nWI " . escapeshellarg($realif) . " -f inet", $ifinfo +); + if (isset($ifinfo[1])) { + $aif = preg_split("/\s+/", $ifinfo[1]); + $curwanip = chop($aif[3]); + + if ($curwanip && is_ipaddr($curwanip) && ($curwanip != "0.0.0.0")) + return $curwanip; + } + + return null; } - - /* static WAN IP address */ - return $wancfg['ipaddr']; + break; } + + /* static WAN IP address */ + return $wancfg['ipaddr']; } /****f* interfaces/is_altq_capable |