mac80211: make sure existing iface belongs to correct (fullmac) phy
authorDaniel Golle <daniel@makrotopia.org>
Fri, 17 Apr 2020 12:11:11 +0000 (13:11 +0100)
committerDaniel Golle <daniel@makrotopia.org>
Fri, 17 Apr 2020 12:31:58 +0000 (13:31 +0100)
Some FullMAC cfg80211 wireless devices do not support virtual
interfaces, hence there is script logic to keep the existing network
device. Improve this to support renaming the interface if needed and
make sure the existing interface actually belongs to the right phy.
Change calls to 'iw' to avoid outputing warnings and errors to not
confuse users of such devices.

Also bump PKG_RELEASE which has been forgotten in the previous two
mac80211 changes.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
package/kernel/mac80211/Makefile
package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh

index d01b689260ec6ae2b2052f805b88338bf10e4101..26c5ef4b1a37c23a1929d2aa714977d35ca39282 100644 (file)
@@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk
 PKG_NAME:=mac80211
 
 PKG_VERSION:=5.4.27-1
-PKG_RELEASE:=2
+PKG_RELEASE:=3
 PKG_SOURCE_URL:=@KERNEL/linux/kernel/projects/backports/stable/v5.4.27/
 PKG_HASH:=4c853a2f4c4fcc81cf60a3d59c5efbdb60c3e4acda22996cb192443581753950
 
index 501b1ad0de961aea45f4ec61d6b6c610f9309966..1ebdceaab8a8cdc605a423ecedfdef3774c655b8 100644 (file)
@@ -440,15 +440,16 @@ mac80211_iw_interface_add() {
        local type="$3"
        local wdsflag="$4"
        local rc
+       local oldifname
 
-       iw phy "$phy" interface add "$ifname" type "$type" $wdsflag
+       iw phy "$phy" interface add "$ifname" type "$type" $wdsflag >/dev/null 2>&1
        rc="$?"
 
        [ "$rc" = 233 ] && {
                # Device might have just been deleted, give the kernel some time to finish cleaning it up
                sleep 1
 
-               iw phy "$phy" interface add "$ifname" type "$type" $wdsflag
+               iw phy "$phy" interface add "$ifname" type "$type" $wdsflag >/dev/null 2>&1
                rc="$?"
        }
 
@@ -475,17 +476,26 @@ mac80211_iw_interface_add() {
        }
 
        [ "$rc" = 233 ] && {
-               iw dev "$ifname" del
-               sleep 1
+               iw dev "$ifname" del >/dev/null 2>&1
+               [ "$?" = 0 ] && {
+                       sleep 1
 
-               iw phy "$phy" interface add "$ifname" type "$type" $wdsflag
-               rc="$?"
+                       iw phy "$phy" interface add "$ifname" type "$type" $wdsflag >/dev/null 2>&1
+                       rc="$?"
+               }
        }
 
-       [ "$rc" = 233 ] && {
+       [ "$rc" != 0 ] && {
                # 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.
-               ip link show dev "$ifname" >/dev/null 2>/dev/null && rc=0
+               [ -d "/sys/class/ieee80211/${phy}/device/net/${ifname}" ] && rc=0
+       }
+
+       [ "$rc" != 0 ] && {
+               # Device doesn't support virtual interfaces and may have existing interface other than ifname.
+               oldifname="$(basename "/sys/class/ieee80211/${phy}/device/net"/* 2>/dev/null)"
+               [ "$oldifname" ] && ip link set "$oldifname" name "$ifname" 1>/dev/null 2>&1
+               rc="$?"
        }
 
        [ "$rc" != 0 ] && wireless_setup_failed INTERFACE_CREATION_FAILED