From: Michael Tremer Date: Sun, 23 Sep 2018 14:30:29 +0000 (+0200) Subject: wireless: Try to automatically enable HT40+/- on devices that support it X-Git-Tag: 010~24 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=109884bebd262c1e5be6dc20e797062fbc983b50;p=network.git wireless: Try to automatically enable HT40+/- on devices that support it Signed-off-by: Michael Tremer --- diff --git a/src/functions/functions.phy b/src/functions/functions.phy index 76974fa8..96287a52 100644 --- a/src/functions/functions.phy +++ b/src/functions/functions.phy @@ -169,3 +169,22 @@ phy_supports_channel() { return ${EXIT_FALSE} } + +__phy_list_ht_capabilities() { + local phy="${1}" + assert isset phy + + local capabilities="$(network-phy-list-ht-caps "${phy}")" + + print "${capabilities//[\[\]]/ }" +} + +phy_supports_ht_capability() { + local phy="${1}" + assert isset phy + + local capability="${2}" + assert isset capability + + list_match "${capability}" $(__phy_list_ht_capabilities "${phy}") +} diff --git a/src/functions/functions.wireless b/src/functions/functions.wireless index ba4cd472..3608e119 100644 --- a/src/functions/functions.wireless +++ b/src/functions/functions.wireless @@ -111,7 +111,7 @@ wireless_create() { # Set the channel if isset channel; then - wireless_set_channel "${device}" "${channel}" || return $? + wireless_set_channel "${device}" "${channel}" "auto" || return $? fi return ${ret} @@ -309,9 +309,34 @@ wireless_channel_is_valid() { return ${EXIT_FALSE} } +wireless_channel_is_ht40_plus() { + local channel="${1}" + assert isinteger channel + + # 2.4 GHz + if [ ${channel} -le 6 ]; then + return ${EXIT_TRUE} + fi + + return ${EXIT_FALSE} +} + +wireless_channel_is_ht40_minus() { + local channel="${1}" + assert isinteger channel + + # 2.4 GHz + if [ ${channel} -ge 6 ]; then + return ${EXIT_TRUE} + fi + + return ${EXIT_FALSE} +} + wireless_set_channel() { - local device=${1} - local channel=${2} + local device="${1}" + local channel="${2}" + local bandwidth="${3}" # Check if the device exists if ! device_exists "${device}"; then @@ -325,8 +350,27 @@ wireless_set_channel() { return ${EXIT_ERROR} fi + local ht_flag + if [ "${bandwidth}" = "auto" ]; then + local phy="$(device_get_phy "${device}")" + + # Offset of a 40 MHz channel + local ht_offset=5 + + if wireless_channel_is_ht40_plus "${channel}" \ + && phy_supports_ht_capability "${phy}" "HT40+" \ + && phy_supports_channel "${phy}" $(( channel + ht_offset )); then + ht_flag="HT40+" + + elif wireless_channel_is_ht40_minus "${channel}" \ + && phy_supports_ht_capability "${phy}" "HT40-" \ + && phy_supports_channel "${phy}" $(( channel - ht_offset )); then + ht_flags="HT40-" + fi + fi + log DEBUG "Setting wireless channel on device '${device}' to channel '${channel}'" - cmd iw dev "${device}" set channel "${channel}" + cmd iw dev "${device}" set channel "${channel}" "${ht_flag}" } wireless_pre_shared_key_is_valid() {