Fix putting mac80211 interfaces in monitor and managed modes
[openwrt-10.03/.git] / package / mac80211 / files / lib / wifi / mac80211.sh
index a2e6c685c06fcb6113f56cfedf71825e89f0f157..3f85864ec2ec60c9144c3b1b9cca7494a80a8c74 100644 (file)
@@ -13,14 +13,14 @@ scan_mac80211() {
                
                config_get mode "$vif" mode
                case "$mode" in
-                       adhoc|sta|ap)
+                       adhoc|sta|ap|monitor)
                                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 }"
+       config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${ahdemo:+$ahdemo }${sta:+$sta }${wds:+$wds }${monitor:+$monitor}"
 }
 
 
@@ -53,8 +53,10 @@ enable_mac80211() {
        
        local first=1
        for vif in $vifs; do
+               ifconfig "$ifname" down
                config_get ifname "$vif" ifname
                config_get enc "$vif" encryption
+               config_get eap_type "$vif" eap_type
                config_get mode "$vif" mode
                
                config_get ifname "$vif" ifname
@@ -72,10 +74,14 @@ enable_mac80211() {
                                sleep 1
                                iwconfig "$ifname" mode ad-hoc >/dev/null 2>/dev/null
                        fi
-                       ifconfig "$ifname" up
                        sleep 1
                        iwconfig "$ifname" channel "$channel" >/dev/null 2>/dev/null
                }
+               if [ "$mode" = sta ]; then
+                       iwconfig "$ifname" mode managed >/dev/null 2>/dev/null
+               else
+                       iwconfig "$ifname" mode $mode >/dev/null 2>/dev/null
+               fi
        
                wpa=
                case "$enc" in
@@ -145,30 +151,14 @@ enable_mac80211() {
                                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 <<EOF
-ctrl_interface=/var/run/wpa_supplicant
-network={
-       scan_ssid=1
-       ssid="$ssid"
-       key_mgmt=WPA-PSK
-       $proto
-       psk="$key"
-}
-EOF
-                                       ;;
-                                       WPA|wpa|WPA2|wpa2)
-                                               #add wpa_supplicant calls here
-                                       ;;
-                               esac
-                               [ -z "$proto" ] || wpa_supplicant ${bridge:+ -b $bridge} -B -D wext -i "$ifname" -c /var/run/wpa_supplicant-$ifname.conf
+                               if eval "type wpa_supplicant_setup_vif" 2>/dev/null >/dev/null; then
+                                       wpa_supplicant_setup_vif "$vif" wext || {
+                                               echo "enable_mac80211($device): Failed to set up wpa_supplicant for interface $ifname" >&2
+                                               # make sure this wifi interface won't accidentally stay open without encryption
+                                               ifconfig "$ifname" down
+                                               continue
+                                       }
+                               fi
                        ;;
                esac
                first=0