summaryrefslogtreecommitdiffstats
path: root/etc/inc/interfaces.inc
diff options
context:
space:
mode:
authorErmal LUÇI <eri@pfsense.org>2014-11-24 12:19:15 +0100
committerErmal LUÇI <eri@pfsense.org>2014-11-24 12:19:15 +0100
commit43517fcc1b616b7443b26247dc59dbd65bde2819 (patch)
treea13e4512bf3d435c85010c90b07af925c9b12d51 /etc/inc/interfaces.inc
parent0771969b40bb37d0aa8b8d66fbd17b5176957231 (diff)
downloadpfsense-43517fcc1b616b7443b26247dc59dbd65bde2819.zip
pfsense-43517fcc1b616b7443b26247dc59dbd65bde2819.tar.gz
Fixes #1047, overhaul handling of flags for hardware offloading and make it work correctly for system_advanced page settings. Lagg is still a special case that needs a reboot.
Diffstat (limited to 'etc/inc/interfaces.inc')
-rw-r--r--etc/inc/interfaces.inc138
1 files changed, 17 insertions, 121 deletions
diff --git a/etc/inc/interfaces.inc b/etc/inc/interfaces.inc
index 9be8146..aa36068 100644
--- a/etc/inc/interfaces.inc
+++ b/etc/inc/interfaces.inc
@@ -511,29 +511,6 @@ function interface_bridge_configure(&$bridge, $checkmember = 0) {
if ($smallermtu == 0)
$smallermtu = 1500;
- $flags_on = 0;
- $flags_off = 0;
- if (isset($config['system']['disablechecksumoffloading']) || ($commonrx === false))
- $flags_off |= IFCAP_RXCSUM;
- else
- $flags_on |= IFCAP_RXCSUM;
- if (isset($config['system']['disablechecksumoffloading']) || ($commontx === false))
- $flags_off |= IFCAP_TXCSUM;
- else
- $flags_on |= IFCAP_TXCSUM;
- if (isset($config['system']['disablesegmentationoffloading']) || ($commontso4 === false))
- $flags_off |= IFCAP_TSO4;
- else
- $flags_on |= IFCAP_TSO4;
- if (isset($config['system']['disablesegmentationoffloading']) || ($commontso6 === false))
- $flags_off |= IFCAP_TSO6;
- else
- $flags_on |= IFCAP_TSO6;
- if (isset($config['system']['disablelargereceiveoffloading']) || ($commonlro === false))
- $flags_off |= IFCAP_LRO;
- else
- $flags_on |= IFCAP_LRO;
-
if ($g['booting'] || !empty($bridge['bridgeif'])) {
pfSense_interface_destroy($bridge['bridgeif']);
pfSense_interface_create($bridge['bridgeif']);
@@ -556,10 +533,9 @@ function interface_bridge_configure(&$bridge, $checkmember = 0) {
}
/* make sure the parent interface is up */
pfSense_interface_mtu($realif, $smallermtu);
- pfSense_interface_capabilities($realif, -$flags_off);
- pfSense_interface_capabilities($realif, $flags_on);
interfaces_bring_up($realif);
- pfSense_bridge_add_member($bridge['bridgeif'], $realif);
+ enable_hardware_offloading($member);
+ pfSense_bridge_add_member($bridge['bridgeif'], $realif, true);
}
if (isset($bridge['enablestp'])) {
@@ -668,45 +644,21 @@ function interface_bridge_configure(&$bridge, $checkmember = 0) {
log_error(gettext("bridgeif not defined -- could not bring interface up"));
}
-function interface_bridge_add_member($bridgeif, $interface) {
+function interface_bridge_add_member($bridgeif, $interface, $flagsapplied = false) {
if (!does_interface_exist($bridgeif) || !does_interface_exist($interface))
return;
- $mtu = get_interface_mtu($bridgeif);
- $mtum = get_interface_mtu($interface);
-
- if ($mtu != $mtum && !(substr($interface, 0, 3) == "gif" && $mtu <= 1500))
- pfSense_interface_mtu($interface, $mtu);
-
- $options = pfSense_get_interface_addresses($bridgeif);
- $flags_on = 0;
- $flags_off = 0;
- if (isset($options['encaps']['txcsum']))
- $flags_on |= IFCAP_TXCSUM;
- else
- $flags_off |= IFCAP_TXCSUM;
- if (isset($options['encaps']['rxcsum']))
- $flags_on |= IFCAP_RXCSUM;
- else
- $flags_off |= IFCAP_RXCSUM;
- if (isset($options['encaps']['tso4']))
- $flags_on |= IFCAP_TSO4;
- else
- $flags_off |= IFCAP_TSO4;
- if (isset($options['encaps']['tso6']))
- $flags_on |= IFCAP_TSO6;
- else
- $flags_off |= IFCAP_TSO6;
- if (isset($options['encaps']['lro']))
- $flags_on |= IFCAP_LRO;
- else
- $flags_off |= IFCAP_LRO;
+ if ($flagsapplied == false) {
+ $mtu = get_interface_mtu($bridgeif);
+ $mtum = get_interface_mtu($interface);
+ if ($mtu != $mtum && !(substr($interface, 0, 3) == "gif" && $mtu <= 1500))
+ pfSense_interface_mtu($interface, $mtu);
- pfSense_interface_capabilities($interface, -$flags_off);
- pfSense_interface_capabilities($interface, $flags_on);
+ hardware_offloading_applyflags($interface);
+ interfaces_bring_up($interface);
+ }
- interfaces_bring_up($interface);
pfSense_bridge_add_member($bridgeif, $interface);
}
@@ -789,29 +741,6 @@ function interface_lagg_configure($lagg) {
if ($lagg_mtu == 0)
$lagg_mtu = 1500;
- $flags_on = 0;
- $flags_off = 0;
- if (isset($config['system']['disablechecksumoffloading']) || ($commonrx === false))
- $flags_off |= IFCAP_RXCSUM;
- else
- $flags_on |= IFCAP_RXCSUM;
- if (isset($config['system']['disablechecksumoffloading']) || ($commontx === false))
- $flags_off |= IFCAP_TXCSUM;
- else
- $flags_on |= IFCAP_TXCSUM;
- if (isset($config['system']['disablesegmentationoffloading']) || ($commontso4 === false))
- $flags_off |= IFCAP_TSO4;
- else
- $flags_on |= IFCAP_TSO4;
- if (isset($config['system']['disablesegmentationoffloading']) || ($commontso6 === false))
- $flags_off |= IFCAP_TSO6;
- else
- $flags_on |= IFCAP_TSO6;
- if (isset($config['system']['disablelargereceiveoffloading']) || ($commonlro === false))
- $flags_off |= IFCAP_LRO;
- else
- $flags_on |= IFCAP_LRO;
-
$checklist = get_interface_list();
foreach ($members as $member) {
@@ -819,11 +748,12 @@ function interface_lagg_configure($lagg) {
continue;
/* make sure the parent interface is up */
pfSense_interface_mtu($member, $lagg_mtu);
- pfSense_interface_capabilities($member, -$flags_off);
- pfSense_interface_capabilities($member, $flags_on);
interfaces_bring_up($member);
- mwexec("/sbin/ifconfig {$laggif} laggport {$member}");
+ hardware_offloading_applyflags($member);
+ mwexec("/sbin/ifconfig " . escapeshellarg($laggif) . " laggport " . escapeshellarg($member));
}
+ pfSense_interface_capabilities($laggif, -$flags_off);
+ pfSense_interface_capabilities($laggif, $flags_on);
mwexec("/sbin/ifconfig {$laggif} laggproto " . escapeshellarg($lagg['proto']));
@@ -3050,43 +2980,9 @@ function interface_configure($interface = "wan", $reloadall = false, $linkupeven
$cmd .= " mediaopt " . escapeshellarg($wancfg['mediaopt']);
mwexec($cmd);
}
- $options = pfSense_get_interface_addresses($realhwif);
-
- /* skip vlans for checksumming and polling */
- if (is_array($options)) {
- $flags_on = 0;
- $flags_off = 0;
- if(isset($config['system']['disablechecksumoffloading'])) {
- if (isset($options['encaps']['txcsum']))
- $flags_off |= IFCAP_TXCSUM;
- if (isset($options['encaps']['rxcsum']))
- $flags_off |= IFCAP_RXCSUM;
- } else {
- if (isset($options['caps']['txcsum']))
- $flags_on |= IFCAP_TXCSUM;
- if (isset($options['caps']['rxcsum']))
- $flags_on |= IFCAP_RXCSUM;
- }
-
- if(isset($config['system']['disablesegmentationoffloading']))
- $flags_off |= IFCAP_TSO;
- else if (isset($options['caps']['tso']) || isset($options['caps']['tso4']) || isset($options['caps']['tso6']))
- $flags_on |= IFCAP_TSO;
- if(isset($config['system']['disablelargereceiveoffloading']))
- $flags_off |= IFCAP_LRO;
- else if (isset($options['caps']['lro']))
- $flags_on |= IFCAP_LRO;
-
- /* if the NIC supports polling *AND* it is enabled in the GUI */
- if (!isset($config['system']['polling']))
- $flags_off |= IFCAP_POLLING;
- else if (isset($options['caps']['polling']))
- $flags_on |= IFCAP_POLLING;
-
- pfSense_interface_capabilities($realhwif, -$flags_off);
- pfSense_interface_capabilities($realhwif, $flags_on);
- }
+ /* Apply hw offloading policies as configured */
+ enable_hardware_offloading($interface);
/* invalidate interface/ip/sn cache */
get_interface_arr(true);
OpenPOWER on IntegriCloud