diff --git a/package/mac80211/Makefile b/package/mac80211/Makefile index 63d7fff475..416507f9ed 100644 --- a/package/mac80211/Makefile +++ b/package/mac80211/Makefile @@ -70,4 +70,9 @@ define Build/UninstallDev rm -rf $(1)/usr/include/mac80211 endef +define KernelPackage/mac80211/install + $(INSTALL_DIR) $(1)/lib/wifi + $(INSTALL_DATA) ./files/lib/wifi/mac80211.sh $(1)/lib/wifi +endef + $(eval $(call KernelPackage,mac80211)) diff --git a/package/mac80211/files/lib/wifi/mac80211.sh b/package/mac80211/files/lib/wifi/mac80211.sh new file mode 100644 index 0000000000..39a7034abd --- /dev/null +++ b/package/mac80211/files/lib/wifi/mac80211.sh @@ -0,0 +1,195 @@ +#!/bin/sh +append DRIVERS "mac80211" + +scan_mac80211() { + local device="$1" + local adhoc sta ap + + config_get vifs "$device" vifs + for vif in $vifs; do + + config_get ifname "$vif" ifname + config_set "$vif" ifname "${ifname:-$device}" + + config_get mode "$vif" mode + case "$mode" in + adhoc|sta|ap) + append $mode "$vif" + ;; + *) echo "$device($vif): Invalid mode, ignored."; continue;; + esac + done + + config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${ahdemo:+$ahdemo }${sta:+$sta }${wds:+$wds }" +} + + +disable_mac80211() ( + local device="$1" + + set_wifi_down "$device" + # kill all running hostapd and wpa_supplicant processes that + # are running on atheros vifs + for pid in `pidof hostapd wpa_supplicant`; do + grep wlan /proc/$pid/cmdline >/dev/null && \ + kill $pid + done + + include /lib/network + cd /proc/sys/net + for dev in *; do + grep "$device" "$dev/%parent" >/dev/null 2>/dev/null && { + ifconfig "$dev" down + unbridge "$dev" + } + done + return 0 +) + +enable_mac80211() { + local device="$1" + config_get channel "$device" channel + config_get vifs "$device" vifs + + local first=1 + for vif in $vifs; do + config_get ifname "$vif" ifname + config_get enc "$vif" encryption + config_get mode "$vif" mode + + config_get ifname "$vif" ifname + [ $? -ne 0 ] && { + echo "enable_mac80211($device): Failed to set up $mode vif $ifname" >&2 + continue + } + config_set "$vif" ifname "$ifname" + + [ "$first" = 1 ] && { + # only need to change freq band and channel on the first vif + iwconfig "$ifname" channel "$channel" >/dev/null 2>/dev/null + ifconfig "$ifname" up + sleep 1 + iwconfig "$ifname" channel "$channel" >/dev/null 2>/dev/null + } + + wpa= + case "$enc" in + WEP|wep) + for idx in 1 2 3 4; do + config_get key "$vif" "key${idx}" + iwconfig "$ifname" enc "[$idx]" "${key:-off}" + done + config_get key "$vif" key + key="${key:-1}" + case "$key" in + [1234]) iwconfig "$ifname" enc "[$key]";; + *) iwconfig "$ifname" enc "$key";; + esac + ;; + PSK|psk|PSK2|psk2) + config_get key "$vif" key + ;; + esac + + case "$mode" in + adhoc) + config_get addr "$vif" bssid + [ -z "$addr" ] || { + iwconfig "$ifname" ap "$addr" + } + ;; + esac + config_get ssid "$vif" ssid + + config_get txpwr "$vif" txpower + if [ -n "$txpwr" ]; then + iwconfig "$ifname" txpower "${txpwr%%.*}" + fi + + config_get frag "$vif" frag + if [ -n "$frag" ]; then + iwconfig "$ifname" frag "${frag%%.*}" + fi + + config_get rts "$vif" rts + if [ -n "$rts" ]; then + iwconfig "$ifname" rts "${rts%%.*}" + fi + + ifconfig "$ifname" up + iwconfig "$ifname" channel "$channel" >/dev/null 2>/dev/null + + local net_cfg bridge + net_cfg="$(find_net_config "$vif")" + [ -z "$net_cfg" ] || { + bridge="$(bridge_interface "$net_cfg")" + config_set "$vif" bridge "$bridge" + start_net "$ifname" "$net_cfg" + } + iwconfig "$ifname" essid "$ssid" + set_wifi_up "$vif" "$ifname" + case "$mode" in + ap) + if eval "type hostapd_setup_vif" 2>/dev/null >/dev/null; then + hostapd_setup_vif "$vif" devicescape || { + 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 + continue + } + fi + ;; + sta) + case "$enc" in + PSK|psk|PSK2|psk2) + case "$enc" in + PSK|psk) + proto='proto=WPA';; + PSK2|psk2) + proto='proto=RSN';; + esac + cat > /var/run/wpa_supplicant-$ifname.conf <&-); do + config_get type "$dev" type + [ "$type" = mac80211 ] && return + cat <