X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/f576d0728764dac0f254b6b6e088aa368374bc84..6262f561d3cbc0d63a39ba8e059ffd38cae20a8e:/package/mac80211/files/lib/wifi/mac80211.sh diff --git a/package/mac80211/files/lib/wifi/mac80211.sh b/package/mac80211/files/lib/wifi/mac80211.sh index a2e6c685c..2721e4d7c 100644 --- a/package/mac80211/files/lib/wifi/mac80211.sh +++ b/package/mac80211/files/lib/wifi/mac80211.sh @@ -4,23 +4,23 @@ append DRIVERS "mac80211" scan_mac80211() { local device="$1" local adhoc sta ap - + config_get vifs "$device" vifs for vif in $vifs; do - + config_get ifname "$vif" ifname config_set "$vif" ifname "${ifname:-$device}" - + config_get mode "$vif" mode case "$mode" in - adhoc|sta|ap) + adhoc|sta|ap|monitor|mesh) 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 }${mesh:+$mesh}" } @@ -29,17 +29,17 @@ disable_mac80211() ( set_wifi_down "$device" # kill all running hostapd and wpa_supplicant processes that - # are running on atheros/mac80211 vifs + # are running on atheros/mac80211 vifs for pid in `pidof hostapd wpa_supplicant`; do grep wlan /proc/$pid/cmdline >/dev/null && \ kill $pid done - + include /lib/network cd /proc/sys/net for dev in *; do grep "$device" "$dev/%parent" >/dev/null 2>/dev/null && { - ifconfig "$dev" down + ifconfig "$dev" down unbridge "$dev" } done @@ -50,13 +50,18 @@ enable_mac80211() { local device="$1" config_get channel "$device" channel config_get vifs "$device" vifs - + config_get txpower "$device" txpower + local first=1 + local mesh_idx=0 + wifi_fixup_hwmode "$device" "g" for vif in $vifs; do + ifconfig "$ifname" down 2>/dev/null 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 [ $? -ne 0 ] && { echo "enable_mac80211($device): Failed to set up $mode vif $ifname" >&2 @@ -72,11 +77,22 @@ enable_mac80211() { sleep 1 iwconfig "$ifname" mode ad-hoc >/dev/null 2>/dev/null fi - ifconfig "$ifname" up + # mesh interface should be created only for the first interface + if [ "$mode" = mesh ]; then + config_get mesh_id "$vif" mesh_id + if [ -n "$mesh_id" ]; then + iw dev "$ifname" interface add msh$mesh_idx type mp mesh_id $mesh_id + fi + fi 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 WEP|wep) @@ -99,17 +115,18 @@ enable_mac80211() { case "$mode" in adhoc) config_get addr "$vif" bssid - [ -z "$addr" ] || { + [ -z "$addr" ] || { iwconfig "$ifname" ap "$addr" } ;; esac config_get ssid "$vif" ssid - config_get txpwr "$vif" txpower - if [ -n "$txpwr" ]; then - iwconfig "$ifname" txpower "${txpwr%%.*}" - fi + config_get vif_txpower "$vif" txpower + # use vif_txpower (from wifi-iface) to override txpower (from + # wifi-device) if the latter doesn't exist + txpower="${txpower:-$vif_txpower}" + [ -z "$txpower" ] || iwconfig "$ifname" txpower "${txpower%%.*}" config_get frag "$vif" frag if [ -n "$frag" ]; then @@ -122,7 +139,7 @@ enable_mac80211() { fi ifconfig "$ifname" up - iwconfig "$ifname" channel "$channel" >/dev/null 2>/dev/null + iwconfig "$ifname" channel "$channel" >/dev/null 2>/dev/null local net_cfg bridge net_cfg="$(find_net_config "$vif")" @@ -145,33 +162,24 @@ 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 </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 + ;; + mesh) + # special case where physical interface should be down for mesh to work + ifconfig "$ifname" down + ifconfig "msh$mesh_idx" up + iwlist msh$mesh_idx scan 2>/dev/null >/dev/null ;; esac first=0 + mesh_idx=$(expr $mesh_idx + 1) done }