summaryrefslogtreecommitdiffstats
path: root/src/lib/connections/wireless
blob: 6e4386417386ec431bdeb0595c223d5cdafc8fd8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# Wireless connection support for netctl

. "$SUBR_DIR/ip"
. "$SUBR_DIR/wpa"
. "$SUBR_DIR/rfkill"


wireless_up() {
    local config_file

    if ! is_interface "$Interface"; then
        report_error "Interface '$Interface' does not exist"
        return 1
    fi

    # Default settings
    : ${Security:=none}
    : ${WPADriver:=nl80211,wext}
    : ${TimeoutWPA:=15}

    if [[ $RFKill ]]; then
        rf_enable "$Interface" "$RFKill" || return 1
    fi

    # Kill any lingering WPA supplicants
    WPAConfigFile= wpa_stop "$Interface" &> /dev/null

    if [[ $Security == "wpa-config" ]]; then
        : ${WPAConfigFile:=/etc/wpa_supplicant.conf}
        config_file=$WPAConfigFile
    else
        config_file=$(wpa_make_config_file "$Interface")
        if [[ -z $config_file ]]; then
            report_error "Could not create a wpa config file for interface '$Interface'"
            return 1
        fi
        printf "%s\n" "network={" "$(wpa_make_config_block)" "}" >> "$config_file"
    fi

    # 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

    # 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.
    bring_interface_up "$Interface" || return 1

    if ! wpa_wait_until_state "$TimeoutWPA" "$Interface" "COMPLETED"; then
        report_error "WPA association/authentication failed for interface '$Interface'"
        report_debug "WPA state for interface '$Interface': $(wpa_get_state "$Interface")"
        wpa_stop "$Interface"
        bring_interface_down "$Interface"
        return 1
    fi

    if ! ip_set; then
        wpa_stop "$Interface"
        bring_interface_down "$Interface"
        return 1
    fi
}

wireless_down() {
    ip_unset
    if [[ $Security == "wpa-config" ]]; then
        : ${WPAConfigFile:=/etc/wpa_supplicant.conf}
    fi
    wpa_stop "$Interface"
    bring_interface_down "$Interface" || return 1
    if [[ $RFKill ]]; then
        rf_disable "$Interface" "$RFKill"
    fi
}


# vim: ft=sh ts=4 et sw=4: