diff options
author | Ermal <eri@pfsense.org> | 2013-12-27 20:05:08 +0000 |
---|---|---|
committer | Ermal <eri@pfsense.org> | 2013-12-27 20:37:34 +0000 |
commit | 53555bf2f796cd53cf649410fe1827a9a45fc4a7 (patch) | |
tree | 1c2085db98a127c04f1d33abf7d53df4530c0440 | |
parent | 1a4ef44e5c86e1dd480b8abe40b9483bbdb3e8d3 (diff) | |
download | pfsense-53555bf2f796cd53cf649410fe1827a9a45fc4a7.zip pfsense-53555bf2f796cd53cf649410fe1827a9a45fc4a7.tar.gz |
Make sense of interface mtu handling code. No need to do unneeded operations. This fixes slow boot times and proper handling of mtu for vlans though some work or better model is needed for other interface types.
-rw-r--r-- | etc/inc/interfaces.inc | 152 | ||||
-rwxr-xr-x | usr/local/www/interfaces.php | 6 |
2 files changed, 51 insertions, 107 deletions
diff --git a/etc/inc/interfaces.inc b/etc/inc/interfaces.inc index cd1732c..f4456c7 100644 --- a/etc/inc/interfaces.inc +++ b/etc/inc/interfaces.inc @@ -2772,14 +2772,13 @@ function find_dhcp6c_process($interface) { function interface_vlan_mtu_configured($realhwif, $mtu) { global $config; - if (is_array($config['vlans']['vlan'])) { + if (is_array($config['vlans']) && is_array($config['vlans']['vlan'])) { foreach ($config['vlans']['vlan'] as $vlan) { if ($vlan['if'] != $realhwif) continue; $assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']); - if (!empty($assignedport)) { - $portmtu = $config['interfaces'][$assignedport]['mtu']; - if (!empty($portmtu) && $portmtu > $mtu) + if (!empty($assignedport) && !empty($config['interfaces'][$assignedport]['mtu'])) { + if (intval($config['interfaces'][$assignedport]['mtu'])> $mtu) $mtu = $portmtu; } } @@ -2788,6 +2787,33 @@ function interface_vlan_mtu_configured($realhwif, $mtu) { return $mtu; } +function interface_vlan_adapt_mtu($vlanifs, $mtu) { + global $config; + + if (!is_array($vlanifs)) + return; + + /* All vlans need to use the same mtu value as their parent. */ + foreach ($vlanifs as $vlan) { + $assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']); + if (!empty($assignedport)) { + if (!empty($config['interfaces'][$assignedport]['mtu'])) { + /* + * XXX: This is really never going to happen just keep the code for safety and readbility. + * It never happens since interface_vlan_mtu_configured finds the biggest mtu on vlans. + * Also if it has a lower mtu configured just respect user choice. + */ + if (intval($config['interfaces'][$assignedport]['mtu']) > $mtu) + pfSense_interface_mtu($vlan['vlanif'], $mtu); + } else { + if (get_interface_mtu($vlan['vlanif']) != $mtu) + pfSense_interface_mtu($vlan['vlanif'], $mtu); + } + } else if (get_interface_mtu($vlan['vlanif']) != $mtu) + pfSense_interface_mtu($vlan['vlanif'], $mtu); + } +} + function interface_configure($interface = "wan", $reloadall = false, $linkupevent = false) { global $config, $g; global $interface_sn_arr_cache, $interface_ip_arr_cache; @@ -2988,115 +3014,33 @@ function interface_configure($interface = "wan", $reloadall = false, $linkupeven break; } - $mtu = get_interface_default_mtu(remove_ifindex($realhwif)); - $assignedparent = convert_real_interface_to_friendly_interface_name($realhwif); - if (!empty($assignedparent) && !empty($config['interfaces'][$assignedparent]['mtu'])) - $mtu = $config['interfaces'][$assignedparent]['mtu']; - - $vlanifs = link_interface_to_vlans($realhwif); - if (empty($vlanifs)) - $vlanifs = array(); - if (!empty($wancfg['mtu'])) { if (stristr($realif, "_vlan")) { - if (!empty($assignedparent)) { + $assignedparent = convert_real_interface_to_friendly_interface_name($realhwif); + if (!empty($assignedparent) && !empty($config['interfaces'][$assignedparent]['mtu'])) $parentmtu = $config['interfaces'][$assignedparent]['mtu']; - if (empty($parentmtu)) - $parentmtu = interface_vlan_mtu_configured($realhwif, $wancfg['mtu']); - if ($wancfg['mtu'] > $parentmtu) { - if (get_interface_mtu($realhwif) != $wancfg['mtu']) - pfSense_interface_mtu($realhwif, $wancfg['mtu']); - - /* All vlans need to use the same mtu value as their parent. */ - foreach ($vlanifs as $vlan) { - if ($vlan['vlanif'] == $realif) - continue; - $assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']); - if (!empty($assignedport)) { - $portmtu = $config['interfaces'][$assignedport]['mtu']; - if (empty($portmtu) && (get_interface_mtu($vlan['vlanif']) != $wancfg['mtu'])) - pfSense_interface_mtu($vlan['vlanif'], $wancfg['mtu']); - } else if (get_interface_mtu($vlan['vlanif']) != $wancfg['mtu']) - pfSense_interface_mtu($vlan['vlanif'], $wancfg['mtu']); - } - } - } else { - /* Parent is not assigned, back to default */ - if (get_interface_mtu($realhwif) != $mtu) - pfSense_interface_mtu($realhwif, $mtu); + else + $parentmtu = interface_vlan_mtu_configured($realhwif, $wancfg['mtu']); - /* All vlans need to use the same mtu value as their parent. */ - foreach ($vlanifs as $vlan) { - if ($vlan['vlanif'] == $realif) - continue; - $assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']); - if (!empty($assignedport)) { - $portmtu = $config['interfaces'][$assignedport]['mtu']; - if (empty($portmtu) && (get_interface_mtu($vlan['vlanif']) != $mtu)) - pfSense_interface_mtu($vlan['vlanif'], $mtu); - } else if (get_interface_mtu($vlan['vlanif']) != $mtu) - pfSense_interface_mtu($vlan['vlanif'], $mtu); - } + if ($wancfg['mtu'] > $parentmtu) { + if (get_interface_mtu($realhwif) != $wancfg['mtu']) + pfSense_interface_mtu($realhwif, $wancfg['mtu']); - if (get_interface_mtu($realif) != $wancfg['mtu']) - pfSense_interface_mtu($realif, $wancfg['mtu']); - } + /* All vlans need to use the same mtu value as their parent. */ + interface_vlan_adapt_mtu(link_interface_to_vlans($realhwif), $wancfg['mtu']); + } else + pfSense_interface_mtu($realif, $wancfg['mtu']); } else { - foreach ($vlanifs as $vlan) { - $assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']); - if (empty($assignedport)) { - if (get_interface_mtu($vlan['vlanif']) != $wancfg['mtu']) - pfSense_interface_mtu($vlan['vlanif'], $wancfg['mtu']); - } else { - $vlanmtu = $config['interfaces'][$assignedport]['mtu']; - if ((empty($vlanmtu) || ($vlanmtu >= $wancfg['mtu'])) && (get_interface_mtu($vlan['vlanif']) != $wancfg['mtu'])) - pfSense_interface_mtu($vlan['vlanif'], $wancfg['mtu']); - } - } - } - if ($wancfg['mtu'] != get_interface_mtu($realif)) - pfSense_interface_mtu($realif, $wancfg['mtu']); - } else if (stristr($realif, "_vlan")) { - /* XXX: This is really dangerous for example with vlans changing their parent mtu! */ - $bigmtu = interface_vlan_mtu_configured($realhwif, $mtu); - if ($mtu < $bigmtu) - $mtu = $bigmtu; - - if (get_interface_mtu($realhwif) != $mtu) - pfSense_interface_mtu($realhwif, $mtu); - - /* All vlans need to use the same mtu value as their parent. */ - foreach ($vlanifs as $vlan) { - if ($vlan['vlanif'] == $realif) - continue; - $assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']); - if (!empty($assignedport)) { - $portmtu = $config['interfaces'][$assignedport]['mtu']; - if (empty($portmtu) && (get_interface_mtu($vlan['vlanif']) != $mtu)) - pfSense_interface_mtu($vlan['vlanif'], $mtu); - } else if (get_interface_mtu($vlan['vlanif']) != $mtu) - pfSense_interface_mtu($vlan['vlanif'], $mtu); - } - if (get_interface_mtu($realif) != $mtu) - pfSense_interface_mtu($realif, $mtu); - } else { - /* All vlans need to use the same mtu value as their parent. */ - foreach ($vlanifs as $vlan) { - $assignedport = convert_real_interface_to_friendly_interface_name($vlan['vlanif']); - if (!empty($assignedport)) { - $portmtu = $config['interfaces'][$assignedport]['mtu']; - if (empty($portmtu) && (get_interface_mtu($vlan['vlanif']) != $mtu)) - pfSense_interface_mtu($vlan['vlanif'], $mtu); - } else if (get_interface_mtu($vlan['vlanif']) != $mtu) - pfSense_interface_mtu($vlan['vlanif'], $mtu); + if ($wancfg['mtu'] != get_interface_mtu($realif)) + pfSense_interface_mtu($realif, $wancfg['mtu']); + + /* This case is needed when the parent of vlans is being configured */ + interface_vlan_adapt_mtu(link_interface_to_vlans($realif), $wancfg['mtu']); } - if ($mtu != get_interface_mtu($realhwif)) - pfSense_interface_mtu($realhwif, $mtu); + /* XXX: What about gre/gif/lagg/.. ? */ } - unset($vlanifs); - - if(does_interface_exist($wancfg['if'])) + if (does_interface_exist($wancfg['if'])) interfaces_bring_up($wancfg['if']); interface_netgraph_needed($interface); diff --git a/usr/local/www/interfaces.php b/usr/local/www/interfaces.php index 4b74997..922caa8 100755 --- a/usr/local/www/interfaces.php +++ b/usr/local/www/interfaces.php @@ -642,17 +642,17 @@ if ($_POST['apply']) { $input_errors[] = gettext("A valid MAC address must be specified."); if ($_POST['mtu']) { if ($_POST['mtu'] < 576 || $_POST['mtu'] > 9000) - $input_errors[] = gettext("The MTU must be greater than 576 bytes."); + $input_errors[] = gettext("The MTU must be greater than 576 bytes and less than 9000."); if (stristr($wancfg['if'], "_vlan")) { $realhwif_array = get_parent_interface($wancfg['if']); // Need code to handle MLPPP if we ever use $realhwif for MLPPP handling $parent_realhwif = $realhwif_array[0]; $parent_if = convert_real_interface_to_friendly_interface_name($parent_realhwif); - if (!empty($parent_if) && isset($config['interfaces'][$parent_if]['mtu'])) { + if (!empty($parent_if) && !empty($config['interfaces'][$parent_if]['mtu'])) { $parent_mtu = $config['interfaces'][$parent_if]['mtu']; - if ($_POST['mtu'] > $parent_mtu) + if ($_POST['mtu'] > intval($config['interfaces'][$parent_if]['mtu'])) $input_errors[] = gettext("MTU of a vlan should not be bigger than parent interface."); } } else { |