From 50d6e92619545d014639c68ea327cf7c6dd38695 Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Sat, 16 Nov 2019 15:49:44 +0100 Subject: [PATCH 1/2] Revert "mac80211: restore mac80211_interface_cleanup()" This reverts commit 000b7687bc50be5b0f1161f4bf8ceb85c495c395. Signed-off-by: Daniel Golle --- .../files/lib/netifd/wireless/mac80211.sh | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh index 2b8b2d4677..5b174cded6 100644 --- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh +++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh @@ -814,13 +814,6 @@ mac80211_interface_cleanup() { mac80211_vap_cleanup hostapd "${primary_ap}" mac80211_vap_cleanup wpa_supplicant "$(uci -q -P /var/state get wireless._${phy}.splist)" - for wdev in $(list_phy_interfaces "$phy"); do - local wdev_phy="$(readlink /sys/class/net/${wdev}/phy80211)" - wdev_phy="$(basename "$wdev_phy")" - [ -n "$wdev_phy" -a "$wdev_phy" != "$phy" ] && continue - ip link set dev "$wdev" down 2>/dev/null - iw dev "$wdev" del - done } mac80211_set_noscan() { @@ -952,15 +945,6 @@ drv_mac80211_setup() { wireless_set_up } -list_phy_interfaces() { - local phy="$1" - if [ -d "/sys/class/ieee80211/${phy}/device/net" ]; then - ls "/sys/class/ieee80211/${phy}/device/net" 2>/dev/null; - else - ls "/sys/class/ieee80211/${phy}/device" 2>/dev/null | grep net: | sed -e 's,net:,,g' - fi -} - drv_mac80211_teardown() { wireless_process_kill_all From ccf2aa9d4bf6b79669fc7121fa3bfe4c1e2b05c3 Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Sat, 16 Nov 2019 16:29:45 +0100 Subject: [PATCH 2/2] mac80211: detect existing interface before adding Keep existing wdev when creating new nl80211 interfaces if phy and type match, delete it otherwise. To make this work, also remove left-over debugging function which prevented the return-value of the 'iw' command to be taken into account in mac80211_iw_interface_add(). As 4addr-mode (WDS) was setup during interface creation for station interfaces, also set it after interface creation to make sure an existing sta interface ends up with the right mode. Fixes: a5bc9787d4 ("mac80211: add support for dynamically reconfiguring wifi") Signed-off-by: Daniel Golle --- .../files/lib/netifd/wireless/mac80211.sh | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh index 5b174cded6..a04f1e3ca7 100644 --- a/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh +++ b/package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh @@ -15,10 +15,6 @@ MP_CONFIG_INT="mesh_retry_timeout mesh_confirm_timeout mesh_holding_timeout mesh MP_CONFIG_BOOL="mesh_auto_open_plinks mesh_fwding" MP_CONFIG_STRING="mesh_power_mode" -iw() { - command iw $@ || logger -t mac80211 "Failed command: iw $@" -} - NEWAPLIST= OLDAPLIST= NEWSPLIST= @@ -446,6 +442,36 @@ mac80211_iw_interface_add() { rc="$?" } + [ "$rc" = 233 ] && { + # Keep matching pre-existing interface + [ -d "/sys/class/ieee80211/${phy}/device/net/${ifname}" ] && \ + case "$(iw dev wlan0 info | grep "^\ttype" | cut -d' ' -f2- 2>/dev/null)" in + "AP") + [ "$type" = "__ap" ] && rc=0 + ;; + "IBSS") + [ "$type" = "adhoc" ] && rc=0 + ;; + "managed") + [ "$type" = "managed" ] && rc=0 + ;; + "mesh point") + [ "$type" = "mp" ] && rc=0 + ;; + "monitor") + [ "$type" = "monitor" ] && rc=0 + ;; + esac + } + + [ "$rc" = 233 ] && { + iw dev "$ifname" del + sleep 1 + + iw phy "$phy" interface add "$ifname" type "$type" $wdsflag + rc="$?" + } + [ "$rc" = 233 ] && { # Device might not support virtual interfaces, so the interface never got deleted in the first place. # Check if the interface already exists, and avoid failing in this case. @@ -511,6 +537,11 @@ mac80211_prepare_vif() { [ "$enable" = 0 ] || staidx="$(($staidx + 1))" [ "$wds" -gt 0 ] && wdsflag="4addr on" mac80211_iw_interface_add "$phy" "$ifname" managed "$wdsflag" || return + if [ "$wds" -gt 0 ]; then + iw "$ifname" set 4addr on + else + iw "$ifname" set 4addr off + fi [ "$powersave" -gt 0 ] && powersave="on" || powersave="off" iw "$ifname" set power_save "$powersave" ;;