X-Git-Url: https://git.rohieb.name/openwrt.git/blobdiff_plain/a8d1b57faceab921a87f5991fc9a30920faf7afd..7355d4d68bc5352ec20e670fbb2ed11f7bcabf30:/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 3f85864ec..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|monitor) + 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 }${monitor:+$monitor}" + 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,15 +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 + 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 @@ -74,6 +77,13 @@ enable_mac80211() { sleep 1 iwconfig "$ifname" mode ad-hoc >/dev/null 2>/dev/null fi + # 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 } @@ -82,7 +92,7 @@ enable_mac80211() { else iwconfig "$ifname" mode $mode >/dev/null 2>/dev/null fi - + wpa= case "$enc" in WEP|wep) @@ -105,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 @@ -128,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")" @@ -160,8 +171,15 @@ enable_mac80211() { } 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 }