Skip to content
Snippets Groups Projects
Unverified Commit 2e265e03 authored by Matthias Schiffer's avatar Matthias Schiffer
Browse files

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.
parent 59d182fe
No related branches found
No related tags found
No related merge requests found
...@@ -4,75 +4,136 @@ local sysconfig = require 'gluon.sysconfig' ...@@ -4,75 +4,136 @@ local sysconfig = require 'gluon.sysconfig'
if sysconfig.primary_mac then if sysconfig.primary_mac then
os.exit(0) os.exit(0)
end end
local util = require 'gluon.util'
local platform = require 'gluon.platform' local platform = require 'gluon.platform'
local util = require 'gluon.util'
local try_files = { local function sysfs(...)
'/sys/class/net/eth0/address' local path = string.format(...)
} return function()
local addr = util.readfile(path)
if addr then
return util.trim(addr)
end
end
end
if not ( local function eth(index)
util.contains({'x86', 'brcm2708'}, platform.get_target()) or return sysfs('/sys/class/net/eth%d/address', index)
platform.match('ar71xx', 'mikrotik')
) then
table.insert(try_files, 1, '/sys/class/ieee80211/phy0/macaddress')
end end
if platform.match('ar71xx', 'generic', {'tl-wdr3600', 'tl-wdr4300', local function phy(index)
'tl-wr902ac-v1'}) then return sysfs('/sys/class/ieee80211/phy%d/macaddress', index)
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 end
for _, file in ipairs(try_files) do -- Entries are matched in the order they are listed
local addr = util.readfile(file) 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 for _, matcher in ipairs(primary_addrs) do
sysconfig.primary_mac = util.trim(addr) local f, matches = unpack(matcher)
break
end 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 end
error('no primary MAC address found')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment