From b1de28bab11f163193b0c0351f2c1a0c5d800c4c Mon Sep 17 00:00:00 2001
From: David Bauer <mail@david-bauer.net>
Date: Mon, 25 May 2020 00:57:35 +0200
Subject: [PATCH] gluon-core: move wireless-related utils to wireless module

Separate wireless-related helper methods from the util module to a
new wireless module. This keeps them separated, as the amount of
wireless helpers increased in the past, justifying a separate module.
---
 .../upgrade/320-gluon-client-bridge-wireless  |  8 +-
 .../luasrc/lib/gluon/upgrade/200-wireless     | 17 ++--
 .../luasrc/usr/lib/lua/gluon/platform.lua     |  3 +-
 .../luasrc/usr/lib/lua/gluon/util.lua         | 91 -----------------
 .../luasrc/usr/lib/lua/gluon/wireless.lua     | 99 +++++++++++++++++++
 .../lib/gluon/upgrade/205-wireless-mesh-sae   |  4 +-
 .../config-mode/model/admin/privatewifi.lua   |  6 +-
 .../config-mode/model/admin/wifi-config.lua   |  6 +-
 8 files changed, 122 insertions(+), 112 deletions(-)
 create mode 100644 package/gluon-core/luasrc/usr/lib/lua/gluon/wireless.lua

diff --git a/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/320-gluon-client-bridge-wireless b/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/320-gluon-client-bridge-wireless
index b65a7d572..972b9b612 100755
--- a/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/320-gluon-client-bridge-wireless
+++ b/package/gluon-client-bridge/luasrc/lib/gluon/upgrade/320-gluon-client-bridge-wireless
@@ -1,7 +1,7 @@
 #!/usr/bin/lua
 
-local util = require 'gluon.util'
 local platform = require 'gluon.platform'
+local wireless = require 'gluon.wireless'
 
 local uci = require('simple-uci').cursor()
 
@@ -23,7 +23,7 @@ local function configure_ap(radio, index, config, radio_name)
 
 	uci:delete('wireless', name)
 
-	local macaddr = util.get_wlan_mac(uci, radio, index, 1)
+	local macaddr = wireless.get_wlan_mac(uci, radio, index, 1)
 
 	if not ap.ssid() or not macaddr then
 		return
@@ -56,7 +56,7 @@ local function configure_owe(radio, index, config, radio_name)
 		return
 	end
 
-	local macaddr = util.get_wlan_mac(uci, radio, index, 3)
+	local macaddr = wireless.get_wlan_mac(uci, radio, index, 3)
 
 	if not ap.owe_ssid() or not macaddr then
 		return
@@ -109,7 +109,7 @@ local function configure_owe_transition_mode(config, radio_name)
 	uci:set('wireless', name_owe, 'hidden', '1')
 end
 
-util.foreach_radio(uci, function(radio, index, config)
+wireless.foreach_radio(uci, function(radio, index, config)
 	local radio_name = radio['.name']
 
 	configure_ap(radio, index, config, radio_name)
diff --git a/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless b/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless
index 709cc9092..74449a384 100755
--- a/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless
+++ b/package/gluon-core/luasrc/lib/gluon/upgrade/200-wireless
@@ -1,6 +1,7 @@
 #!/usr/bin/lua
 
 local util = require 'gluon.util'
+local wireless = require 'gluon.wireless'
 local site = require 'gluon.site'
 local sysconfig = require 'gluon.sysconfig'
 local iwinfo = require 'iwinfo'
@@ -16,8 +17,8 @@ if not sysconfig.gluon_version then
 	-- capable of operating in the 2.4 GHz and 5 GHz band need
 	-- to be distributed evenly.
 	local radio_band_count = {band24=0, band5=0}
-	util.foreach_radio(uci, function(radio)
-		local hwmodes = iwinfo.nl80211.hwmodelist(util.find_phy(radio))
+	wireless.foreach_radio(uci, function(radio)
+		local hwmodes = iwinfo.nl80211.hwmodelist(wireless.find_phy(radio))
 		if hwmodes.g and not (hwmodes.a or hwmodes.ac) then
 			-- 2.4 GHz
 			radio_band_count["band24"] = radio_band_count["band24"] + 1
@@ -29,9 +30,9 @@ if not sysconfig.gluon_version then
 
 	-- Use the number of all fixed 2.4G GHz and 5 GHz radios to
 	-- distribute dualband radios in this step.
-	util.foreach_radio(uci, function(radio)
+	wireless.foreach_radio(uci, function(radio)
 		local radio_name = radio['.name']
-		local hwmodes = iwinfo.nl80211.hwmodelist(util.find_phy(radio))
+		local hwmodes = iwinfo.nl80211.hwmodelist(wireless.find_phy(radio))
 		if (hwmodes.a or hwmodes.ac) and hwmodes.g then
 			-- Dualband radio
 			if radio_band_count["band24"] <= radio_band_count["band5"] then
@@ -72,7 +73,7 @@ local function get_htmode(radio)
 		end
 	end
 
-	local phy = util.find_phy(radio)
+	local phy = wireless.find_phy(radio)
 	if iwinfo.nl80211.hwmodelist(phy).ac then
 		return 'VHT20'
 	end
@@ -121,7 +122,7 @@ local function configure_mesh(config, radio, index, suffix, disabled)
 		return
 	end
 
-	local macaddr = util.get_wlan_mac(uci, radio, index, 2)
+	local macaddr = wireless.get_wlan_mac(uci, radio, index, 2)
 	if not macaddr then
 		return
 	end
@@ -153,7 +154,7 @@ local function fixup_wan(radio, index)
 		return
 	end
 
-	local macaddr = util.get_wlan_mac(uci, radio, index, 4)
+	local macaddr = wireless.get_wlan_mac(uci, radio, index, 4)
 	if not macaddr then
 		return
 	end
@@ -173,7 +174,7 @@ local function configure_mesh_wireless(radio, index, config)
 	)
 end
 
-util.foreach_radio(uci, function(radio, index, config)
+wireless.foreach_radio(uci, function(radio, index, config)
 	local radio_name = radio['.name']
 
 	delete_ibss(radio_name)
diff --git a/package/gluon-core/luasrc/usr/lib/lua/gluon/platform.lua b/package/gluon-core/luasrc/usr/lib/lua/gluon/platform.lua
index 85f1de76e..b4fc708b4 100644
--- a/package/gluon-core/luasrc/usr/lib/lua/gluon/platform.lua
+++ b/package/gluon-core/luasrc/usr/lib/lua/gluon/platform.lua
@@ -1,5 +1,6 @@
 local platform_info = require 'platform_info'
 local util = require 'gluon.util'
+local wireless = require 'gluon.wireless'
 local unistd = require 'posix.unistd'
 
 
@@ -80,7 +81,7 @@ function M.device_supports_mfp(uci)
 	end
 
 	uci:foreach('wireless', 'wifi-device', function(radio)
-		local phy = util.find_phy(radio)
+		local phy = wireless.find_phy(radio)
 		local phypath = '/sys/kernel/debug/ieee80211/' .. phy .. '/'
 
 		if not util.file_contains_line(phypath .. 'hwflags', 'MFP_CAPABLE') then
diff --git a/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua b/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua
index bd51fcc46..a3c5456f3 100644
--- a/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua
+++ b/package/gluon-core/luasrc/usr/lib/lua/gluon/util.lua
@@ -136,45 +136,6 @@ function M.glob(pattern)
 	return posix_glob.glob(pattern) or {}
 end
 
-local function find_phy_by_path(path)
-	local phy = M.glob('/sys/devices/' .. path .. '/ieee80211/phy*')[1]
-		or M.glob('/sys/devices/platform/' .. path .. '/ieee80211/phy*')[1]
-
-	if phy then
-		return phy:match('([^/]+)$')
-	end
-end
-
-local function find_phy_by_macaddr(macaddr)
-	local addr = macaddr:lower()
-	for _, file in ipairs(M.glob('/sys/class/ieee80211/*/macaddress')) do
-		if M.trim(M.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
-end
-
-local function get_addresses(radio)
-	local phy = M.find_phy(radio)
-	if not phy then
-		return function() end
-	end
-
-	return io.lines('/sys/class/ieee80211/' .. phy .. '/addresses')
-end
-
 -- Generates a (hopefully) unique MAC address
 -- The parameter defines the ID to add to the MAC address
 --
@@ -209,58 +170,6 @@ function M.generate_mac(i)
 	return string.format('%02x:%s:%s:%s:%s:%02x', m1, m2, m3, m4, m5, m6)
 end
 
-local function get_wlan_mac_from_driver(radio, vif)
-	local primary = sysconfig.primary_mac:lower()
-
-	local addresses = {}
-	for address in get_addresses(radio) do
-		if address:lower() ~= primary then
-			table.insert(addresses, address)
-		end
-	end
-
-	-- Make sure we have at least 4 addresses
-	if #addresses < 4 then
-		return nil
-	end
-
-	for i, addr in ipairs(addresses) do
-		if i == vif then
-			return addr
-		end
-	end
-end
-
-function M.get_wlan_mac(_, radio, index, vif)
-	local addr = get_wlan_mac_from_driver(radio, vif)
-	if addr then
-		return addr
-	end
-
-	return M.generate_mac(4*(index-1) + (vif-1))
-end
-
--- Iterate over all radios defined in UCI calling
--- f(radio, index, site.wifiX) for each radio found while passing
---  site.wifi24 for 2.4 GHz devices and site.wifi5 for 5 GHz ones.
-function M.foreach_radio(uci, f)
-	local radios = {}
-
-	uci:foreach('wireless', 'wifi-device', function(radio)
-		table.insert(radios, radio)
-	end)
-
-	for index, radio in ipairs(radios) do
-		local hwmode = radio.hwmode
-
-		if hwmode == '11g' or hwmode == '11ng' then
-			f(radio, index, site.wifi24)
-		elseif hwmode == '11a' or hwmode == '11na' then
-			f(radio, index, site.wifi5)
-		end
-	end
-end
-
 function M.get_uptime()
 	local uptime_file = M.readfile("/proc/uptime")
 	if uptime_file == nil then
diff --git a/package/gluon-core/luasrc/usr/lib/lua/gluon/wireless.lua b/package/gluon-core/luasrc/usr/lib/lua/gluon/wireless.lua
new file mode 100644
index 000000000..8a2f4ed88
--- /dev/null
+++ b/package/gluon-core/luasrc/usr/lib/lua/gluon/wireless.lua
@@ -0,0 +1,99 @@
+local sysconfig = require 'gluon.sysconfig'
+local site = require 'gluon.site'
+local util = require 'gluon.util'
+
+
+local M = {}
+
+local function find_phy_by_path(path)
+	local phy = util.glob('/sys/devices/' .. path .. '/ieee80211/phy*')[1]
+		or util.glob('/sys/devices/platform/' .. path .. '/ieee80211/phy*')[1]
+
+	if phy then
+		return phy:match('([^/]+)$')
+	end
+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
+end
+
+local function get_addresses(radio)
+	local phy = M.find_phy(radio)
+	if not phy then
+		return function() end
+	end
+
+	return io.lines('/sys/class/ieee80211/' .. phy .. '/addresses')
+end
+
+local function get_wlan_mac_from_driver(radio, vif)
+	local primary = sysconfig.primary_mac:lower()
+
+	local addresses = {}
+	for address in get_addresses(radio) do
+		if address:lower() ~= primary then
+			table.insert(addresses, address)
+		end
+	end
+
+	-- Make sure we have at least 4 addresses
+	if #addresses < 4 then
+		return nil
+	end
+
+	for i, addr in ipairs(addresses) do
+		if i == vif then
+			return addr
+		end
+	end
+end
+
+function M.get_wlan_mac(_, radio, index, vif)
+	local addr = get_wlan_mac_from_driver(radio, vif)
+	if addr then
+		return addr
+	end
+
+	return util.generate_mac(4*(index-1) + (vif-1))
+end
+
+-- Iterate over all radios defined in UCI calling
+-- f(radio, index, site.wifiX) for each radio found while passing
+--  site.wifi24 for 2.4 GHz devices and site.wifi5 for 5 GHz ones.
+function M.foreach_radio(uci, f)
+	local radios = {}
+
+	uci:foreach('wireless', 'wifi-device', function(radio)
+		table.insert(radios, radio)
+	end)
+
+	for index, radio in ipairs(radios) do
+		local hwmode = radio.hwmode
+
+		if hwmode == '11g' or hwmode == '11ng' then
+			f(radio, index, site.wifi24)
+		elseif hwmode == '11a' or hwmode == '11na' then
+			f(radio, index, site.wifi5)
+		end
+	end
+end
+
+return M
diff --git a/package/gluon-mesh-wireless-sae/luasrc/lib/gluon/upgrade/205-wireless-mesh-sae b/package/gluon-mesh-wireless-sae/luasrc/lib/gluon/upgrade/205-wireless-mesh-sae
index ee1fae073..c51da9cc9 100755
--- a/package/gluon-mesh-wireless-sae/luasrc/lib/gluon/upgrade/205-wireless-mesh-sae
+++ b/package/gluon-mesh-wireless-sae/luasrc/lib/gluon/upgrade/205-wireless-mesh-sae
@@ -1,7 +1,7 @@
 #!/usr/bin/lua
 
-local util = require 'gluon.util'
 local site = require 'gluon.site'
+local wireless = require 'gluon.wireless'
 local hash = require 'hash'
 local uci = require('simple-uci').cursor()
 
@@ -11,7 +11,7 @@ local function configure_sae(vif)
 	uci:set('wireless', vif, 'key', site.wifi.mesh.sae_passphrase() or hash.md5(site.prefix6()))
 end
 
-util.foreach_radio(uci, function(radio, _, _)
+wireless.foreach_radio(uci, function(radio, _, _)
 	local radio_name = radio['.name']
 	local vif = 'mesh_' .. radio_name
 	local enable = site.wifi.mesh.sae(false)
diff --git a/package/gluon-web-private-wifi/luasrc/lib/gluon/config-mode/model/admin/privatewifi.lua b/package/gluon-web-private-wifi/luasrc/lib/gluon/config-mode/model/admin/privatewifi.lua
index 30ba4df31..b3d98ae8e 100644
--- a/package/gluon-web-private-wifi/luasrc/lib/gluon/config-mode/model/admin/privatewifi.lua
+++ b/package/gluon-web-private-wifi/luasrc/lib/gluon/config-mode/model/admin/privatewifi.lua
@@ -1,6 +1,6 @@
 local uci = require("simple-uci").cursor()
-local util = require 'gluon.util'
 local platform = require 'gluon.platform'
+local wireless = require 'gluon.wireless'
 
 -- where to read the configuration from
 local primary_iface = 'wan_radio0'
@@ -47,12 +47,12 @@ mfp.default = uci:get('wireless', primary_iface, 'ieee80211w') or "0"
 
 
 function f:write()
-	util.foreach_radio(uci, function(radio, index)
+	wireless.foreach_radio(uci, function(radio, index)
 		local radio_name = radio['.name']
 		local name   = "wan_" .. radio_name
 
 		if enabled.data then
-			local macaddr = util.get_wlan_mac(uci, radio, index, 4)
+			local macaddr = wireless.get_wlan_mac(uci, radio, index, 4)
 
 			uci:section('wireless', 'wifi-iface', name, {
 				device     = radio_name,
diff --git a/package/gluon-web-wifi-config/luasrc/lib/gluon/config-mode/model/admin/wifi-config.lua b/package/gluon-web-wifi-config/luasrc/lib/gluon/config-mode/model/admin/wifi-config.lua
index 581455270..32cdc2490 100644
--- a/package/gluon-web-wifi-config/luasrc/lib/gluon/config-mode/model/admin/wifi-config.lua
+++ b/package/gluon-web-wifi-config/luasrc/lib/gluon/config-mode/model/admin/wifi-config.lua
@@ -1,6 +1,6 @@
 local iwinfo = require 'iwinfo'
 local uci = require("simple-uci").cursor()
-local util = require 'gluon.util'
+local wireless = require 'gluon.wireless'
 
 
 local function txpower_list(phy)
@@ -101,7 +101,7 @@ uci:foreach('wireless', 'wifi-device', function(config)
 	vif_option('client', {'client', 'owe'}, translate('Enable client network (access point)'))
 	vif_option('mesh', {'mesh'}, translate("Enable mesh network (802.11s)"))
 
-	local phy = util.find_phy(config)
+	local phy = wireless.find_phy(config)
 	if not phy then
 		return
 	end
@@ -155,7 +155,7 @@ if has_5ghz_radio() then
 			return
 		end
 
-		local phy = util.find_phy(uci:get_all('wireless', radio))
+		local phy = wireless.find_phy(uci:get_all('wireless', radio))
 
 		local ht = r:option(ListValue, 'outdoor_htmode', translate('HT Mode') .. ' (' .. radio .. ')')
 		ht:depends(outdoor, true)
-- 
GitLab