diff options
-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 { |