summaryrefslogtreecommitdiffstats
path: root/src/wireless
blob: 85743bf4dd38ecc75db3d098a4c41017a766d747 (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
81
82
83
84
85
86
87
88
89
90
# Uses wireless_tools, to check for association to a network.
# wep_check interface [timeout]
wep_check()
{
    local INTERFACE="$1" TIMEOUT="${2:-15}" timeout=0 bssid

    while [[ $timeout -lt "$TIMEOUT" ]]; do
        bssid=$(iwgetid "$INTERFACE" -ra)
        [[ -n "$bssid" && "$bssid" != "00:00:00:00:00:00" ]] && return 0
        sleep 1
        let timeout++
    done
    return 1
}

set_rf_state() {
    local INTERFACE="$1" state="$2" RFKILL_NAME="$3"

    if [[ "$RFKILL" == "hard" ]]; then
        report_fail "Cannot set state on hardware rfkill switch"
        return 1
    fi
    local path=$(get_rf_path "$INTERFACE" "$RFKILL_NAME") || return 1
    case "$state" in
        enabled)
            echo 1 > "$path/state"
        ;;
        disabled)
            echo 0 > "$path/state"
        ;;
    esac
}

get_rf_path() {
    local INTERFACE="$1" RFKILL_NAME="$2" path

    if [[ -n "$RFKILL_NAME" ]]; then
        for path in /sys/class/rfkill/*; do
            if [[ "$(cat "$path/name")" == "$RFKILL_NAME" ]]; then
                echo "$path"
                return 0
            fi
        done
        report_fail "no rfkill switch with name $RFKILL_NAME"
    else
        path="/sys/class/net/$INTERFACE/rfkill"
        if [[ -d "$path" ]]; then
            echo "$path"
            return 0
        fi
        report_fail "no rfkill switch available on interface $INTERFACE"
    fi
    return 1
}

get_rf_state() {
    local INTERFACE="$1" PROFILE="$2" path state

    path=$(get_rf_path "$INTERFACE" "$RFKILL_NAME") || return 1
    state=$(cat "$path/state")

    case "$state" in
        0|2)
            echo "disabled";;
        1)
            echo "enabled";;
        *)
            echo "$state";;
    esac
}

enable_rf() {
    local INTERFACE="$1" RFKILL="$2" RFKILL_NAME="$3"
    # Enable rfkill if necessary, or fail if it is hardware
    if [[ -n "$RFKILL" ]]; then
        local state=$(get_rf_state "$INTERFACE") || return 1
        if [[ "$state" != "enabled" ]]; then
            if [[ "$RFKILL" == "soft" ]]; then
                set_rf_state "$INTERFACE" enabled $RFKILL_NAME
                sleep 1
            else
                report_fail "radio is disabled on $INTERFACE"
                return 1
            fi
        fi
    fi
}

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