]> git.ipfire.org Git - network.git/commitdiff
Add support for hardware offloading
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 21 Sep 2018 12:22:39 +0000 (14:22 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 21 Sep 2018 12:22:39 +0000 (14:22 +0200)
Hardware offloading will now be enabled on physical
and bonding devices automatically.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/functions/functions.constants
src/functions/functions.device
src/hooks/ports/bonding
src/hooks/ports/ethernet

index 0d6cdd2fba47fa4db933b054496ed95cd3d905f3..63c5cad29abfca0eda18f0be98fda8da269f655a 100644 (file)
@@ -94,6 +94,30 @@ DISCOVER_NOT_SUPPORTED=2
 # Default MTU
 DEFAULT_MTU=1500
 
+# A list of supported device offloading mechanisms
+# that are being mapped to the ethtool command
+declare -A DEVICE_SUPPORTED_OFFLOADINGS=(
+       [generic-receive-offload]="gro"
+       [generic-segmentation-offload]="gso"
+       [large-receive-offload]="lro"
+       [rx-checksumming]="rx"
+       [scatter-gather]="sg"
+       [tcp-segmentation-offload]="tso"
+       [tx-checksumming]="tx"
+       [udp-fragmentation-offload]="ufo"
+)
+
+# These offloadings will automatically be enabled (if supported)
+DEVICE_AUTO_OFFLOADINGS=(
+       generic-receive-offload
+       generic-segmentation-offload
+       rx-checksumming
+       scatter-gather
+       tcp-segmentation-offload
+       tx-checksumming
+       udp-fragmentation-offload
+)
+
 # The user is able to create zones that begin
 # with these names followed by a number.
 ZONE_LOCAL="net"
index 8384273d057d775ec9cbdda30d867bf1ce688eab..e8fdc826e9e9db27547aefd427ab1a9a074e246c 100644 (file)
@@ -974,6 +974,47 @@ device_get_link_string() {
        print "${s}"
 }
 
+device_auto_offloading() {
+       local device="${1}"
+       assert isset device
+
+       # Enable all offloadings that we consider a good default
+       local offloading
+       for offloading in ${DEVICE_AUTO_OFFLOADINGS[@]}; do
+               device_set_offloading "${device}" "${offloading}" "on"
+       done
+
+       return ${EXIT_OK}
+}
+
+device_set_offloading() {
+       local device="${1}"
+       assert isset device
+
+       local offloading="${2}"
+       assert isoneof offloading ${!DEVICE_SUPPORTED_OFFLOADINGS[@]}
+
+       local value="${3}"
+       assert isoneof value on off
+
+       # Translate to ethool option
+       local mode="${DEVICE_SUPPORTED_OFFLOADINGS[${offloading}]}"
+       if ! isset mode; then
+               error "Unsupported offloading mode: ${offloading}"
+               return ${EXIT_ERROR}
+       fi
+
+       # Run ethtool
+       if ! cmd_quiet ethtool --offload "${device}" "${mode}" "${value}"; then
+               log DEBUG "Could not set ${offloading} on ${device} to ${value}"
+               return ${EXIT_ERROR}
+       fi
+
+       log DEBUG "Set ${offloading} on ${device} to ${value}"
+
+       return ${EXIT_OK}
+}
+
 device_auto_configure_smp_affinity() {
        assert [ $# -eq 1 ]
 
index 36bcf6c7dc76fa4036c8c67f35f7e8f1376366d9..d8bc58391db90d7eeb1cf1f83c711781bb1614d9 100644 (file)
@@ -175,6 +175,9 @@ hook_up() {
 
        port_settings_read "${port}" ${HOOK_SETTINGS}
 
+       # Enable hardware offloading
+       device_auto_offloading "${port}"
+
        # Execute the default action
        hook_default_up "${port}"
 
index ddc76c3cffed5ba5ef6a2f8fb7007c996b926746..c7750f9d122d57bf29106a54e8af789af0aeea21 100644 (file)
@@ -117,6 +117,9 @@ hook_up() {
                device_advertise_link_speeds "${port}" ${ADVERTISED_LINK_SPEEDS}
        fi
 
+       # Enable hardware offloading
+       device_auto_offloading "${port}"
+
        # Bring up the device
        device_set_up "${port}"