From 2e265e03c1f2b9d85b138e5c8cb3e8097c2dc587 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer <mschiffer@universe-factory.net> Date: Thu, 12 Mar 2020 00:29:06 +0100 Subject: [PATCH] gluon-core: refactor primary MAC logic Remove a lot of redundant code by switching to a match table listing the targets and boards for each candidate for the primary MAC interface. In addition, we add some flexiblity by allow to switch out the sysfs file data source for the MAC address. --- .../luasrc/lib/gluon/upgrade/010-primary-mac | 177 ++++++++++++------ 1 file changed, 119 insertions(+), 58 deletions(-) diff --git a/package/gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac b/package/gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac index f4ad37a9c..7fce90149 100755 --- a/package/gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac +++ b/package/gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac @@ -4,75 +4,136 @@ local sysconfig = require 'gluon.sysconfig' if sysconfig.primary_mac then - os.exit(0) + os.exit(0) end -local util = require 'gluon.util' local platform = require 'gluon.platform' +local util = require 'gluon.util' -local try_files = { - '/sys/class/net/eth0/address' -} +local function sysfs(...) + local path = string.format(...) + return function() + local addr = util.readfile(path) + if addr then + return util.trim(addr) + end + end +end -if not ( - util.contains({'x86', 'brcm2708'}, platform.get_target()) or - platform.match('ar71xx', 'mikrotik') -) then - table.insert(try_files, 1, '/sys/class/ieee80211/phy0/macaddress') +local function eth(index) + return sysfs('/sys/class/net/eth%d/address', index) end -if platform.match('ar71xx', 'generic', {'tl-wdr3600', 'tl-wdr4300', - 'tl-wr902ac-v1'}) then - table.insert(try_files, 1, '/sys/class/ieee80211/phy1/macaddress') -elseif platform.match('ar71xx', 'generic', {'a40', 'a60', - 'archer-c25-v1', - 'archer-c60-v2', - 'archer-c7-v4', 'archer-c7-v5', - 'carambola2', - 'koala', - 'mr600', 'mr600v2', - 'mr900', 'mr900v2', - 'mr1750', 'mr1750v2', - 'om2p', 'om2pv2', 'om2pv4', - 'om2p-hs', 'om2p-hsv2', 'om2p-hsv3', - 'om2p-hsv4', - 'om2p-lc', - 'om5p', 'om5p-an', - 'om5p-ac', 'om5p-acv2', - 'unifi-outdoor-plus', - 'unifiac-lite', 'unifiac-pro'}) then - table.insert(try_files, 1, '/sys/class/net/eth0/address') -elseif platform.match('ar71xx', 'generic', {'archer-c5', 'archer-c58-v1', - 'archer-c59-v1', 'archer-c60-v1', - 'archer-c7'}) then - table.insert(try_files, 1, '/sys/class/net/eth1/address') -elseif platform.match('ar71xx', 'nand', {'hiveap-121'}) then - table.insert(try_files, 1, '/sys/class/net/eth0/address') -elseif platform.match('ath79', 'generic', {'ocedo,raccoon'}) then - table.insert(try_files, 1, '/sys/class/net/eth0/address') -elseif platform.match('ipq40xx', 'generic', {'avm,fritzbox-4040', - 'openmesh,a42', 'openmesh,a62'}) then - table.insert(try_files, 1, '/sys/class/net/eth0/address') -elseif platform.match('ipq806x', 'generic', {'netgear,r7800'}) then - table.insert(try_files, 1, '/sys/class/net/eth1/address') -elseif platform.match('mpc85xx', 'p1020', {'aerohive,hiveap-330'}) then - table.insert(try_files, 1, '/sys/class/net/eth0/address') -elseif platform.match('mpc85xx', 'p1020', {'ocedo,panda'}) then - table.insert(try_files, 1, '/sys/class/net/eth1/address') -elseif platform.match('ramips', 'mt7620', {'miwifi-mini', 'tplink,c2-v1', 'c20-v1', 'c20i', 'c50'}) then - table.insert(try_files, 1, '/sys/class/net/eth0/address') -elseif platform.match('ramips', 'mt7621', {'dir-860l-b1'}) then - table.insert(try_files, 1, '/sys/class/ieee80211/phy1/macaddress') +local function phy(index) + return sysfs('/sys/class/ieee80211/phy%d/macaddress', index) end -for _, file in ipairs(try_files) do - local addr = util.readfile(file) +-- Entries are matched in the order they are listed +local primary_addrs = { + {eth(0), { + {'x86'}, + {'brcm2708'}, + {'ar71xx', 'generic', { + 'a40', + 'a60', + 'archer-c25-v1', + 'archer-c60-v2', + 'archer-c7-v4', + 'archer-c7-v5', + 'carambola2', + 'koala', + 'mr600', + 'mr600v2', + 'mr900', + 'mr900v2', + 'mr1750', + 'mr1750v2', + 'om2p', + 'om2pv2', + 'om2pv4', + 'om2p-hs', + 'om2p-hsv2', + 'om2p-hsv3', + 'om2p-hsv4', + 'om2p-lc', + 'om5p', + 'om5p-an', + 'om5p-ac', + 'om5p-acv2', + 'unifi-outdoor-plus', + 'unifiac-lite', + 'unifiac-pro', + }}, + {'ar71xx', 'mikrotik'}, + {'ar71xx', 'nand', { + 'hiveap-121', + }}, + {'ath79', 'generic', { + 'ocedo,raccoon', + }}, + {'ipq40xx', 'generic', { + 'avm,fritzbox-4040', + 'openmesh,a42', + 'openmesh,a62', + }}, + {'mpc85xx', 'p1020', { + 'aerohive,hiveap-330', + }}, + {'ramips', 'mt7620', { + 'miwifi-mini', 'tplink,c2-v1', 'c20-v1', 'c20i', 'c50', + }}, + }}, + {eth(1), { + {'ar71xx', 'generic', { + 'archer-c5', + 'archer-c58-v1', + 'archer-c59-v1', + 'archer-c60-v1', + 'archer-c7', + }}, + {'ipq806x', 'generic', { + 'netgear,r7800', + }}, + {'mpc85xx', 'p1020', { + 'ocedo,panda', + }}, + }}, + {phy(1), { + {'ar71xx', 'generic', { + 'tl-wdr3600', + 'tl-wdr4300', + 'tl-wr902ac-v1', + }}, + {'ramips', 'mt7621', { + 'dir-860l-b1', + }}, + }}, + -- phy0 default + {phy(0), { + {}, -- matches everything + }}, + -- eth0 fallback when phy0 does not exist + {eth(0), { + {}, -- matches everything + }}, +} + - if addr then - sysconfig.primary_mac = util.trim(addr) - break - end +for _, matcher in ipairs(primary_addrs) do + local f, matches = unpack(matcher) + + for _, match in ipairs(matches) do + if platform.match(unpack(match)) then + local addr = f() + if addr then + sysconfig.primary_mac = addr + return + end + end + end end + +error('no primary MAC address found') -- GitLab