From a98d776fa4ff04d616e46b45a3bc60f8c1407269 Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Wed, 16 Jun 2021 16:18:50 +0200 Subject: [PATCH] Interfaces / Hardware settings - Overwite global settings, closes https://github.com/opnsense/core/issues/5050 --- src/etc/inc/interfaces.lib.inc | 32 +++++++---- src/www/interfaces.php | 102 +++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+), 11 deletions(-) diff --git a/src/etc/inc/interfaces.lib.inc b/src/etc/inc/interfaces.lib.inc index 9ca22ab99..cc4c59470 100644 --- a/src/etc/inc/interfaces.lib.inc +++ b/src/etc/inc/interfaces.lib.inc @@ -385,11 +385,21 @@ function legacy_interface_details($intf) function configure_interface_hardware($ifs) { global $config; + $hwsettings = $config['system']; if (stristr($ifs, "_vlan")) { /* skip vlans for checksumming */ return; } $intf_details = legacy_interface_details($ifs); + // interface overwrites + foreach ($config['interfaces'] as $iface => $ifconf) { + if (!empty($ifconf['if']) && $ifconf['if'] == $ifs) { + if (!empty($ifconf['hw_settings_overwrite'])) { + $hwsettings = $ifconf; + } + break; + } + } if (!empty($intf_details)) { // get current settings $csum_set = in_array('rxcsum', $intf_details['options']) || in_array('txcsum', $intf_details['options']); @@ -398,33 +408,33 @@ function configure_interface_hardware($ifs) $lro_set = in_array('lro', $intf_details['options']); // hardware checksum offloading offloading - if (isset($config['system']['disablechecksumoffloading']) && $csum_set) { + if (isset($hwsettings['disablechecksumoffloading']) && $csum_set) { legacy_interface_flags($ifs, '-txcsum -rxcsum', false); - } elseif (!isset($config['system']['disablechecksumoffloading']) && !$csum_set) { + } elseif (!isset($hwsettings['disablechecksumoffloading']) && !$csum_set) { legacy_interface_flags($ifs, 'txcsum rxcsum', false); } - if (isset($config['system']['disablechecksumoffloading']) && $csumv6_set) { + if (isset($hwsettings['disablechecksumoffloading']) && $csumv6_set) { legacy_interface_flags($ifs, '-txcsum6 -rxcsum6', false); - } elseif (!isset($config['system']['disablechecksumoffloading']) && !$csumv6_set) { + } elseif (!isset($hwsettings['disablechecksumoffloading']) && !$csumv6_set) { legacy_interface_flags($ifs, 'txcsum6 rxcsum6', false); } // TCP segmentation offloading - if (isset($config['system']['disablesegmentationoffloading']) && $tso_set) { + if (isset($hwsettings['disablesegmentationoffloading']) && $tso_set) { legacy_interface_flags($ifs, '-tso', false); - } elseif (!isset($config['system']['disablesegmentationoffloading']) && !$tso_set) { + } elseif (!isset($hwsettings['disablesegmentationoffloading']) && !$tso_set) { legacy_interface_flags($ifs, 'tso', false); } // large receive offload - if (isset($config['system']['disablelargereceiveoffloading']) && $lro_set) { + if (isset($hwsettings['disablelargereceiveoffloading']) && $lro_set) { legacy_interface_flags($ifs, '-lro', false); - } elseif (!isset($config['system']['disablelargereceiveoffloading']) && !$lro_set) { + } elseif (!isset($hwsettings['disablelargereceiveoffloading']) && !$lro_set) { legacy_interface_flags($ifs, 'lro', false); } // disable/enable hardware vlan tags, will be skipped when "Leave default" (option 2) is selected - if (!isset($config['system']['disablevlanhwfilter']) || $config['system']['disablevlanhwfilter'] == 1) { + if (!isset($hwsettings['disablevlanhwfilter']) || $hwsettings['disablevlanhwfilter'] == 1) { // probe already selected options $selected_opts = array(); if (!empty($intf_details['options'])) { @@ -438,9 +448,9 @@ function configure_interface_hardware($ifs) } // set one tag at a time to avoid driver issues foreach (array('vlanhwtag', 'vlanhwfilter', 'vlanhwtso', 'vlanhwcsum') as $tag) { - if (!isset($config['system']['disablevlanhwfilter']) && !in_array($tag, $selected_opts)) { + if (!isset($hwsettings['disablevlanhwfilter']) && !in_array($tag, $selected_opts)) { legacy_interface_flags($ifs, $tag); - } elseif (isset($config['system']['disablevlanhwfilter']) && in_array($tag, $selected_opts)) { + } elseif (isset($hwsettings['disablevlanhwfilter']) && in_array($tag, $selected_opts)) { legacy_interface_flags($ifs, '-' . $tag); } } diff --git a/src/www/interfaces.php b/src/www/interfaces.php index 30a95ff65..c078c1a4d 100644 --- a/src/www/interfaces.php +++ b/src/www/interfaces.php @@ -388,6 +388,11 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { 'subnetv6', 'track6-interface', 'track6-prefix-id', + 'hw_settings_overwrite', + 'disablechecksumoffloading', + 'disablesegmentationoffloading', + 'disablelargereceiveoffloading', + 'disablevlanhwfilter', ); foreach ($std_copy_fieldnames as $fieldname) { $pconfig[$fieldname] = isset($a_interfaces[$if][$fieldname]) ? $a_interfaces[$if][$fieldname] : null; @@ -1307,6 +1312,22 @@ if ($_SERVER['REQUEST_METHOD'] === 'GET') { // quite obscure this... copies parts of the config interface_sync_wireless_clones($new_config, true); } + // hardware (offloading) Settings + if (!empty($pconfig['hw_settings_overwrite'])) { + $new_config['hw_settings_overwrite'] = true; + if (!empty($pconfig['disablechecksumoffloading'])) { + $new_config['disablechecksumoffloading'] = true; + } + if (!empty($pconfig['disablesegmentationoffloading'])) { + $new_config['disablesegmentationoffloading'] = true; + } + if (!empty($pconfig['disablelargereceiveoffloading'])) { + $new_config['disablelargereceiveoffloading'] = true; + } + if (!empty($pconfig['disablevlanhwfilter'])) { + $new_config['disablevlanhwfilter'] = $pconfig['disablevlanhwfilter']; + } + } if (count($new_ppp_config) > 0) { // ppp details changed @@ -1699,6 +1720,15 @@ include("head.inc"); }); $("#mtu").change(); + // toggle hardware settings visibility + $("#hw_settings_overwrite").change(function(){ + if ($("#hw_settings_overwrite").is(':checked')) { + $(".hw_settings_overwrite").show(); + } else { + $(".hw_settings_overwrite").hide(); + } + }).change(); + window_highlight_table_option(); }); @@ -1913,6 +1943,78 @@ include("head.inc"); + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ /> + +
+
+