mac80211: use wpa_supplicant for unencrypted connections to improve client mode relia...
[openwrt.git] / package / hostapd / files / wpa_supplicant.sh
1 wpa_supplicant_setup_vif() {
2         local vif="$1"
3         local driver="$2"
4         local key="$key"
5
6         # wpa_supplicant should use wext for mac80211 cards
7         [ "$driver" = "mac80211" ] && driver='wext'
8
9         # make sure we have the psk
10         [ -n "$key" ] || {
11                 config_get key "$vif" key
12         }
13
14         case "$enc" in
15                 *none*)
16                         key_mgmt='NONE'
17                 ;;
18                 *wep*)
19                         key_mgmt='NONE'
20                         config_get key "$vif" key
21                         key="${key:-1}"
22                         case "$key" in
23                                 [1234])
24                                         for idx in 1 2 3 4; do
25                                                 local zidx
26                                                 zidx=$(($idx - 1))
27                                                 config_get ckey "$vif" "key${idx}"
28                                                 [ -n "$ckey" ] && \
29                                                         append "wep_key${zidx}" "wep_key${zidx}=$(prepare_key_wep "$ckey")"
30                                         done
31                                         wep_tx_keyidx="wep_tx_keyidx=$((key - 1))"
32                                 ;;
33                                 *)
34                                         wep_key0="wep_key0=$(prepare_key_wep "$key")"
35                                         wep_tx_keyidx="wep_tx_keyidx=0"
36                                 ;;
37                         esac
38                 ;;
39                 *psk*)
40                         key_mgmt='WPA-PSK'
41                         config_get_bool usepassphrase "$vif" passphrase 1
42                         case "$enc" in
43                                 *psk2*)
44                                         proto='proto=RSN'
45                                         if [ "$usepassphrase" = "1" ]; then
46                                                 passphrase="psk=\"${key}\""
47                                         else
48                                                 passphrase="psk=${key}"
49                                         fi
50                                 ;;
51                                 *psk*)
52                                         proto='proto=WPA'
53                                         if [ "$usepassphrase" = "1" ]; then
54                                                 passphrase="psk=\"${key}\""
55                                         else
56                                                 passphrase="psk=${key}"
57                                         fi
58                                 ;;
59                         esac
60                 ;;
61                 *wpa*|*8021x*)
62                         proto='proto=WPA2'
63                         key_mgmt='WPA-EAP'
64                         config_get ca_cert "$vif" ca_cert
65                         ca_cert=${ca_cert:+"ca_cert=\"$ca_cert\""}
66                         case "$eap_type" in
67                                 tls)
68                                         pairwise='pairwise=CCMP'
69                                         group='group=CCMP'
70                                         config_get priv_key "$vif" priv_key
71                                         config_get priv_key_pwd "$vif" priv_key_pwd
72                                         priv_key="private_key=\"$priv_key\""
73                                         priv_key_pwd="private_key_passwd=\"$priv_key_pwd\""
74                                 ;;
75                                 peap|ttls)
76                                         config_get auth "$vif" auth
77                                         config_get identity "$vif" identity
78                                         config_get password "$vif" password
79                                         phase2="phase2=\"auth=${auth:-MSCHAPV2}\""
80                                         identity="identity=\"$identity\""
81                                         password="password=\"$password\""
82                                 ;;
83                         esac
84                         eap_type="eap=$(echo $eap_type | tr 'a-z' 'A-Z')"
85                 ;;
86         esac
87         config_get ifname "$vif" ifname
88         config_get bridge "$vif" bridge
89         config_get ssid "$vif" ssid
90         config_get bssid "$vif" bssid
91         bssid=${bssid:+"bssid=$bssid"}
92         rm -rf /var/run/wpa_supplicant-$ifname
93         cat > /var/run/wpa_supplicant-$ifname.conf <<EOF
94 ctrl_interface=/var/run/wpa_supplicant-$ifname
95 network={
96         scan_ssid=1
97         ssid="$ssid"
98         $bssid
99         key_mgmt=$key_mgmt
100         $proto
101         $passphrase
102         $pairwise
103         $group
104         $eap_type
105         $ca_cert
106         $priv_key
107         $priv_key_pwd
108         $phase2
109         $identity
110         $password
111         $wep_key0
112         $wep_key1
113         $wep_key2
114         $wep_key3
115         $wep_tx_keyidx
116 }
117 EOF
118         [ -z "$proto" -a "$key_mgmt" != "NONE" ] || \
119                 wpa_supplicant ${bridge:+ -b $bridge} -B -P "/var/run/wifi-${ifname}.pid" -D ${driver:-wext} -i "$ifname" -c /var/run/wpa_supplicant-$ifname.conf
120 }