Pārlūkot izejas kodu

mac80211: always use wpa_supplicant for client connections (patch by Stijn Tintel)

Since client mode in mac80211is unreliable without using wpa_supplicant,
it would be better to enable wpa_supplicant by default.

With this patch, wpa_supplicant will always be used for mac80211-based
drivers in client mode. This will break client mode for images that
don't include wpa_supplicant or wpad, so maybe I need to add a check
somewhere to see if wpa_supplicant is available, and show the user a
warning if he tries client mode without wpa_supplicant. Suggestions on
where to add this check are welcome.

Tested with ath5k in client mode on open and wpa2-psk network, and
tested on my ath9k based AP as well to make sure it doesn't break AP mode.

SVN-Revision: 19718
Felix Fietkau 16 gadi atpakaļ
vecāks
revīzija
d692a2340c

+ 4 - 1
package/hostapd/files/wpa_supplicant.sh

@@ -6,7 +6,10 @@ wpa_supplicant_setup_vif() {
 	# wpa_supplicant should use wext for mac80211 cards
 	[ "$driver" = "mac80211" ] && driver='wext'
 
-	# make sure we have the psk
+	# make sure we have the encryption type and the psk
+	[ -n "$enc" ] || {
+		config_get enc "$vif" encryption
+	}
 	[ -n "$key" ] || {
 		config_get key "$vif" key
 	}

+ 21 - 97
package/mac80211/files/lib/wifi/mac80211.sh

@@ -234,7 +234,6 @@ enable_mac80211() {
 		}
 		config_set "$vif" ifname "$ifname"
 
-		config_get enc "$vif" encryption
 		config_get mode "$vif" mode
 		config_get ssid "$vif" ssid
 
@@ -288,60 +287,19 @@ enable_mac80211() {
 		[ "$mode" = "ap" ] || ifconfig "$ifname" hw ether "$vif_mac"
 		config_set "$vif" macaddr "$vif_mac"
 
-		# Valid values are:
-		# wpa / wep / none
-		#
 		# !! ap !!
 		#
 		# ALL ap functionality will be passed to hostapd
 		#
-		# !! mesh / adhoc / station !!
-		# none -> NO encryption
+		# !! station !!
 		#
-		# wep + keymgmt = '' -> we use iw to connect to the
-		# network.
+		# ALL station functionality will be passed to wpa_supplicant
 		#
-		# wep + keymgmt = 'NONE' -> wpa_supplicant will be
-		# configured to handle the wep connection
 		if [ ! "$mode" = "ap" ]; then
 			# We attempt to set the channel for all interfaces, although
 			# mac80211 may not support it or the driver might not yet
 			# for ap mode this is handled by hostapd
 			[ -n "$fixed" -a -n "$channel" ] && iw dev "$ifname" set channel "$channel"
-
-			local key keystring
-
-			case "$enc" in
-				*none*)
-					config_get keymgmt "$vif" keymgmt
-				;;
-				*wep*)
-					config_get keymgmt "$vif" keymgmt
-					if [ -z "$keymgmt" ]; then
-						config_get key "$vif" key
-						key="${key:-1}"
-						case "$key" in
-							[1234])
-								for idx in 1 2 3 4; do
-									local zidx
-									zidx=$(($idx - 1))
-									config_get ckey "$vif" "key${idx}"
-									if [ -n "$ckey" ]; then
-										[ $idx -eq $key ] && zidx="d:${zidx}"
-										append keystring "${zidx}:$(prepare_key_wep "$ckey")"
-									fi
-								done
-								;;
-							*)
-								keystring="d:0:$(prepare_key_wep "$key")"
-								;;
-						esac
-					fi
-				;;
-				*psk*|*wpa*)
-					config_get key "$vif" key
-				;;
-			esac
 		fi
 
 		# txpower is not yet implemented in iw
@@ -363,60 +321,26 @@ enable_mac80211() {
 
 		ifconfig "$ifname" up
 
-		[ "$mode" = "ap" ] || mac80211_start_vif "$vif" "$ifname"
-
-		case "$mode" in
-			adhoc)
-				config_get bssid "$vif" bssid
-				iw dev "$ifname" ibss join "$ssid" $freq ${fixed:+fixed-freq} $bssid
-			;;
-			sta|mesh)
-				config_get bssid "$vif" bssid
-				case "$enc" in
-					*wep*)
-						if [ -z "$keymgmt" ]; then
-							[ -n "$keystring" ] &&
-								iw dev "$ifname" connect "$ssid" ${fixed:+$freq} $bssid key $keystring
-						else
-							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
-						fi
-					;;
-					*wpa*|*psk*)
-						config_get key "$vif" key
-						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
-					;;
-					*)
-						if [ -z "$keymgmt" ]; then
-							iw dev "$ifname" connect "$ssid" ${fixed:+$freq} $bssid
-						else
-							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
-						fi
-					;;
-				esac
+		if [ ! "$mode" = "ap" ]; then
+			mac80211_start_vif "$vif" "$ifname"
 
-			;;
-		esac
+			case "$mode" in
+				adhoc)
+					config_get bssid "$vif" bssid
+					iw dev "$ifname" ibss join "$ssid" $freq ${fixed:+fixed-freq} $bssid
+				;;
+				sta)
+					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
+		fi
 	done
 
 	local start_hostapd=