X-Git-Url: http://git.ipfire.org/?p=people%2Fms%2Fnetwork.git;a=blobdiff_plain;f=src%2Ffunctions%2Ffunctions.wireless;h=733a35621b3efbcbc0cd19589ebdc35063f11159;hp=d132da6886353eb287ba5c15941813eac2199aed;hb=d695b280e9972311ae8c4bc688c0898ade1281e6;hpb=49958b8c7416641a6187cb2db0b4091abc94b714 diff --git a/src/functions/functions.wireless b/src/functions/functions.wireless index d132da68..733a3562 100644 --- a/src/functions/functions.wireless +++ b/src/functions/functions.wireless @@ -25,6 +25,21 @@ NETWORK_SETTINGS_FILE_PARAMS="${NETWORK_SETTINGS_FILE_PARAMS} WIRELESS_REGULATOR WIRELESS_REGULATORY_DOMAIN_DATABASE="/usr/lib/crda/regulatory.bin" +WIRELESS_DEFAULT_ENCRYPTION_MODE="NONE" +WIRELESS_VALID_ENCRYPTION_MODES="WPA2-PSK-SHA256 WPA2-PSK \ + WPA-PSK-SHA256 WPA-PSK NONE" + +declare -A WIRELESS_CHANNEL_BANDWIDTHS=( + ["802.11ac"]="20 40 80 160 80+80" + ["802.11a/n"]="20 40" + ["802.11a"]="20 40" + ["802.11g/n"]="20 40" + ["802.11g"]="20 40" +) + +WIRELESS_ENVIRONMENTS=( "indoor+outdoor" "indoor" "outdoor" ) +WIRELESS_DEFAULT_ENVIRONMENT="${WIRELESS_ENVIRONMENTS[0]}" + cli_wireless() { local action=${1} shift 1 @@ -107,7 +122,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} @@ -305,9 +320,46 @@ wireless_channel_is_valid() { return ${EXIT_FALSE} } +wireless_channel_bandwidth_is_valid() { + local mode="${1}" + assert isset mode + + local bandwidth="${2}" + assert isset bandwidth + + local bandwidths="${WIRELESS_CHANNEL_BANDWIDTHS["${mode}"]}" + + list_match "${bandwidth}" ${bandwidths} +} + +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 @@ -321,8 +373,53 @@ 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() { + local psk="${1}" + + # Length of the PSK + local l="${#psk}" + + # For WPA*, the key must be between 8 and 63 chars + if [ ${l} -lt 8 ] || [ ${l} -gt 63 ]; then + return ${EXIT_FALSE} + fi + + # Can only contain ASCII chararcters + if contains_non_ascii_characters "${psk}"; then + return ${EXIT_FALSE} + fi + + # Seems OK + return ${EXIT_TRUE} +} + +wireless_client_is_connected() { + local device="${1}" + + device_has_carrier "${device}" } wireless_ibss_join() { @@ -414,3 +511,61 @@ wireless_monitor() { return ${EXIT_OK} } + +wireless_get_ht_caps() { + local device="${1}" + assert isset device + + local phy="$(device_get_phy "${device}")" + if ! isset phy; then + log ERROR "Could not determine PHY for ${device}" + return ${EXIT_ERROR} + fi + + network-phy-list-ht-caps "${phy}" +} + +wireless_get_vht_caps() { + local device="${1}" + assert isset device + + local phy="$(device_get_phy "${device}")" + if ! isset phy; then + log ERROR "Could not determine PHY for ${device}" + return ${EXIT_ERROR} + fi + + network-phy-list-vht-caps "${phy}" +} + +wireless_supports_acs() { + local device="${1}" + assert isset device + + local phy="$(device_get_phy "${device}")" + if ! isset phy; then + log ERROR "Could not determine PHY for ${device}" + return ${EXIT_ERROR} + fi + + phy_supports_acs "${phy}" +} + +wireless_supports_dfs() { + local device="${1}" + assert isset device + + local phy="$(device_get_phy "${device}")" + if ! isset phy; then + log ERROR "Could not determine PHY for ${device}" + return ${EXIT_ERROR} + fi + + phy_supports_dfs "${phy}" +} + +wireless_environment_is_valid() { + local environment="${1}" + + list_match "${environment}" "${WIRELESS_ENVIRONMENTS[@]}" +}