]> git.ipfire.org Git - people/ms/network.git/commitdiff
port: ethernet: Allow setting link speed
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 20 Sep 2018 22:19:02 +0000 (23:19 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 20 Sep 2018 22:19:02 +0000 (23:19 +0100)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/functions/functions.device
src/hooks/ports/ethernet

index ace402209134fbd486c440644a4055957a7a3ee7..7e830ed2d84cbc22b5b62fdb5f27891f6c759eeb 100644 (file)
@@ -895,6 +895,23 @@ device_get_speed() {
        print "${speed}"
 }
 
+device_set_speed() {
+       local device="${1}"
+       assert isset device
+
+       local speed="${2}"
+       assert isinteger speed
+
+       if ! cmd_quiet ethtool --change "${device}" speed "${speed}"; then
+               log ERROR "Could not set speed of ${device} to ${speed} MBit/s"
+               return ${EXIT_ERROR}
+       fi
+
+       log DEBUG "Set speed of ${device} to ${speed} MBit/s"
+
+       return ${EXIT_OK}
+}
+
 device_get_duplex() {
        local device=${1}
 
index 4c8eee83491107dd33ee512df7dc4bf3010ddb57..beec3ccdb28bce88095bddab7edcde5fefcc0ad1 100644 (file)
 # Default MTU
 DEFAULT_MTU=1500
 
+# Selectable speeds in MBit/s
+VALID_SPEEDS="10000 1000 100 10"
+
 # DEVICE equals the actual MAC address of the device.
 # If ADDRESS is set, the device will get ADDRESS set for its MAC address.
 
-HOOK_SETTINGS="HOOK ADDRESS DEVICE MTU"
+HOOK_SETTINGS="HOOK ADDRESS DEVICE MTU SPEED"
 
 hook_check_settings() {
        assert ismac DEVICE
@@ -39,6 +42,10 @@ hook_check_settings() {
        if isset MTU; then
                assert mtu_is_valid "ethernet" "${MTU}"
        fi
+
+       if isset SPEED; then
+               assert isoneof SPEED ${VALID_SPEEDS}
+       fi
 }
 
 hook_parse_cmdline() {
@@ -61,6 +68,16 @@ hook_parse_cmdline() {
                                        return ${EXIT_ERROR}
                                fi
                                ;;
+
+                       --speed=*)
+                               SPEED="$(cli_get_val "${1}")"
+
+                               if ! isoneof SPEED ${VALID_SPEEDS}; then
+                                       error "Invalid speed: ${SPEED}"
+                                       return ${EXIT_ERROR}
+                               fi
+                               ;;
+
                        *)
                                error "Unknown argument: ${1}"
                                return ${EXIT_ERROR}
@@ -95,6 +112,11 @@ hook_up() {
                device_set_mtu "${port}" "${DEFAULT_MTU}"
        fi
 
+       # Set speed
+       if isset SPEED; then
+               device_set_speed "${port}" "${SPEED}"
+       fi
+
        # Bring up the device
        device_set_up "${port}"