]> git.ipfire.org Git - people/ms/network.git/blobdiff - src/hooks/ports/wireless-ap
wireless-ap: Add CLI to set channel bandwidth
[people/ms/network.git] / src / hooks / ports / wireless-ap
index 9c0375cc80bf32f266ad5f85ababc0f0dab45728..8b626bf3eed2c51a084333ed762a91594d0fd779 100644 (file)
 
 HOOK_PORT_PATTERN="${PORT_PATTERN_ACCESSPOINT}"
 
-HOOK_SETTINGS="HOOK ADDRESS BROADCAST_SSID CHANNEL MODE PHY SSID"
+HOOK_SETTINGS="ADDRESS BROADCAST_SSID CHANNEL MODE PHY SSID"
 HOOK_SETTINGS="${HOOK_SETTINGS} ENCRYPTION KEY"
 
 ADDRESS=$(mac_generate)
 BROADCAST_SSID=on
-CHANNEL=1
+CHANNEL=0
+CHANNEL_BANDWIDTH=
 ENCRYPTION=""
 KEY=""
-MODE="g"
 SSID=
 
+# Perform radar detection by default when possible
+DFS="on"
+
 hook_check_settings() {
        assert isset ADDRESS
        assert ismac ADDRESS
        assert isset BROADCAST_SSID
        assert isbool BROADCAST_SSID
        assert isset CHANNEL
+       assert isbool DFS
        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
@@ -59,28 +63,49 @@ hook_parse_cmdline() {
        while [ $# -gt 0 ]; do
                case "${1}" in
                        --broadcast-ssid=*)
-                               BROADCAST_SSID=$(cli_get_val ${1})
+                               BROADCAST_SSID=$(cli_get_val "${1}")
                                ;;
                        --channel=*)
-                               CHANNEL=$(cli_get_val ${1})
+                               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})
+                               ENCRYPTION=$(cli_get_val "${1}")
                                ;;
                        --key=*)
-                               KEY=$(cli_get_val ${1})
+                               KEY=$(cli_get_val "${1}")
                                ;;
                        --mac=*)
-                               ADDRESS=$(cli_get_val ${1})
+                               ADDRESS=$(cli_get_val "${1}")
                                ;;
                        --mode=*)
-                               MODE=$(cli_get_val ${1})
+                               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})
+                               PHY=$(cli_get_val "${1}")
                                ;;
                        --ssid=*)
-                               SSID=$(cli_get_val ${1})
+                               SSID=$(cli_get_val "${1}")
                                ;;
                        *)
                                warning "Ignoring unknown argument '${1}'"
@@ -89,6 +114,23 @@ 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
+
+       # 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"
+               return ${EXIT_ERROR}
+       fi
+
        # Save address of phy do identify it again
        PHY=$(phy_get ${PHY})
        PHY=$(phy_get_address ${PHY})
@@ -98,7 +140,7 @@ hook_edit() {
        local port=${1}
        assert isset port
 
-       if ! hook_default_edit $@; then
+       if ! hook_default_edit "$@"; then
                return ${EXIT_ERROR}
        fi