diff --git a/etc/inc/pfsense-utils.inc b/etc/inc/pfsense-utils.inc
index e3eef07354..8d2e894666 100644
--- a/etc/inc/pfsense-utils.inc
+++ b/etc/inc/pfsense-utils.inc
@@ -215,6 +215,27 @@ function enable_hardware_offloading($interface) {
pfSense_interface_capabilities($interface, IFCAP_RXCSUM);
}
+ if($config['system']['disablesegmentationoffloading']) {
+ if (isset($options['encaps']['tso4']))
+ pfSense_interface_capabilities($interface, -IFCAP_TSO);
+ if (isset($options['encaps']['tso6']))
+ pfSense_interface_capabilities($interface, -IFCAP_TSO);
+ } else {
+ if (isset($options['caps']['tso4']))
+ pfSense_interface_capabilities($interface, IFCAP_TSO);
+ if (isset($options['caps']['tso6']))
+ pfSense_interface_capabilities($interface, IFCAP_TSO);
+ }
+
+ if($config['system']['disablelargereceiveoffloading']) {
+ if (isset($options['encaps']['lro']))
+ pfSense_interface_capabilities($interface, -IFCAP_LRO);
+ } else {
+ if (isset($options['caps']['lro']))
+ pfSense_interface_capabilities($interface, IFCAP_LRO);
+ }
+
+
/* if the NIC supports polling *AND* it is enabled in the GUI */
$polling = isset($config['system']['polling']);
if($polling && isset($options['caps']['polling']))
diff --git a/usr/local/www/system_advanced_network.php b/usr/local/www/system_advanced_network.php
index d744a47dff..6c67e304d6 100644
--- a/usr/local/www/system_advanced_network.php
+++ b/usr/local/www/system_advanced_network.php
@@ -54,6 +54,8 @@ $pconfig['ipv6allow'] = isset($config['system']['ipv6allow']);
$pconfig['polling_enable'] = isset($config['system']['polling']);
$pconfig['sharednet'] = $config['system']['sharednet'];
$pconfig['disablechecksumoffloading'] = isset($config['system']['disablechecksumoffloading']);
+$pconfig['disablesegmentationoffloading'] = isset($config['system']['disablesegmentationoffloading']);
+$pconfig['disablelargereceiveoffloading'] = isset($config['system']['disablelargereceiveoffloading']);
$pconfig['flowtable'] = false;
$pconfig['flowtable'] = isset($config['system']['flowtable']);
@@ -111,12 +113,24 @@ if ($_POST) {
if($_POST['disablechecksumoffloading'] == "yes") {
$config['system']['disablechecksumoffloading'] = $_POST['disablechecksumoffloading'];
- setup_microcode();
} else {
unset($config['system']['disablechecksumoffloading']);
- setup_microcode();
}
+ if($_POST['disablesegmentationoffloading'] == "yes") {
+ $config['system']['disablesegmentationoffloading'] = $_POST['disablesegmentationoffloading'];
+ } else {
+ unset($config['system']['disablesegmentationoffloading']);
+ }
+
+ if($_POST['disablelargereceiveoffloading'] == "yes") {
+ $config['system']['disablelargereceiveoffloading'] = $_POST['disablelargereceiveoffloading'];
+ } else {
+ unset($config['system']['disablelargereceiveoffloading']);
+ }
+
+ setup_microcode();
+
// Write out configuration (config.xml)
write_config();
@@ -234,7 +248,23 @@ function enable_change(enable_over) {
=gettext("Disable hardware checksum offload"); ?>
=gettext("Checking this option will disable hardware checksum offloading. Checksum offloading is broken in some hardware, particularly some Realtek cards. Rarely, drivers may have problems with checksum offloading and some specific NICs."); ?>
-
+
+