Root/package/base-files/files/sbin/wifi

1#!/bin/sh
2# Copyright (C) 2006 OpenWrt.org
3
4. /lib/functions.sh
5
6usage() {
7    cat <<EOF
8Usage: $0 [down|detect]
9enables (default), disables or detects a wifi configuration.
10EOF
11    exit 1
12}
13
14find_net_config() {(
15    local vif="$1"
16    local cfg
17    local ifname
18
19    config_get cfg "$vif" network
20
21    [ -z "$cfg" ] && {
22        include /lib/network
23        scan_interfaces
24
25        config_get ifname "$vif" ifname
26
27        cfg="$(find_config "$ifname")"
28    }
29    [ -z "$cfg" ] && return 0
30    echo "$cfg"
31)}
32
33
34bridge_interface() {(
35    local cfg="$1"
36    [ -z "$cfg" ] && return 0
37
38    include /lib/network
39    scan_interfaces
40
41    for cfg in $cfg; do
42        config_get iftype "$cfg" type
43        [ "$iftype" = bridge ] && config_get "$cfg" ifname
44        prepare_interface_bridge "$cfg"
45        return $?
46    done
47)}
48
49prepare_key_wep() {
50    local key="$1"
51    local hex=1
52
53    echo -n "$key" | grep -qE "[^a-fA-F0-9]" && hex=0
54    [ "${#key}" -eq 10 -a $hex -eq 1 ] || \
55    [ "${#key}" -eq 26 -a $hex -eq 1 ] || {
56        [ "${key:0:2}" = "s:" ] && key="${key#s:}"
57            key="$(echo -n "$key" | hexdump -ve '1/1 "%02x" ""')"
58    }
59    echo "$key"
60}
61
62wifi_fixup_hwmode() {
63    local device="$1"
64    local default="$2"
65    local hwmode hwmode_11n
66
67    config_get channel "$device" channel
68    config_get hwmode "$device" hwmode
69    case "$hwmode" in
70        11bg) hwmode=bg;;
71        11a) hwmode=a;;
72        11b) hwmode=b;;
73        11g) hwmode=g;;
74        11n*)
75            hwmode_11n="${hwmode##11n}"
76            case "$hwmode_11n" in
77                a|g) ;;
78                default) hwmode_11n="$default"
79            esac
80            config_set "$device" hwmode_11n "$hwmode_11n"
81        ;;
82        *)
83            hwmode=
84            if [ "${channel:-0}" -gt 0 ]; then
85                if [ "${channel:-0}" -gt 14 ]; then
86                    hwmode=a
87                else
88                    hwmode=g
89                fi
90            else
91                hwmode="$default"
92            fi
93        ;;
94    esac
95    config_set "$device" hwmode "$hwmode"
96}
97
98wifi_updown() {
99    [ enable = "$1" ] && {
100        wifi_updown disable "$2"
101        scan_wifi
102    }
103    for device in ${2:-$DEVICES}; do (
104        config_get disabled "$device" disabled
105        [ 1 == "$disabled" ] && {
106            echo "'$device' is disabled"
107            set disable
108        }
109        config_get iftype "$device" type
110        if eval "type ${1}_$iftype" 2>/dev/null >/dev/null; then
111            eval "scan_$iftype '$device'"
112            eval "${1}_$iftype '$device'" || echo "$device($iftype): ${1} failed"
113        else
114            echo "$device($iftype): Interface type not supported"
115        fi
116    ); done
117}
118
119wifi_detect() {
120    for driver in ${2:-$DRIVERS}; do (
121        if eval "type detect_$driver" 2>/dev/null >/dev/null; then
122            eval "detect_$driver" || echo "$driver: Detect failed" >&2
123        else
124            echo "$driver: Hardware detection not supported" >&2
125        fi
126    ); done
127}
128
129start_net() {(
130    local iface="$1"
131    local config="$2"
132    local vifmac="$3"
133
134    [ -f "/var/run/$iface.pid" ] && kill "$(cat /var/run/${iface}.pid)" 2>/dev/null
135    [ -z "$config" ] || {
136        include /lib/network
137        scan_interfaces
138        for config in $config; do
139            setup_interface "$iface" "$config" "" "$vifmac"
140        done
141    }
142)}
143
144set_wifi_up() {
145    local cfg="$1"
146    local ifname="$2"
147    uci_set_state wireless "$cfg" up 1
148    uci_set_state wireless "$cfg" ifname "$ifname"
149}
150
151set_wifi_down() {
152    local cfg="$1"
153    local vifs vif vifstr
154
155    [ -f "/var/run/wifi-${cfg}.pid" ] &&
156        kill "$(cat "/var/run/wifi-${cfg}.pid")" 2>/dev/null
157    uci_revert_state wireless "$cfg"
158    config_get vifs "$cfg" vifs
159    for vif in $vifs; do
160        uci_revert_state wireless "$vif"
161    done
162}
163
164scan_wifi() {
165    local cfgfile="$1"
166    DEVICES=
167    config_cb() {
168        local type="$1"
169        local section="$2"
170
171        # section start
172        case "$type" in
173            wifi-device)
174                append DEVICES "$section"
175                config_set "$section" vifs ""
176                config_set "$section" ht_capab ""
177            ;;
178        esac
179
180        # section end
181        config_get TYPE "$CONFIG_SECTION" TYPE
182        case "$TYPE" in
183            wifi-iface)
184                config_get device "$CONFIG_SECTION" device
185                config_get vifs "$device" vifs
186                append vifs "$CONFIG_SECTION"
187                config_set "$device" vifs "$vifs"
188            ;;
189        esac
190    }
191    config_load "${cfgfile:-wireless}"
192}
193
194DEVICES=
195DRIVERS=
196include /lib/wifi
197scan_wifi
198
199case "$1" in
200    down) wifi_updown "disable" "$2";;
201    detect) wifi_detect "$2";;
202    --help|help) usage;;
203    *) wifi_updown "enable" "$2";;
204esac
205

Archive Download this file



interactive