2
0
Эх сурвалжийг харах

mac80211: add support for multiple wiphys behind a single device

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 <[email protected]>
Felix Fietkau 6 жил өмнө
parent
commit
8b15e7f661

+ 1 - 0
package/kernel/mac80211/Makefile

@@ -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

+ 36 - 0
package/kernel/mac80211/files/lib/netifd/mac80211.sh

@@ -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
+}

+ 6 - 5
package/kernel/mac80211/files/lib/netifd/wireless/mac80211.sh

@@ -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

+ 5 - 14
package/kernel/mac80211/files/lib/wifi/mac80211.sh

@@ -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)"