updated on Thu Jan 19 16:10:29 UTC 2012
[aur-mirror.git] / netcfg-rt73 / wirelessral.subr
blobea4b1575f679a936a1141e71ce1d7e01885c5887
1 #! /bin/bash
4 # Netcfg2 support for ralink wireless devices with WPA support.
5 # Author: Paulo Matias <matias at archlinux-br dot org>
8 # Uses wireless_tools, to check for association to a network.
9 # wep_check interface [timeout]
10 wep_check()
12 INTERFACE=$1; TIMEOUT=$2
14 [[ -z "$TIMEOUT" ]] && TIMEOUT=15
15 let timeout=0
16 while [[ $timeout -ne $TIMEOUT ]]; do
17 bssid=`iwgetid $INTERFACE -ra`
18 [[ ! "$bssid" = "00:00:00:00:00:00" ]] && return 0
19 sleep 1
20 let timeout++
21 done
23 err_append "Wireless association failed."
24 return 1
27 # Check if a particular network is within range
28 # find_essid interface essid
29 find_essid()
31 INTERFACE=$1; ESSID=$2; RETRIES=4
32 try=0;
33 while [[ $try -ne $RETRIES ]]; do
34 if iwlist $INTERFACE scan|sed "s/ESSID://g"|grep -q "\"$ESSID\""; then
35 return 0 # network found
37 sleep 0.5
38 let try++
39 done
40 return 1
43 # Return a filename containing a list of network ESSID's found.
44 # list_networks interface
45 list_networks()
47 # temp file used, as keeping ESSID's with spaces in their name in arrays
48 # is hard, obscure and kinda nasty. This is simpler and clearer.
50 [[ -z "$1" ]] && return 1
51 essids=$(mktemp /tmp/essid.XXXXX)
53 let try=0;
54 RETRIES=6;
55 while [[ $try -ne $RETRIES ]]; do
56 iwlist $1 scan 2> /dev/null|grep ESSID|sed 's/.*ESSID:"\([^"]\+\)".*/\1/' > $essids
57 sleep 0.5; let try++
58 done
59 sort -u $essids -o $essids
61 # File of 0 length, ie. no ssid's.
62 if [[ ! -s $essids ]]; then
63 return 1
66 echo $essids
67 return 0
70 wirelessral_up() {
72 load_profile $1
74 if [[ ! -d /sys/class/net/$INTERFACE/wireless ]]; then
75 err_append "Interface $INTERFACE is not a wireless interface"
76 return 1
79 # Required by ralink to enable device
80 ifconfig $INTERFACE up
82 # Helps ralink finding networks faster
83 iwlist $INTERFACE scan &> /dev/null
85 # Ensure we are not in monitor mode and start finding the essid
86 eval "iwconfig $INTERFACE mode managed essid \"$ESSID\""
88 if checkyesno $SCAN; then
89 if ! find_essid $INTERFACE "$ESSID"; then
90 err_append "Network unavailable"
91 return 1
92 fi
95 case $SECURITY in
96 wep|none)
97 # 'none' security uses iwconfig, like wep, so use same code, minus keysetting.
98 # Use sane default if no alternative is specified
99 if [[ "$SECURITY" = "wep" && "$WEP_OPTS" = "" ]]; then
100 WEP_OPTS="mode managed essid \"$ESSID\" key open $KEY"
101 elif [[ "$SECURITY" = "none" && "$WEP_OPTS" = "" ]]; then
102 WEP_OPTS="mode managed essid \"$ESSID\""
105 if ! eval iwconfig $INTERFACE $WEP_OPTS; then
106 err_append "Could not set wireless configuration"
107 return 1
110 wep_check $INTERFACE $TIMEOUT|| return 1
112 wpa)
113 # Temporary bugfix for broken drivers... http://bbs.archlinux.org/viewtopic.php?id=36384
114 if ! eval iwconfig $INTERFACE mode managed essid "\"$ESSID\""; then
115 err_append "Could not set wireless configuration"
116 return 1
119 if ! iwpriv $INTERFACE set AuthMode=WPAPSK; then
120 err_append "Could not set interface in WPA mode"
121 return 1
124 if [ -z "$ENCRYPTYPE" ]; then
125 ENCRYPTYPE="TKIP"
128 if ! iwpriv $INTERFACE set EncrypType=$ENCRYPTYPE; then
129 err_append "Could not set $ENCRYPTYPE encryption"
130 return 1
133 if ! iwpriv $INTERFACE set "WPAPSK=$KEY"; then
134 err_append "Could not set encryption key"
135 return 1
138 # Use same check as WEP - we are using wireless_tools
139 wep_check $INTERFACE $TIMEOUT || return 1
141 wpa-config)
142 err_append "wpa-config option not implemented"
143 return 1
145 esac
147 . $SUBR_DIR/ethernet.subr
148 if ! ethernet_up $1; then
149 wirelessral_down $1 YES
150 return 1
154 wirelessral_down() {
155 PROFILE=$1 NOETHERNETDOWN=$2
156 if ! checkyesno $2; then
157 . $SUBR_DIR/ethernet.subr
158 ethernet_down $1
160 iwconfig $INTERFACE essid off key off &> /dev/null
161 #ifconfig $INTERFACE down
164 wirelessral_clean_scope() {
165 unset INTERFACE CONNECTION
166 unset TIMEOUT WPA_CONF WPA_OPTS KEY ESSID SECURITY WEP_OPTS ENCRYPTYPE
167 . $SUBR_DIR/ethernet.subr
168 ethernet_clean_scope
172 # vim: set ts=4 et sw=4: