diff options
Diffstat (limited to 'src/lib/connections/wireless')
-rw-r--r-- | src/lib/connections/wireless | 137 |
1 files changed, 55 insertions, 82 deletions
diff --git a/src/lib/connections/wireless b/src/lib/connections/wireless index 135bec7..a3b324b 100644 --- a/src/lib/connections/wireless +++ b/src/lib/connections/wireless @@ -1,116 +1,89 @@ -#! /bin/bash -. /usr/lib/network/network +# Wireless connection support for netctl + . "$SUBR_DIR/8021x" +. "$SUBR_DIR/ip" . "$SUBR_DIR/rfkill" -wireless_up() { - PROFILE="$1" - load_profile "$PROFILE" - # Default settings - SECURITY=${SECURITY:-none} - WPA_DRIVER=${WPA_DRIVER:-nl80211,wext} +wireless_up() { + local config_file - enable_rf $INTERFACE $RFKILL $RFKILL_NAME || return 1 + if ! is_interface "$Interface"; then + report_error "Interface '$Interface' does not exist" + return 1 + fi - # Check if interface exists - is_interface "$INTERFACE" || { report_fail "interface $INTERFACE does not exist"; return 1; } + # Default settings + : ${Security:=none} + : ${WPADriver:=nl80211,wext} + : ${TimeoutWPA:=15} + + if [[ $RFKill ]]; then + enable_rf "$Interface" "$RFKill" || return 1 + fi - # Kill any lingering wpa_supplicants. - stop_wpa "$INTERFACE" &> /dev/null + # Kill any lingering WPA supplicants + WPAConfigFile= wpa_stop "$Interface" &> /dev/null - # Start wpa_supplicant - if [[ "$SECURITY" = "wpa-config" ]]; then - WPA_CONF="${WPA_CONF:-/etc/wpa_supplicant.conf}" + if [[ $Security == "wpa-config" ]]; then + : ${WPAConfigFile:=/etc/wpa_supplicant.conf} + config_file=$WPAConfigFile else - WPA_CONF=$(make_wpa_config_file $INTERFACE) + config_file=$(wpa_make_config_file "$Interface") + if [[ -z $config_file ]]; then + report_error "Could not create a wpa config file for interface '$Interface'" + bring_interface_down "$Interface" + return 1 + fi + printf "%s\n" "network={" "$(wpa_make_config_block)" "}" >> "$config_file" fi - report_debug wireless_up start_wpa "$INTERFACE" "$WPA_CONF" "$WPA_DRIVER" "$WPA_OPTS" - if ! start_wpa "$INTERFACE" "$WPA_CONF" "$WPA_DRIVER" "$WPA_OPTS"; then - report_fail "wpa_supplicant did not start, possible configuration error" + + # Start the WPA supplicant + if ! do_debug wpa_start "$Interface" "$WPADriver" "$config_file"; then + report_error "The WPA supplicant did not start for interface '$Interface'" + bring_interface_down "$Interface" return 1 fi - # Scan for network's existence first - if checkyesno "${SCAN:-no}"; then - report_debug wireless_up scanning - local OLDESSID="$ESSID" - if [[ -n "$AP" ]]; then - BSSID=$(wpa_find_ap "$INTERFACE" "$AP") - else - ESSID=$(wpa_find_essid "$INTERFACE" "$ESSID") - fi - if [[ $? -gt 0 ]]; then - report_fail "Wireless network \"$OLDESSID\" not present." - report_debug wireless_up stop_wpa "$INTERFACE" - stop_wpa "$INTERFACE" + if is_yes "${Scan:-no}"; then + if ! wpa_wait_while_state "$TimeoutWPA" "$Interface" "DISCONNECTED" "SCANNING"; then + report_error "Wireless network '$ESSID' (or access point) not present" + wpa_stop "$Interface" + bring_interface_down "$interface" return 1 fi fi - - # Build configuration file - case "$SECURITY" in - wpa-config) - ;; - none|wep|wpa|wpa-configsection) - printf "%s\n" "network={" "$(make_wpa_config)" "}" >> "$WPA_CONF" - report_debug wireless_up "Configuration generated at $WPA_CONF" - report_debug wireless_up wpa_reconfigure "$INTERFACE" - if ! wpa_reconfigure "$INTERFACE"; then - report_fail "WPA configuration failed!" - stop_wpa "$INTERFACE" - return 1 - fi - ;; - *) - report_fail "Invalid SECURITY setting: $SECURITY" - ;; - esac - + # Bring interface up after starting wpa_supplicant # This is important since cards such as iwl3945 do not support # mode switching when they are already up. - report_debug wireless_up ifup - bring_interface up "$INTERFACE" || return 1 + bring_interface_up "$Interface" || return 1 - report_debug wireless_up wpa_check - if ! wpa_check "$INTERFACE" "$TIMEOUT"; then - report_fail "WPA Authentication/Association Failed" + if ! wpa_wait_until_state "$TimeoutWPA" "$Interface" "COMPLETED"; then + report_error "WPA association/authentication failed for interface '$Interface'" + wpa_stop "$Interface" + bring_interface_down "$Interface" return 1 fi - if ! "$CONN_DIR/ethernet" up "$PROFILE"; then - wireless_down "$PROFILE" YES + if ! ip_set; then + wpa_stop "$Interface" + bring_interface_down "$Interface" return 1 fi } -# wireless_down PROFILE [ LEAVE ifconfig up? default no ] wireless_down() { - local PROFILE="$1" - load_profile "$PROFILE" - - "$CONN_DIR/ethernet" down "$PROFILE" - - # The config file can contain a non-standard control socket path - if [[ "$SECURITY" = "wpa-config" ]]; then - WPA_CONF="${WPA_CONF:-/etc/wpa_supplicant.conf}" + ip_unset + if [[ $Security == "wpa-config" ]]; then + : ${WPAConfigFile:=/etc/wpa_supplicant.conf} fi - report_debug wireless_down stop_wpa "$INTERFACE" - stop_wpa "$INTERFACE" - rm -rf "$STATE_DIR/wpa.$INTERFACE" - - bring_interface down "$INTERFACE" - - # Handle wireless kill switches - # Any reason why a hardware switch should be considered on interface down? - if [[ "$RFKILL" == "soft" ]]; then - set_rf_state "$INTERFACE" disabled $RFKILL_NAME || return 1 + wpa_stop "$Interface" + bring_interface_down "$Interface" || return 1 + if [[ $RFKill ]]; then + disable_rf "$Interface" "$RFKill" fi } -wireless_$1 "$2" "$3" -exit $? # vim: ft=sh ts=4 et sw=4 tw=0: - |