From 00160f5bd48261156cef1c4e626e1b8dffba2650 Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
 <41898282+github-actions[bot]@users.noreply.github.com>
Date: Wed, 27 Mar 2024 01:01:02 +0100
Subject: [PATCH] gluon-core: lua: wireless: use libiwinfo-lua for find_phy()
 (#3239)

find_phy() did not match OpenWrt's logic for PHY names anymore, and
could not handle PHYs that don't match the 'phyX' naming scheme. Instead
of trying to add more complex logic to our own code, simply do what
OpenWrt does and use iwinfo to resolve UCI sections to PHY names.

(cherry picked from commit 29e281f759cf019d323fc0ae8c8202ad2476ce9f)

Co-authored-by: Matthias Schiffer <mschiffer@universe-factory.net>
---
 .../luasrc/usr/lib/lua/gluon/wireless.lua     | 53 +------------------
 1 file changed, 2 insertions(+), 51 deletions(-)

diff --git a/package/gluon-core/luasrc/usr/lib/lua/gluon/wireless.lua b/package/gluon-core/luasrc/usr/lib/lua/gluon/wireless.lua
index a46fc674d..676f5ab19 100644
--- a/package/gluon-core/luasrc/usr/lib/lua/gluon/wireless.lua
+++ b/package/gluon-core/luasrc/usr/lib/lua/gluon/wireless.lua
@@ -3,62 +3,13 @@ local site = require 'gluon.site'
 local util = require 'gluon.util'
 
 local unistd = require 'posix.unistd'
-local dirent = require 'posix.dirent'
 
+local iwinfo = require 'iwinfo'
 
 local M = {}
 
-local function find_phy_by_path(path)
-	local device_path, phy_offset = string.match(path, "^(.+)%+(%d+)$")
-
-	-- Special handling required for multi-phy devices
-	if device_path == nil then
-		device_path = path
-		phy_offset = '0'
-	end
-
-	-- Find the device path. Either it's located at /sys/devices or /sys/devices/platform
-	local path_prefix = ''
-	if not unistd.access('/sys/devices/' .. device_path .. '/ieee80211') then
-		path_prefix = 'platform/'
-	end
-
-	-- Get all available PHYs of the device and determine the one with the lowest index
-	local phy_names = dirent.dir('/sys/devices/' .. path_prefix .. device_path .. '/ieee80211')
-	local device_phy_idxs = {}
-	for _, v in ipairs(phy_names) do
-		local phy_idx = v:match('^phy(%d+)$')
-
-		if phy_idx ~= nil then
-			table.insert(device_phy_idxs, tonumber(phy_idx))
-		end
-	end
-
-	table.sort(device_phy_idxs)
-
-	-- Index starts at 1
-	return 'phy' .. device_phy_idxs[tonumber(phy_offset) + 1]
-end
-
-local function find_phy_by_macaddr(macaddr)
-	local addr = macaddr:lower()
-	for _, file in ipairs(util.glob('/sys/class/ieee80211/*/macaddress')) do
-		if util.trim(util.readfile(file)) == addr then
-			return file:match('([^/]+)/macaddress$')
-		end
-	end
-end
-
 function M.find_phy(config)
-	if not config or config.type ~= 'mac80211' then
-		return nil
-	elseif config.path then
-		return find_phy_by_path(config.path)
-	elseif config.macaddr then
-		return find_phy_by_macaddr(config.macaddr)
-	else
-		return nil
-	end
+	return iwinfo.nl80211.phyname(config['.name'])
 end
 
 local function get_addresses(radio)
-- 
GitLab