lots of enhancements for the madwifi script (hostapd calls for ap with wpa implemented, two kinds of wds support added - by essid or by bssid, various bugfixes)
SVN-Revision: 5888
This commit is contained in:
parent
6a30000485
commit
a5546e6c40
1 changed files with 125 additions and 36 deletions
|
@ -1,5 +1,4 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
set -x
|
|
||||||
append DRIVERS "atheros"
|
append DRIVERS "atheros"
|
||||||
|
|
||||||
scan_atheros() {
|
scan_atheros() {
|
||||||
|
@ -20,15 +19,22 @@ scan_atheros() {
|
||||||
;;
|
;;
|
||||||
wds)
|
wds)
|
||||||
config_get addr "$vif" bssid
|
config_get addr "$vif" bssid
|
||||||
${addr:+append wds "$addr"}
|
config_get ssid "$vif" ssid
|
||||||
|
[ -z "$addr" -a -n "$ssid" ] && {
|
||||||
|
config_set "$vif" wds 1
|
||||||
|
config_set "$vif" mode sta
|
||||||
|
mode="sta"
|
||||||
|
addr="$ssid"
|
||||||
|
}
|
||||||
|
${addr:+append $mode "$vif"}
|
||||||
;;
|
;;
|
||||||
*) echo "$device($vif): Invalid mode, ignored."; continue;;
|
*) echo "$device($vif): Invalid mode, ignored."; continue;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
case "${adhoc:+1}:${sta:+}:${ap+1}" in
|
case "${adhoc:+1}:${sta:+1}:${ap+1}" in
|
||||||
# valid mode combinations
|
# valid mode combinations
|
||||||
1::);;
|
1::) wds="";;
|
||||||
:1:1)config_set "$device" nosbeacon 1;; # AP+STA, can't use beacon timers for STA
|
:1:1)config_set "$device" nosbeacon 1;; # AP+STA, can't use beacon timers for STA
|
||||||
:1:);;
|
:1:);;
|
||||||
::1);;
|
::1);;
|
||||||
|
@ -36,30 +42,102 @@ scan_atheros() {
|
||||||
*) echo "$device: Invalid mode combination in config"; return 1;;
|
*) echo "$device: Invalid mode combination in config"; return 1;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${sta:+$sta }"
|
config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${sta:+$sta }${wds:+$wds }"
|
||||||
|
}
|
||||||
|
|
||||||
[ -z "$adhoc" ] && config_set "$device" wds "$wdsifs"
|
hostapd_setup_vif() {
|
||||||
|
local vif="$1"
|
||||||
|
local driver="$2"
|
||||||
|
local hostapd_cfg=
|
||||||
|
|
||||||
|
# Examples:
|
||||||
|
# psk-mixed/tkip => WPA1+2 PSK, TKIP
|
||||||
|
# wpa-psk2/tkip+aes => WPA2 PSK, CCMP+TKIP
|
||||||
|
# wpa2/tkip+aes => WPA2 RADIUS, CCMP+TKIP
|
||||||
|
# ...
|
||||||
|
|
||||||
|
# TODO: move this parsing function somewhere generic, so that
|
||||||
|
# later it can be reused by drivers that don't use hostapd
|
||||||
|
|
||||||
|
# crypto defaults: WPA2 vs WPA1
|
||||||
|
case "$enc" in
|
||||||
|
wpa2*|WPA2*|*PSK2*|*psk2*)
|
||||||
|
wpa=2
|
||||||
|
crypto="CCMP"
|
||||||
|
;;
|
||||||
|
*mixed*)
|
||||||
|
wpa=3
|
||||||
|
crypto="CCMP TKIP"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
wpa=1
|
||||||
|
crypto="TKIP"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# explicit override for crypto setting
|
||||||
|
case "$enc" in
|
||||||
|
*tkip+aes|*TKIP+AES|*tkip+ccmp|*TKIP+CCMP) crypto="CCMP TKIP";;
|
||||||
|
*tkip|*TKIP) crypto="TKIP";;
|
||||||
|
*aes|*AES|*ccmp|*CCMP) crypto="CCMP";;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# use crypto/auth settings for building the hostapd config
|
||||||
|
case "$enc" in
|
||||||
|
*psk*|*PSK*)
|
||||||
|
config_get psk "$vif" key
|
||||||
|
append hostapd_cfg "wpa_passphrase=$psk" "$N"
|
||||||
|
;;
|
||||||
|
*wpa*|*WPA*)
|
||||||
|
# FIXME: add wpa+radius here
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
return 0;
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
config_get ifname "$vif" ifname
|
||||||
|
config_get bridge "$vif" bridge
|
||||||
|
config_get ssid "$vif" ssid
|
||||||
|
cat > /var/run/hostapd-$ifname.conf <<EOF
|
||||||
|
driver=$driver
|
||||||
|
interface=$ifname
|
||||||
|
${bridge:+bridge=$bridge}
|
||||||
|
ssid=$ssid
|
||||||
|
debug=0
|
||||||
|
wpa=$wpa
|
||||||
|
wpa_pairwise=$crypto
|
||||||
|
$hostapd_cfg
|
||||||
|
EOF
|
||||||
|
hostapd -B /var/run/hostapd-$ifname.conf
|
||||||
}
|
}
|
||||||
|
|
||||||
disable_atheros() (
|
disable_atheros() (
|
||||||
local device="$1"
|
local device="$1"
|
||||||
|
|
||||||
|
# kill all running hostapd and wpa_supplicant processes that
|
||||||
|
# are running on atheros vifs
|
||||||
|
for pid in `pidof hostapd wpa_supplicant`; do
|
||||||
|
grep ath /proc/$pid/cmdline >/dev/null && \
|
||||||
|
kill $pid
|
||||||
|
done
|
||||||
|
|
||||||
include /lib/network
|
include /lib/network
|
||||||
cd /proc/sys/net
|
cd /proc/sys/net
|
||||||
for dev in *; do
|
for dev in *; do
|
||||||
grep "$device" "$dev/%parent" >/dev/null 2>/dev/null && {
|
grep "$device" "$dev/%parent" >/dev/null 2>/dev/null && {
|
||||||
ifconfig "$dev" down
|
ifconfig "$dev" down
|
||||||
unbridge "$dev"
|
unbridge "$dev"
|
||||||
wlanconfig $dev destroy
|
wlanconfig "$dev" destroy
|
||||||
}
|
}
|
||||||
done
|
done
|
||||||
|
return 0
|
||||||
)
|
)
|
||||||
|
|
||||||
enable_atheros() {
|
enable_atheros() {
|
||||||
config_get channel "$device" channel
|
config_get channel "$device" channel
|
||||||
config_get wds "$device" wds
|
|
||||||
config_get vifs "$device" vifs
|
config_get vifs "$device" vifs
|
||||||
|
|
||||||
|
disable_atheros "$device"
|
||||||
for vif in $vifs; do
|
for vif in $vifs; do
|
||||||
nosbeacon=
|
nosbeacon=
|
||||||
config_get ifname "$vif" ifname
|
config_get ifname "$vif" ifname
|
||||||
|
@ -70,12 +148,19 @@ enable_atheros() {
|
||||||
|
|
||||||
config_get ifname "$vif" ifname
|
config_get ifname "$vif" ifname
|
||||||
ifname=$(wlanconfig "$ifname" create wlandev "$device" wlanmode "$mode" ${nosbeacon:+nosbeacon})
|
ifname=$(wlanconfig "$ifname" create wlandev "$device" wlanmode "$mode" ${nosbeacon:+nosbeacon})
|
||||||
config_set "$vif" ifname "$ifname"
|
|
||||||
|
|
||||||
[ $? -ne 0 ] && {
|
[ $? -ne 0 ] && {
|
||||||
echo "enable_atheros($device): Failed to set up vif $ifname" >&2
|
echo "enable_atheros($device): Failed to set up $mode vif $ifname" >&2
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
config_set "$vif" ifname "$ifname"
|
||||||
|
|
||||||
|
config_get wds "$vif" wds
|
||||||
|
case "$wds" in
|
||||||
|
1|on|enabled) wds=1;;
|
||||||
|
*) wds=0;;
|
||||||
|
esac
|
||||||
|
iwpriv "$ifname" wds "$wds"
|
||||||
|
|
||||||
wpa=
|
wpa=
|
||||||
case "$enc" in
|
case "$enc" in
|
||||||
WEP|wep)
|
WEP|wep)
|
||||||
|
@ -84,42 +169,45 @@ enable_atheros() {
|
||||||
iwconfig "$ifname" enc "[$idx]" "${key:-off}"
|
iwconfig "$ifname" enc "[$idx]" "${key:-off}"
|
||||||
done
|
done
|
||||||
config_get key "$vif" key
|
config_get key "$vif" key
|
||||||
iwconfig "$ifname" enc "$key"
|
iwconfig "$ifname" enc "[${key:-1}]"
|
||||||
;;
|
|
||||||
esac
|
|
||||||
case "$mode" in
|
|
||||||
ap)
|
|
||||||
local hostapd_cfg=
|
|
||||||
case "$enc" in
|
|
||||||
*psk*|*PSK*)
|
|
||||||
# FIXME: wpa
|
|
||||||
;;
|
|
||||||
*wpa*|*WPA*)
|
|
||||||
# FIXME: add wpa+radius here
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
sta)
|
|
||||||
# FIXME: implement wpa_supplicant calls here
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
case "$mode" in
|
||||||
|
wds)
|
||||||
|
config_get addr "$vif" bssid
|
||||||
|
iwpriv "$ifname" wds_add "$addr"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
config_get ssid "$vif" ssid
|
config_get ssid "$vif" ssid
|
||||||
append if_up "iwconfig $ifname essid $ssid channel $channel" ";$N"
|
;;
|
||||||
append if_up "sleep 1" ";$N"
|
esac
|
||||||
append if_up "ifconfig $ifname up" ";$N"
|
iwconfig "$ifname" channel "$channel"
|
||||||
|
ifconfig "$ifname" up
|
||||||
|
|
||||||
local net_cfg bridge
|
local net_cfg bridge
|
||||||
net_cfg="$(find_net_config "$vif")"
|
net_cfg="$(find_net_config "$vif")"
|
||||||
[ -z "$net_cfg" ] || {
|
[ -z "$net_cfg" ] || {
|
||||||
bridge="$(bridge_interface "$net_cfg")"
|
bridge="$(bridge_interface "$net_cfg")"
|
||||||
append if_up "start_net '$ifname' '$net_cfg'" ";$N"
|
config_set "$vif" bridge "$bridge"
|
||||||
|
start_net "$ifname" "$net_cfg"
|
||||||
}
|
}
|
||||||
# TODO: start hostapd
|
case "$mode" in
|
||||||
|
ap)
|
||||||
|
hostapd_setup_vif "$vif" madwifi || {
|
||||||
|
echo "enable_atheros($device): Failed to set up wpa for interface $ifname" >&2
|
||||||
|
# make sure this wifi interface won't accidentally stay open without encryption
|
||||||
|
ifconfig "$ifname" down
|
||||||
|
wlanconfig "$ifname" destroy
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
;;
|
||||||
|
wds|sta)
|
||||||
|
iwconfig "$ifname" essid "$ssid"
|
||||||
|
# FIXME: implement wpa_supplicant calls here
|
||||||
|
;;
|
||||||
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
#killall -KILL $hostapd >&- 2>&-
|
|
||||||
eval "$if_up"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -136,6 +224,7 @@ config wifi-device $dev
|
||||||
|
|
||||||
config wifi-iface
|
config wifi-iface
|
||||||
option device $dev
|
option device $dev
|
||||||
|
# option network lan
|
||||||
option mode ap
|
option mode ap
|
||||||
option ssid OpenWrt
|
option ssid OpenWrt
|
||||||
option hidden 0
|
option hidden 0
|
||||||
|
|
Loading…
Reference in a new issue