From 4ff07cad6382e32191beeabbb6eea9f94e8e80ae Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Fri, 14 Jul 2017 16:38:12 +0200 Subject: [PATCH] lagg interfaces, restructure interface_lagg_configure() and add mtu option, for https://github.com/opnsense/core/issues/1709 --- src/etc/inc/interfaces.inc | 45 ++++++++++++++++++++------------ src/www/interfaces_lagg_edit.php | 14 ++++++++++ 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/etc/inc/interfaces.inc b/src/etc/inc/interfaces.inc index 5614dae21..aefc6e92c 100644 --- a/src/etc/inc/interfaces.inc +++ b/src/etc/inc/interfaces.inc @@ -704,34 +704,47 @@ function interface_lagg_configure(&$lagg) if (!count($members)) { return -1; } + $interface_stats = legacy_interfaces_details(); - if (file_exists("/var/run/booting") || !(empty($lagg['laggif']))) { - legacy_interface_destroy($lagg['laggif']); - legacy_interface_create($lagg['laggif']); + if (!empty($lagg['laggif'])) { $laggif = $lagg['laggif']; + if (empty($interface_stats[$laggif])) { + legacy_interface_create($lagg['laggif']); + } else { + // Already configured, detach child interfaces before attempting to configure. + // Prevents vlans to loose parent. + if (!empty($interface_stats[$laggif]['laggport'])) { + foreach ($interface_stats[$laggif]['laggport'] as $laggport) { + mwexec("/sbin/ifconfig {$laggif} -laggport {$laggport}"); + } + } + } } else { $laggif = legacy_interface_create('lagg'); } - /* Calculate smaller mtu and enforce it */ + + // determine mtu value to use, either the provided one for the lagg or smallest of it's children $mtu = null; - foreach ($members as $member) { - $opts = legacy_interface_stats($member); - if (!empty($opts['mtu']) && ($mtu == null || $opts['mtu'] < $mtu)) { - $mtu = $opts['mtu']; + if (!empty($lagg['mtu'])) { + // mtu provided for lagg + $mtu = $lagg['mtu']; + } else { + // min() mtu of children + foreach ($members as $member) { + if (!empty($interface_stats[$member]['mtu']) && ($mtu == null || $interface_stats[$member]['mtu'] < $mtu)) { + $mtu = $interface_stats[$member]['mtu']; + } } } - $checklist = get_interface_list(); foreach ($members as $member) { - if (!array_key_exists($member, $checklist)) { - continue; + if (!empty($interface_stats[$member])) { + legacy_interface_mtu($member, $mtu); + configure_interface_hardware($member); + interfaces_bring_up($member); + mwexec("/sbin/ifconfig {$laggif} laggport {$member}"); } - - legacy_interface_mtu($member, $mtu); - configure_interface_hardware($member); - interfaces_bring_up($member); - mwexec("/sbin/ifconfig {$laggif} laggport {$member}"); } mwexec("/sbin/ifconfig {$laggif} laggproto " . escapeshellarg($lagg['proto'])); diff --git a/src/www/interfaces_lagg_edit.php b/src/www/interfaces_lagg_edit.php index 184328511..3e107f282 100644 --- a/src/www/interfaces_lagg_edit.php +++ b/src/www/interfaces_lagg_edit.php @@ -93,6 +93,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { $pconfig['proto'] = isset($a_laggs[$id]['proto']) ? $a_laggs[$id]['proto'] : null; $pconfig['descr'] = isset($a_laggs[$id]['descr']) ? $a_laggs[$id]['descr'] : null; $pconfig['lacp_fast_timeout'] = !empty($a_laggs[$id]['lacp_fast_timeout']); + $pconfig['mtu'] = isset($a_laggs[$id]['mtu']) ? $a_laggs[$id]['mtu'] : null; } elseif ($_SERVER['REQUEST_METHOD'] === 'POST') { // validate and save form data if (!empty($a_laggs[$_POST['id']])) { @@ -118,6 +119,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { if (!in_array($pconfig['proto'], $laggprotos)) { $input_errors[] = gettext("Protocol supplied is invalid"); } + if (!empty($pconfig['mtu']) && ($pconfig['mtu'] < 576 || $pconfig['mtu'] > 9000)) { + $input_errors[] = gettext("The MTU must be greater than 576 bytes and less than 9000."); + } if (count($input_errors) == 0) { $lagg = array(); @@ -125,6 +129,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { $lagg['descr'] = $pconfig['descr']; $lagg['laggif'] = $pconfig['laggif']; $lagg['proto'] = $pconfig['proto']; + $lagg['mtu'] = $pconfig['mtu']; $lagg['lacp_fast_timeout'] = !empty($pconfig['lacp_fast_timeout']); if (isset($id)) { $lagg['laggif'] = $a_laggs[$id]['laggif']; @@ -282,6 +287,15 @@ legacy_html_escape_form_data($pconfig); + + + + + + +