mac80211: add support for multiple wiphys behind a single device
authorFelix Fietkau <nbd@nbd.name>
Thu, 31 Oct 2019 11:36:55 +0000 (12:36 +0100)
committerFelix Fietkau <nbd@nbd.name>
Tue, 5 Nov 2019 11:09:36 +0000 (12:09 +0100)
The device path will be the same for the first phy. For all subsequent
phys, the path gets an extra +1, +2, ...
Move the code for converting path to phy and vice versa to a separate
library script shared by config detection code and the netifd wireless
handler script

Signed-off-by: Felix Fietkau <nbd@nbd.name>
package/kernel/mac80211/Makefile
package/kernel/mac80211/files/lib/netifd/mac80211.sh [new file with mode: 0644]
package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh
package/kernel/mac80211/files/lib/wifi/mac80211.sh

index 29363748ec77174aadca39e5e00b657f78a615d1..7e74182ef3d2623037335781db4a103bc80a1f8b 100644 (file)
@@ -546,6 +546,7 @@ endef
 define KernelPackage/cfg80211/install
        $(INSTALL_DIR) $(1)/lib/wifi $(1)/lib/netifd/wireless
        $(INSTALL_DATA) ./files/lib/wifi/mac80211.sh $(1)/lib/wifi
+       $(INSTALL_DATA) ./files/lib/netifd/mac80211.sh $(1)/lib/netifd
        $(INSTALL_BIN) ./files/lib/netifd/wireless/mac80211.sh $(1)/lib/netifd/wireless
        $(INSTALL_DIR) $(1)/etc/hotplug.d/ieee80211
        $(INSTALL_DATA) ./files/mac80211.hotplug $(1)/etc/hotplug.d/ieee80211/10-wifi-detect
diff --git a/package/kernel/mac80211/files/lib/netifd/mac80211.sh b/package/kernel/mac80211/files/lib/netifd/mac80211.sh
new file mode 100644 (file)
index 0000000..92e5c0e
--- /dev/null
@@ -0,0 +1,36 @@
+mac80211_phy_to_path() {
+       local phy="$1"
+
+       [ -x /usr/bin/readlink -a -h /sys/class/ieee80211/${phy} ] || return
+
+       local path="$(readlink -f /sys/class/ieee80211/${phy}/device)"
+       [ -n "$path" ] || return
+
+       path="${path##/sys/devices/}"
+       case "$path" in
+               platform*/pci*) path="${path##platform/}";;
+       esac
+
+       local p
+       local seq=""
+       for p in $(ls /sys/class/ieee80211/$phy/device/ieee80211); do
+               [ "$p" = "$phy" ] && {
+                       echo "$path${seq:++$seq}"
+                       break
+               }
+
+               seq=$((${seq:-0} + 1))
+       done
+}
+
+mac80211_path_to_phy() {
+       local path="$1"
+
+       local p
+       for p in $(ls /sys/class/ieee80211); do
+               local cur="$(mac80211_phy_to_path "$p")"
+               case "$cur" in
+                       *$path) echo "$p"; return;;
+               esac
+       done
+}
index f9d5c0c6d5caa909296925b15c4aa9f80a1c0e35..12af2d1d0e8e756937da3d94d72f058bedb6ebbb 100644 (file)
@@ -1,6 +1,7 @@
 #!/bin/sh
 . /lib/netifd/netifd-wireless.sh
 . /lib/netifd/hostapd.sh
+. /lib/netifd/mac80211.sh
 
 init_wireless_driver "$@"
 
@@ -407,11 +408,8 @@ mac80211_generate_mac() {
 find_phy() {
        [ -n "$phy" -a -d /sys/class/ieee80211/$phy ] && return 0
        [ -n "$path" ] && {
-               for phy in $(ls /sys/class/ieee80211 2>/dev/null); do
-                       case "$(readlink -f /sys/class/ieee80211/$phy/device)" in
-                               *$path) return 0;;
-                       esac
-               done
+               phy="$(mac80211_path_to_phy "$path")"
+               [ -n "$phy" ] && return 0
        }
        [ -n "$macaddr" ] && {
                for phy in $(ls /sys/class/ieee80211 2>/dev/null); do
@@ -740,6 +738,9 @@ mac80211_interface_cleanup() {
        local phy="$1"
 
        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
index 511a9188db218fbd0c595f53508b68b15ce30337..be9c53792635e6c499615c0dc47617e0adbc61e4 100644 (file)
@@ -1,4 +1,6 @@
 #!/bin/sh
+. /lib/netifd/mac80211.sh
+
 append DRIVERS "mac80211"
 
 lookup_phy() {
@@ -9,11 +11,8 @@ lookup_phy() {
        local devpath
        config_get devpath "$device" path
        [ -n "$devpath" ] && {
-               for phy in $(ls /sys/class/ieee80211 2>/dev/null); do
-                       case "$(readlink -f /sys/class/ieee80211/$phy/device)" in
-                               *$devpath) return;;
-                       esac
-               done
+               phy="$(mac80211_path_to_phy "$devpath")"
+               [ -n "$phy" ] && return
        }
 
        local macaddr="$(config_get "$device" macaddr | tr 'A-Z' 'a-z')"
@@ -91,16 +90,8 @@ detect_mac80211() {
 
                [ -n "$htmode" ] && ht_capab="set wireless.radio${devidx}.htmode=$htmode"
 
-               if [ -x /usr/bin/readlink -a -h /sys/class/ieee80211/${dev} ]; then
-                       path="$(readlink -f /sys/class/ieee80211/${dev}/device)"
-               else
-                       path=""
-               fi
+               path="$(mac80211_phy_to_path "$dev")"
                if [ -n "$path" ]; then
-                       path="${path##/sys/devices/}"
-                       case "$path" in
-                               platform*/pci*) path="${path##platform/}";;
-                       esac
                        dev_id="set wireless.radio${devidx}.path='$path'"
                else
                        dev_id="set wireless.radio${devidx}.macaddr=$(cat /sys/class/ieee80211/${dev}/macaddress)"