]> 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 35cc8eb3b3a358e182b3567dde6ad1cac9ef15ba..0d9c5cd62165ef8d6d40dfcf96a49e576efd712e 100644 (file)
 # 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"
+HOOK_SETTINGS="ADDRESS ADVERTISED_LINK_SPEEDS DEVICE OFFLOADING MTU"
 
-function hook_check() {
+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
+
+       if isset MTU; then
+               assert mtu_is_valid "ethernet" "${MTU}"
+       fi
+
+       if isset MODES; then
+               local mode
+               for mode in ${MODES}; do
+                       assert [ -n "${DEVICE_LINK_SPEEDS[${mode}]}" ]
+               done
+       fi
 }
 
-function hook_create() {
-       local port=${1}
+hook_parse_cmdline() {
+       while [ $# -gt 0 ]; do
+               case "${1}" in
+                       --address=*)
+                               ADDRESS="$(cli_get_val "${1}")"
+
+                               if ! mac_is_valid "${ADDRESS}"; then
+                                       error "Invalid MAC address: ${ADDRESS}"
+                                       return ${EXIT_ERROR}
+                               fi
+                               ;;
+
+                       --advertised-link-speeds=*)
+                               ADVERTISED_LINK_SPEEDS="$(cli_get_val "${1}")"
+
+                               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=*)
+                               MTU="$(cli_get_val "${1}")"
+
+                               if ! mtu_is_valid "ethernet" "${MTU}"; then
+                                       error "Invalid MTU: ${MTU}"
+                                       return ${EXIT_ERROR}
+                               fi
+                               ;;
+
+                       --offloading=*)
+                               OFFLOADING="$(cli_get_val "${1}")"
+
+                               if enabled OFFLOADING; then
+                                       OFFLOADING="on"
+                               elif disabled OFFLOADING; then
+                                       OFFLOADING="off"
+                               else
+                                       error "Invalid value for offloading: ${OFFLOADING}"
+                                       return ${EXIT_ERROR}
+                               fi
+                               ;;
+
+                       *)
+                               error "Unknown argument: ${1}"
+                               return ${EXIT_ERROR}
+                               ;;
+               esac
+               shift
+       done
+}
+
+# This function is only called automatically by hotplug to create
+# a new ethernet port.
+hook_new() {
+       local port="${1}"
        assert isset port
-       shift
 
-       ADDRESS=""
-       DEVICE=$(device_get_address ${port})
+       local device="${2}"
+       assert isset device
 
-       port_settings_write "${port}" ${HOOK_SETTINGS}
+       local DEVICE="$(device_get_address "${device}")"
 
-       exit ${EXIT_OK}
+       if ! port_settings_write "${port}" ${HOOK_SETTINGS}; then
+               log ERROR "Could not write settings for port ${port}"
+               return ${EXIT_ERROR}
+       fi
+
+       return ${EXIT_OK}
 }
 
-function hook_up() {
-       local port=${1}
-       assert isset port
+hook_create() {
+       return ${EXIT_OK}
+}
 
-       # Read in the confguration file.
-       port_settings_read "${port}" ${HOOK_SETTINGS}
+hook_up() {
+       local port="${1}"
+
+       local ${HOOK_SETTINGS}
+       if ! port_settings_read "${port}" ${HOOK_SETTINGS}; then
+               log ERROR "Could not read settings for port ${port}"
+               return ${EXIT_ERROR}
+       fi
 
-       # Check if the MAC address is the right one.
+       # Set MAC address, if needed
        if isset ADDRESS; then
-               device_set_address "${device}" "${ADDRESS}"
+               device_set_address "${port}" "${ADDRESS}"
        fi
 
-       # Bring up the device.
-       device_set_up ${port}
+       # Set MTU
+       if isset MTU; then
+               device_set_mtu "${port}" "${MTU}"
+       else
+               device_set_mtu "${port}" "${DEFAULT_MTU}"
+       fi
 
-       exit ${EXIT_OK}
-}
+       # Set link speeds
+       if isset ADVERTISED_LINK_SPEEDS; then
+               device_advertise_link_speeds "${port}" ${ADVERTISED_LINK_SPEEDS}
+       fi
 
-function hook_down() {
-       local port=${1}
-       assert isset port
+       # Auto-enable or disable hardware offloading
+       if ! isset OFFLOADING || enabled OFFLOADING; then
+               offloading_auto "${port}"
+       else
+               offloading_disable_all "${port}"
+       fi
 
-       # Set down the device.
-       device_set_down ${port}
+       # Bring up the device
+       device_set_up "${port}"
 
        exit ${EXIT_OK}
 }
 
-function hook_hotplug_rename() {
+hook_remove() {
+       exit ${EXIT_OK}
+}
+
+hook_hotplug_rename() {
        local port=${1}
        assert isset port
 
@@ -92,13 +186,6 @@ function hook_hotplug_rename() {
        # Check if the address matches with the configuration.
        if list_match "${address}" ${DEVICE} ${ADDRESS}; then
                log DEBUG "Device '${device}' equals port '${port}'."
-
-               # Change the MAC address, if needed.
-               if isset ADDRESS; then
-                       device_set_address "${device}" "${ADDRESS}"
-               fi
-
-               # Everything is done.
                exit ${EXIT_OK}
        fi