summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErmal <eri@pfsense.org>2013-12-27 20:05:08 +0000
committerErmal <eri@pfsense.org>2013-12-27 20:37:34 +0000
commit53555bf2f796cd53cf649410fe1827a9a45fc4a7 (patch)
tree1c2085db98a127c04f1d33abf7d53df4530c0440
parent1a4ef44e5c86e1dd480b8abe40b9483bbdb3e8d3 (diff)
downloadpfsense-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.inc152
-rwxr-xr-xusr/local/www/interfaces.php6
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 {
OpenPOWER on IntegriCloud