madwifi.sh 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #!/bin/sh
  2. append DRIVERS "atheros"
  3. scan_atheros() {
  4. local device="$1"
  5. local wds
  6. local adhoc sta ap
  7. config_get vifs "$device" vifs
  8. for vif in $vifs; do
  9. config_get ifname "$vif" ifname
  10. config_set "$vif" ifname "${ifname:-ath}"
  11. config_get mode "$vif" mode
  12. case "$mode" in
  13. adhoc|sta|ap)
  14. append $mode "$vif"
  15. ;;
  16. wds)
  17. config_get addr "$vif" bssid
  18. config_get ssid "$vif" ssid
  19. [ -z "$addr" -a -n "$ssid" ] && {
  20. config_set "$vif" wds 1
  21. config_set "$vif" mode sta
  22. mode="sta"
  23. addr="$ssid"
  24. }
  25. ${addr:+append $mode "$vif"}
  26. ;;
  27. *) echo "$device($vif): Invalid mode, ignored."; continue;;
  28. esac
  29. done
  30. case "${adhoc:+1}:${sta:+1}:${ap+1}" in
  31. # valid mode combinations
  32. 1::) wds="";;
  33. :1:1)config_set "$device" nosbeacon 1;; # AP+STA, can't use beacon timers for STA
  34. :1:);;
  35. ::1);;
  36. ::);;
  37. *) echo "$device: Invalid mode combination in config"; return 1;;
  38. esac
  39. config_set "$device" vifs "${ap:+$ap }${adhoc:+$adhoc }${sta:+$sta }${wds:+$wds }"
  40. }
  41. disable_atheros() (
  42. local device="$1"
  43. # kill all running hostapd and wpa_supplicant processes that
  44. # are running on atheros vifs
  45. for pid in `pidof hostapd wpa_supplicant`; do
  46. grep ath /proc/$pid/cmdline >/dev/null && \
  47. kill $pid
  48. done
  49. include /lib/network
  50. cd /proc/sys/net
  51. for dev in *; do
  52. grep "$device" "$dev/%parent" >/dev/null 2>/dev/null && {
  53. ifconfig "$dev" down
  54. unbridge "$dev"
  55. wlanconfig "$dev" destroy
  56. }
  57. done
  58. return 0
  59. )
  60. enable_atheros() {
  61. config_get channel "$device" channel
  62. config_get vifs "$device" vifs
  63. disable_atheros "$device"
  64. local first=1
  65. for vif in $vifs; do
  66. nosbeacon=
  67. config_get ifname "$vif" ifname
  68. config_get enc "$vif" encryption
  69. config_get mode "$vif" mode
  70. [ "$mode" = sta ] && config_get nosbeacon "$device" nosbeacon
  71. config_get ifname "$vif" ifname
  72. ifname=$(wlanconfig "$ifname" create wlandev "$device" wlanmode "$mode" ${nosbeacon:+nosbeacon})
  73. [ $? -ne 0 ] && {
  74. echo "enable_atheros($device): Failed to set up $mode vif $ifname" >&2
  75. continue
  76. }
  77. config_set "$vif" ifname "$ifname"
  78. [ "$first" = 1 ] && {
  79. # only need to change freq band and channel on the first vif
  80. config_get "$device" mode
  81. pureg=0
  82. case "$mode" in
  83. *b) mode=11b;;
  84. *bg) mode=11g;;
  85. *g) mode=11g; pureg=1;;
  86. *a) mode=11a;;
  87. *) mode=11g;;
  88. esac
  89. iwconfig "$ifname" channel 0
  90. iwpriv "$ifname" mode "$mode"
  91. iwpriv "$ifname" pureg "$pureg"
  92. iwconfig "$ifname" channel "$channel"
  93. }
  94. config_get wds "$vif" wds
  95. case "$wds" in
  96. 1|on|enabled) wds=1;;
  97. *) wds=0;;
  98. esac
  99. iwpriv "$ifname" wds "$wds"
  100. wpa=
  101. case "$enc" in
  102. WEP|wep)
  103. for idx in 1 2 3 4; do
  104. config_get key "$vif" "key${idx}"
  105. iwconfig "$ifname" enc "[$idx]" "${key:-off}"
  106. done
  107. config_get key "$vif" key
  108. iwconfig "$ifname" enc "[${key:-1}]"
  109. ;;
  110. esac
  111. case "$mode" in
  112. wds)
  113. config_get addr "$vif" bssid
  114. iwpriv "$ifname" wds_add "$addr"
  115. ;;
  116. *)
  117. config_get ssid "$vif" ssid
  118. ;;
  119. esac
  120. ifconfig "$ifname" up
  121. local net_cfg bridge
  122. net_cfg="$(find_net_config "$vif")"
  123. [ -z "$net_cfg" ] || {
  124. bridge="$(bridge_interface "$net_cfg")"
  125. config_set "$vif" bridge "$bridge"
  126. start_net "$ifname" "$net_cfg"
  127. }
  128. iwconfig "$ifname" essid "$ssid"
  129. case "$mode" in
  130. ap)
  131. hostapd_setup_vif "$vif" madwifi || {
  132. echo "enable_atheros($device): Failed to set up wpa for interface $ifname" >&2
  133. # make sure this wifi interface won't accidentally stay open without encryption
  134. ifconfig "$ifname" down
  135. wlanconfig "$ifname" destroy
  136. continue
  137. }
  138. ;;
  139. wds|sta)
  140. # FIXME: implement wpa_supplicant calls here
  141. ;;
  142. esac
  143. first=0
  144. done
  145. }
  146. detect_atheros() {
  147. cd /proc/sys/dev
  148. [ -d ath ] || return
  149. for dev in wifi*; do
  150. config_get type "$dev" type
  151. [ "$type" = atheros ] && return
  152. cat <<EOF
  153. config wifi-device $dev
  154. option type atheros
  155. option channel 5
  156. config wifi-iface
  157. option device $dev
  158. # option network lan
  159. option mode ap
  160. option ssid OpenWrt
  161. option hidden 0
  162. option encryption none
  163. EOF
  164. done
  165. }