]> git.ipfire.org Git - people/stevee/network.git/blobdiff - src/hooks/ports/wireless-ap
Convert HOOK_SETTINGS into an array
[people/stevee/network.git] / src / hooks / ports / wireless-ap
index 4b31a8b25e35a0449e905e1707a4c02b1ed95c04..8d495d2863c94f09ee58e0f64b44e2adba49e0ac 100644 (file)
 
 HOOK_PORT_PATTERN="${PORT_PATTERN_ACCESSPOINT}"
 
-HOOK_SETTINGS="HOOK ADDRESS BROADCAST_SSID CHANNEL MODE PHY SSID"
-HOOK_SETTINGS="${HOOK_SETTINGS} ENCRYPTION KEY"
+HOOK_SETTINGS=(
+       "ADDRESS"
+       "BROADCAST_SSID"
+       "CHANNEL"
+       "CHANNEL_BANDWIDTH"
+       "DFS"
+       "ENCRYPTION"
+       "ENVIRONMENT"
+       "KEY"
+       "MFP"
+       "MODE"
+       "PHY"
+       "SSID"
+)
 
-ADDRESS=$(mac_generate)
-BROADCAST_SSID=on
-CHANNEL=1
-ENCRYPTION=""
-KEY=""
-MODE="g"
-SSID=
+# Broadcast SSID by default
+DEFAULT_BROADCAST_SSID="on"
+
+# Perform radar detection by default when possible
+DEFAULT_DFS="on"
+
+# 802.11w - Management Frame Protection
+# Disable by default because many clients cannot connect when enabled
+DEFAULT_MFP="off"
+
+DEFAULT_ENVIRONMENT="${WIRELESS_DEFAULT_ENVIRONMENT}"
 
 hook_check_settings() {
        assert isset ADDRESS
@@ -40,8 +56,10 @@ hook_check_settings() {
        assert isset BROADCAST_SSID
        assert isbool BROADCAST_SSID
        assert isset CHANNEL
+       assert isbool DFS
+       assert isbool MFP
        assert isset MODE
-       assert isoneof MODE a b g n
+       assert isoneof MODE ${HOSTAPD_SUPPORTED_MODES}
        assert isset PHY
        assert ismac PHY
        assert isset SSID
@@ -53,6 +71,8 @@ hook_check_settings() {
                assert [ ${#KEY} -ge 8 ]
                assert [ ${#KEY} -le 63 ]
        fi
+
+       assert wireless_environment_is_valid "${ENVIRONMENT}"
 }
 
 hook_parse_cmdline() {
@@ -64,17 +84,58 @@ hook_parse_cmdline() {
                        --channel=*)
                                CHANNEL=$(cli_get_val "${1}")
                                ;;
+                       --channel-bandwidth=*)
+                               CHANNEL_BANDWIDTH="$(cli_get_val "${1}")"
+                               ;;
+                       --dfs=*)
+                               DFS="$(cli_get_val "${1}")"
+
+                               if enabled DFS; then
+                                       DFS="on"
+                               elif disabled DFS; then
+                                       DFS="off"
+                               else
+                                       error "Invalid value for DFS: ${DFS}"
+                                       return ${EXIT_ERROR}
+                               fi
+                               ;;
                        --encryption=*)
                                ENCRYPTION=$(cli_get_val "${1}")
                                ;;
+                       --environment=*)
+                               ENVIRONMENT="$(cli_get_val "${1}")"
+
+                               if ! wireless_environment_is_valid "${ENVIRONMENT}"; then
+                                       error "Invalid wireless environment: ${ENVIRONMENT}"
+                                       return ${EXIT_ERROR}
+                               fi
+                               ;;
                        --key=*)
                                KEY=$(cli_get_val "${1}")
                                ;;
                        --mac=*)
                                ADDRESS=$(cli_get_val "${1}")
                                ;;
+                       --mfp=*)
+                               MFP="$(cli_get_val "${1}")"
+
+                               if enabled MFP; then
+                                       MFP="on"
+                               elif disabled MFP; then
+                                       MFP="off"
+                               else
+                                       error "Invalid value for --mfp: ${MFP}"
+                                       return ${EXIT_ERROR}
+                               fi
+                               ;;
                        --mode=*)
                                MODE=$(cli_get_val "${1}")
+
+                               if ! isoneof MODE ${HOSTAPD_SUPPORTED_MODES}; then
+                                       error "Unsupported mode: ${MODE}"
+                                       error "Mode must be one of ${HOSTAPD_SUPPORTED_MODES}"
+                                       return ${EXIT_ERROR}
+                               fi
                                ;;
                        --phy=*)
                                PHY=$(cli_get_val "${1}")
@@ -89,6 +150,30 @@ hook_parse_cmdline() {
                shift
        done
 
+       # Generate a random MAC address if none is set
+       if ! isset ADDRESS; then
+               ADDRESS="$(mac_generate)"
+       fi
+
+       # MODE must be set
+       if ! isset MODE; then
+               error "--mode is not set"
+               return ${EXIT_ERROR}
+       fi
+
+       # Automatically enable ACS if no channel is set and ACS is available
+       if ! isset CHANNEL && phy_supports_acs "${PHY}"; then
+               CHANNEL="0"
+
+               log INFO "Automatic Channel Selection (ACS) enabled"
+       fi
+
+       # Channel bandwidth must match the mode
+       if isset CHANNEL_BANDWIDTH && ! wireless_channel_bandwidth_is_valid "${MODE}" "${CHANNEL_BANDWIDTH}"; then
+               error "Channel Bandwidth '${CHANNEL_BANDWIDTH}' is not supported for ${MODE}"
+               return ${EXIT_ERROR}
+       fi
+
        # Save address of phy do identify it again
        PHY=$(phy_get ${PHY})
        PHY=$(phy_get_address ${PHY})
@@ -112,7 +197,7 @@ hook_create() {
 
        device_exists "${port}" && exit ${EXIT_OK}
 
-       port_settings_read "${port}" ${HOOK_SETTINGS}
+       port_settings_read "${port}" ${HOOK_SETTINGS[*]}
 
        # Check if the PHY is present.
        local phy=$(phy_get ${PHY})