wpa_supplicant.sh 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. wpa_supplicant_setup_vif() {
  2. local vif="$1"
  3. local driver="$2"
  4. local key="$key"
  5. local options="$3"
  6. local freq=""
  7. [ -n "$4" ] && freq="frequency=$4"
  8. # wpa_supplicant should use wext for mac80211 cards
  9. [ "$driver" = "mac80211" ] && driver='wext'
  10. # make sure we have the encryption type and the psk
  11. [ -n "$enc" ] || {
  12. config_get enc "$vif" encryption
  13. }
  14. [ -n "$key" ] || {
  15. config_get key "$vif" key
  16. }
  17. local net_cfg bridge
  18. config_get bridge "$vif" bridge
  19. [ -z "$bridge" ] && {
  20. net_cfg="$(find_net_config "$vif")"
  21. [ -z "$net_cfg" ] || bridge="$(bridge_interface "$net_cfg")"
  22. config_set "$vif" bridge "$bridge"
  23. }
  24. local mode ifname wds modestr=""
  25. config_get mode "$vif" mode
  26. config_get ifname "$vif" ifname
  27. config_get_bool wds "$vif" wds 0
  28. [ -z "$bridge" ] || [ "$mode" = ap ] || [ "$mode" = sta -a $wds -eq 1 ] || {
  29. echo "wpa_supplicant_setup_vif($ifname): Refusing to bridge $mode mode interface"
  30. return 1
  31. }
  32. [ "$mode" = "adhoc" ] && modestr="mode=1"
  33. key_mgmt='NONE'
  34. case "$enc" in
  35. *none*) ;;
  36. *wep*)
  37. config_get key "$vif" key
  38. key="${key:-1}"
  39. case "$key" in
  40. [1234])
  41. for idx in 1 2 3 4; do
  42. local zidx
  43. zidx=$(($idx - 1))
  44. config_get ckey "$vif" "key${idx}"
  45. [ -n "$ckey" ] && \
  46. append "wep_key${zidx}" "wep_key${zidx}=$(prepare_key_wep "$ckey")"
  47. done
  48. wep_tx_keyidx="wep_tx_keyidx=$((key - 1))"
  49. ;;
  50. *)
  51. wep_key0="wep_key0=$(prepare_key_wep "$key")"
  52. wep_tx_keyidx="wep_tx_keyidx=0"
  53. ;;
  54. esac
  55. ;;
  56. *psk*)
  57. key_mgmt='WPA-PSK'
  58. [ "$mode" = "adhoc" -a "$driver" != "nl80211" ] && key_mgmt='WPA-NONE'
  59. config_get_bool usepassphrase "$vif" usepassphrase 1
  60. if [ "$usepassphrase" = "1" ]; then
  61. passphrase="psk=\"${key}\""
  62. else
  63. passphrase="psk=${key}"
  64. fi
  65. case "$enc" in
  66. *psk2*)
  67. proto='proto=RSN'
  68. config_get ieee80211w "$vif" ieee80211w
  69. ;;
  70. *psk*)
  71. proto='proto=WPA'
  72. ;;
  73. esac
  74. ;;
  75. *wpa*|*8021x*)
  76. proto='proto=WPA2'
  77. key_mgmt='WPA-EAP'
  78. config_get ieee80211w "$vif" ieee80211w
  79. config_get ca_cert "$vif" ca_cert
  80. config_get eap_type "$vif" eap_type
  81. ca_cert=${ca_cert:+"ca_cert=\"$ca_cert\""}
  82. case "$eap_type" in
  83. tls)
  84. pairwise='pairwise=CCMP'
  85. group='group=CCMP'
  86. config_get identity "$vif" identity
  87. config_get client_cert "$vif" client_cert
  88. config_get priv_key "$vif" priv_key
  89. config_get priv_key_pwd "$vif" priv_key_pwd
  90. identity="identity=\"$identity\""
  91. client_cert="client_cert=\"$client_cert\""
  92. priv_key="private_key=\"$priv_key\""
  93. priv_key_pwd="private_key_passwd=\"$priv_key_pwd\""
  94. ;;
  95. peap|ttls)
  96. config_get auth "$vif" auth
  97. config_get identity "$vif" identity
  98. config_get password "$vif" password
  99. phase2="phase2=\"auth=${auth:-MSCHAPV2}\""
  100. identity="identity=\"$identity\""
  101. password="password=\"$password\""
  102. ;;
  103. esac
  104. eap_type="eap=$(echo $eap_type | tr 'a-z' 'A-Z')"
  105. ;;
  106. esac
  107. case "$ieee80211w" in
  108. [012])
  109. ieee80211w="ieee80211w=$ieee80211w"
  110. ;;
  111. esac
  112. config_get ifname "$vif" ifname
  113. config_get bridge "$vif" bridge
  114. config_get ssid "$vif" ssid
  115. config_get bssid "$vif" bssid
  116. bssid=${bssid:+"bssid=$bssid"}
  117. rm -rf /var/run/wpa_supplicant-$ifname
  118. cat > /var/run/wpa_supplicant-$ifname.conf <<EOF
  119. ctrl_interface=/var/run/wpa_supplicant-$ifname
  120. network={
  121. $modestr
  122. scan_ssid=1
  123. ssid="$ssid"
  124. $bssid
  125. key_mgmt=$key_mgmt
  126. $proto
  127. $freq
  128. $ieee80211w
  129. $passphrase
  130. $pairwise
  131. $group
  132. $eap_type
  133. $ca_cert
  134. $client_cert
  135. $priv_key
  136. $priv_key_pwd
  137. $phase2
  138. $identity
  139. $password
  140. $wep_key0
  141. $wep_key1
  142. $wep_key2
  143. $wep_key3
  144. $wep_tx_keyidx
  145. }
  146. EOF
  147. [ -z "$proto" -a "$key_mgmt" != "NONE" ] || \
  148. wpa_supplicant ${bridge:+ -b $bridge} -B -P "/var/run/wifi-${ifname}.pid" -D ${driver:-wext} -i "$ifname" -c /var/run/wpa_supplicant-$ifname.conf $options
  149. }