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.
This commit is contained in:
Matthias Schiffer 2020-03-12 00:29:06 +01:00
parent 59d182fe54
commit 2e265e03c1
No known key found for this signature in database
GPG Key ID: 16EF3F64CB201D9C

View File

@ -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
local function eth(index)
return sysfs('/sys/class/net/eth%d/address', index)
end
local function phy(index)
return sysfs('/sys/class/ieee80211/phy%d/macaddress', index)
end
-- 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 not (
util.contains({'x86', 'brcm2708'}, platform.get_target()) or
platform.match('ar71xx', 'mikrotik')
) then
table.insert(try_files, 1, '/sys/class/ieee80211/phy0/macaddress')
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
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')
end
for _, file in ipairs(try_files) do
local addr = util.readfile(file)
if addr then
sysconfig.primary_mac = util.trim(addr)
break
end
end
error('no primary MAC address found')