HOSTAPD_CONTROL_INTERFACE_DIR="/run/hostapd/ctrl"
-function hostapd_config_write() {
+HOSTAPD_SUPPORTED_MODES="802.11a 802.11a/n 802.11ac 802.11g 802.11g/n"
+
+hostapd_config_write() {
local device=${1}
assert isset device
local broadcast_ssid
local channel
- local country_code
+ local country_code="$(wireless_get_reg_domain)"
+ local dfs="on"
local encryption
- local ieee80211d="1"
local key
local mode
local ssid
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}")
;;
- --country-code=*)
- country_code=$(cli_get_val ${1})
+ --dfs=*)
+ dfs="$(cli_get_val "${1}")"
;;
--encryption=*)
- encryption=$(cli_get_val ${1})
- ;;
- --ieee80211d=*)
- local val="$(cli_get_val "${1}")"
- if enabled val; then
- ieee80211d="1"
- else
- ieee80211d="0"
- fi
+ encryption=$(cli_get_val "${1}")
;;
--key=*)
- key=$(cli_get_val ${1})
+ key=$(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}"
+ return ${EXIT_ERROR}
+ fi
;;
--ssid=*)
- ssid=$(cli_get_val ${1})
+ ssid=$(cli_get_val "${1}")
;;
--wmm=*)
local val="$(cli_get_val "${1}")"
shift
done
+ # Check if mode is set
+ if ! isset mode; then
+ error "Mode is not set"
+ return ${EXIT_ERROR}
+ fi
+
assert isset broadcast_ssid
assert isbool broadcast_ssid
assert isset channel
assert isinteger channel
- assert isset country_code
assert isset mode
assert isset ssid
assert isset key
fi
+ # 802.11ac/n flags
+ local ieee80211ac
+ local ieee80211n
+ local vht_caps
+ local ht_caps
+
+ local hw_mode
+ case "${mode}" in
+ 802.11a)
+ hw_mode="a"
+ ;;
+
+ 802.11a/n)
+ hw_mode="a"
+ ieee80211n="1"
+
+ # Fetch HT caps
+ ht_caps="$(wireless_get_ht_caps "${device}")"
+ ;;
+
+ 802.11g)
+ hw_mode="g"
+ ;;
+
+ 802.11g/n)
+ hw_mode="g"
+ ieee80211n="1"
+
+ # Fetch HT caps
+ ht_caps="$(wireless_get_ht_caps "${device}")"
+ ;;
+
+ 802.11ac)
+ hw_mode="a"
+ ieee80211ac="1"
+ ieee80211n="1"
+
+ # Fetch VHT caps
+ vht_caps="$(wireless_get_vht_caps "${device}")"
+
+ # Fetch HT caps
+ ht_caps="$(wireless_get_ht_caps "${device}")"
+ ;;
+ esac
+
# Create configuration directory.
local config_dir=$(dirname ${file})
mkdir -p ${HOSTAPD_CONTROL_INTERFACE_DIR} ${config_dir} 2>/dev/null
ignore_broadcast_ssid="1"
fi
- local hw_mode ieee80211n="0"
- if [ "${mode}" = "n" ]; then
- if [ ${channel} -le 15 ]; then
- hw_mode="g"
+ (
+ print "# Default settings"
+
+ # Advertise country code and maximum transmission power
+ print "ieee80211d=1"
+
+ # Enable Radar Detection
+ if enabled dfs && wireless_supports_dfs "${device}"; then
+ print "ieee80211h=1"
else
- hw_mode="a"
+ print "ieee80211h=0"
fi
- ieee80211n="1"
- else
- hw_mode="${mode}"
- fi
- (
+ print # empty line
+
print "# Wireless configuration"
+ print "hw_mode=${hw_mode}"
+
+ if isset ieee80211ac; then
+ print "ieee80211ac=${ieee80211ac}"
+ fi
+
+ if isset ieee80211n; then
+ print "ieee80211n=${ieee80211n}"
+ fi
+
print "channel=${channel}"
print "country_code=${country_code}"
- print "hw_mode=${hw_mode}"
- print "ieee80211d=${ieee80211d}"
- print "ieee80211n=${ieee80211n}"
print "ignore_broadcast_ssid=${ignore_broadcast_ssid}"
if contains_spaces "${ssid}"; then
# WMM
print "wmm_enabled=${wmm}"
+ # Enable VHT caps
+ if isset vht_caps; then
+ print "vht_capab=${vht_caps}"
+ fi
+
+ # Enable HT caps
+ print "ht_capab=${ht_caps}"
+
print
) >> ${file}
return ${EXIT_OK}
}
-function hostapd_start() {
+hostapd_start() {
local device=${1}
assert isset device
return ${EXIT_OK}
}
-function hostapd_stop() {
+hostapd_stop() {
local device=${1}
assert isset device