]> git.ipfire.org Git - people/ms/network.git/blobdiff - src/hooks/ports/ethernet
hooks: Import zone default settings, too
[people/ms/network.git] / src / hooks / ports / ethernet
index 2db7f48811d4ab3b52f9664381e47dc77742b0d1..0d9c5cd62165ef8d6d40dfcf96a49e576efd712e 100644 (file)
 
 . /usr/lib/network/header-port
 
-# Default MTU
-DEFAULT_MTU=1500
-
-# Selectable speeds in MBit/s
-VALID_SPEEDS="10000 1000 100 10"
-
-# We can run in full or half duplex
-VALID_DUPLEXES="full half"
-
 # 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 DUPLEX MTU SPEED"
+HOOK_SETTINGS="ADDRESS ADVERTISED_LINK_SPEEDS DEVICE OFFLOADING MTU"
 
 hook_check_settings() {
        assert ismac DEVICE
 
+       # Invalid MAC addresses are not allowed
+       assert not isoneof DEVICE 00:00:00:00:00:00 ff:ff:ff:ff:ff:ff
+
        if isset ADDRESS; then
                assert ismac ADDRESS
        fi
@@ -46,12 +40,11 @@ hook_check_settings() {
                assert mtu_is_valid "ethernet" "${MTU}"
        fi
 
-       if isset DUPLEX; then
-               assert isoneof DUPLEX ${VALID_DUPLEXES}
-       fi
-
-       if isset SPEED; then
-               assert isoneof SPEED ${VALID_SPEEDS}
+       if isset MODES; then
+               local mode
+               for mode in ${MODES}; do
+                       assert [ -n "${DEVICE_LINK_SPEEDS[${mode}]}" ]
+               done
        fi
 }
 
@@ -67,13 +60,16 @@ hook_parse_cmdline() {
                                fi
                                ;;
 
-                       --duplex=*)
-                               DUPLEX="$(cli_get_val "${1}")"
+                       --advertised-link-speeds=*)
+                               ADVERTISED_LINK_SPEEDS="$(cli_get_val "${1}")"
 
-                               if ! isoneof DUPLEX ${VALID_DUPLEXES}; then
-                                       error "Invalid duplex mode: ${DUPLEX}"
-                                       return ${EXIT_ERROR}
-                               fi
+                               local speed
+                               for speed in ${ADVERTISED_LINK_SPEEDS}; do
+                                       if [ -z "${DEVICE_LINK_SPEEDS[${speed}]}" ]; then
+                                               error "Unsupported link speed: ${speed}"
+                                               return ${EXIT_ERROR}
+                                       fi
+                               done
                                ;;
 
                        --mtu=*)
@@ -85,11 +81,15 @@ hook_parse_cmdline() {
                                fi
                                ;;
 
-                       --speed=*)
-                               SPEED="$(cli_get_val "${1}")"
+                       --offloading=*)
+                               OFFLOADING="$(cli_get_val "${1}")"
 
-                               if ! isoneof SPEED ${VALID_SPEEDS}; then
-                                       error "Invalid speed: ${SPEED}"
+                               if enabled OFFLOADING; then
+                                       OFFLOADING="on"
+                               elif disabled OFFLOADING; then
+                                       OFFLOADING="off"
+                               else
+                                       error "Invalid value for offloading: ${OFFLOADING}"
                                        return ${EXIT_ERROR}
                                fi
                                ;;
@@ -103,6 +103,25 @@ hook_parse_cmdline() {
        done
 }
 
+# This function is only called automatically by hotplug to create
+# a new ethernet port.
+hook_new() {
+       local port="${1}"
+       assert isset port
+
+       local device="${2}"
+       assert isset device
+
+       local DEVICE="$(device_get_address "${device}")"
+
+       if ! port_settings_write "${port}" ${HOOK_SETTINGS}; then
+               log ERROR "Could not write settings for port ${port}"
+               return ${EXIT_ERROR}
+       fi
+
+       return ${EXIT_OK}
+}
+
 hook_create() {
        return ${EXIT_OK}
 }
@@ -128,14 +147,16 @@ hook_up() {
                device_set_mtu "${port}" "${DEFAULT_MTU}"
        fi
 
-       # Set duplex mode
-       if isset DUPLEX; then
-               device_set_duplex "${port}" "${DUPLEX}"
+       # Set link speeds
+       if isset ADVERTISED_LINK_SPEEDS; then
+               device_advertise_link_speeds "${port}" ${ADVERTISED_LINK_SPEEDS}
        fi
 
-       # Set speed
-       if isset SPEED; then
-               device_set_speed "${port}" "${SPEED}"
+       # Auto-enable or disable hardware offloading
+       if ! isset OFFLOADING || enabled OFFLOADING; then
+               offloading_auto "${port}"
+       else
+               offloading_disable_all "${port}"
        fi
 
        # Bring up the device