From 0c5b5373bbf0b69e26d577bfa5930d8b5005f5c9 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Mon, 4 May 2020 23:49:18 +0200 Subject: [PATCH 1/4] gluon-core: primary-mac: load board.json only once --- .../gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac | 8 +++++--- 1 file changed, 5 insertions(+), 3 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 0d17338e..b1e32b09 100755 --- a/package/gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac +++ b/package/gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac @@ -12,6 +12,8 @@ local json = require 'jsonc' local platform = require 'gluon.platform' local util = require 'gluon.util' +local board_data = json.load('/etc/board.json') +local network_data = (board_data or {}).network local function sysfs(...) local path = string.format(...) @@ -33,9 +35,9 @@ end local function board(iface) return function() - local data = json.load('/etc/board.json') - if data and data.network and data.network[iface] then - return data.network[iface].macaddr + local ifdata = network_data[iface] or {} + if ifdata.macaddr then + return ifdata.macaddr end end end From 2250665d18047870f87beba37cc12fc8fe2d2069 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 6 May 2020 23:05:55 +0200 Subject: [PATCH 2/4] gluon-core: primary-mac: cleanup - Replace misnamed, closure-returning sysfs() to a reusable read() function - Rename eth() to netdev(), pass full interface name - Rename board() to interface() - Split reuable get_netdev_addr() out of netdev() --- .../luasrc/lib/gluon/upgrade/010-primary-mac | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 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 b1e32b09..56a383a8 100755 --- a/package/gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac +++ b/package/gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac @@ -15,27 +15,33 @@ local util = require 'gluon.util' local board_data = json.load('/etc/board.json') local network_data = (board_data or {}).network -local function sysfs(...) - local path = string.format(...) - return function() - local addr = util.readfile(path) - if addr then - return util.trim(addr) - end +local function read(...) + local addr = util.readfile(string.format(...)) + if addr then + return util.trim(addr) end end -local function eth(index) - return sysfs('/sys/class/net/eth%d/address', index) +local function get_netdev_addr(ifname) + return read('/sys/class/net/%s/address', ifname) +end + + +local function netdev(ifname) + return function() + return get_netdev_addr(ifname) + end end local function phy(index) - return sysfs('/sys/class/ieee80211/phy%d/macaddress', index) + return function() + return read('/sys/class/ieee80211/phy%d/macaddress', index) + end end -local function board(iface) +local function interface(name) return function() - local ifdata = network_data[iface] or {} + local ifdata = network_data[name] or {} if ifdata.macaddr then return ifdata.macaddr end @@ -45,7 +51,7 @@ end -- Entries are matched in the order they are listed local primary_addrs = { - {eth(0), { + {netdev('eth0'), { {'x86'}, {'brcm2708'}, {'ar71xx', 'generic', { @@ -99,7 +105,7 @@ local primary_addrs = { 'miwifi-mini', 'tplink,c2-v1', 'c20-v1', 'c20i', 'c50', }}, }}, - {eth(1), { + {netdev('eth0'), { {'ar71xx', 'generic', { 'archer-c5', 'archer-c58-v1', @@ -124,7 +130,7 @@ local primary_addrs = { 'dir-860l-b1', }}, }}, - {board('lan'), { + {interface('lan'), { {'lantiq', 'xway', { 'netgear,dgn3500b', }}, @@ -139,7 +145,7 @@ local primary_addrs = { {}, -- matches everything }}, -- eth0 fallback when phy0 does not exist - {eth(0), { + {netdev('eth0'), { {}, -- matches everything }}, } From 02e4a130698e89f7d6849cc9c206ce65663de1a7 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 6 May 2020 23:08:54 +0200 Subject: [PATCH 3/4] gluon-core: primary-mac: add fallback to netdev address to interface() In most cases, board.json does not contain any MAC addresses; in this case, the default MAC address of the underlying interface is to be used. --- package/gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac | 6 ++++++ 1 file changed, 6 insertions(+) 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 56a383a8..2974a29d 100755 --- a/package/gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac +++ b/package/gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac @@ -26,6 +26,10 @@ local function get_netdev_addr(ifname) return read('/sys/class/net/%s/address', ifname) end +local function strip_vlan(ifname) + return (ifname:gsub('%..*', '')) +end + local function netdev(ifname) return function() @@ -44,6 +48,8 @@ local function interface(name) local ifdata = network_data[name] or {} if ifdata.macaddr then return ifdata.macaddr + elseif ifdata.ifname then + return get_netdev_addr(strip_vlan(ifdata.ifname)) end end end From e93dca7cb328b346f04b6b9fb6d10e34db458d26 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 6 May 2020 23:22:51 +0200 Subject: [PATCH 4/4] gluon-core: primary-mac: replace all eth0/eth1 lookups with lan/wan The netdev() lookup is confusing to use: whenever a interface does not exist during boot (for example VLAN) or when the address is overridden from board.json (which is not obvious at all), it will yield either no address, or a different address than expected. To avoid this confusion, using board.json-based interface() is preferable. This converts all uses of netdev() to the corresponding lan/wan lookups, except for the final fallback for eth0. --- .../luasrc/lib/gluon/upgrade/010-primary-mac | 70 +++++++++---------- 1 file changed, 35 insertions(+), 35 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 2974a29d..fd1f1232 100755 --- a/package/gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac +++ b/package/gluon-core/luasrc/lib/gluon/upgrade/010-primary-mac @@ -57,14 +57,13 @@ end -- Entries are matched in the order they are listed local primary_addrs = { - {netdev('eth0'), { - {'x86'}, - {'brcm2708'}, + {interface('lan'), { {'ar71xx', 'generic', { - 'a40', - 'a60', - 'archer-c25-v1', - 'archer-c60-v2', + 'archer-c5', + 'archer-c58-v1', + 'archer-c59-v1', + 'archer-c60-v1', + 'archer-c7', 'archer-c7-v4', 'archer-c7-v5', 'carambola2', @@ -77,11 +76,9 @@ local primary_addrs = { 'mr1750v2', 'om2p', 'om2pv2', - 'om2pv4', 'om2p-hs', 'om2p-hsv2', 'om2p-hsv3', - 'om2p-hsv4', 'om2p-lc', 'om5p', 'om5p-an', @@ -99,31 +96,44 @@ local primary_addrs = { 'glinet,gl-ar750s-nor', 'ocedo,raccoon', }}, + {'brcm2708'}, {'ipq40xx', 'generic', { 'avm,fritzbox-4040', + }}, + {'ipq806x', 'generic', { + 'netgear,r7800', + }}, + {'lantiq', 'xway', { + 'netgear,dgn3500b', + }}, + {'ramips', 'mt7620', { + 'c20-v1', + 'c20i', + 'c50', + 'tplink,c2-v1', + }}, + {'x86'}, + }}, + {interface('wan'), { + {'ar71xx', 'generic', { + 'a40', + 'a60', + 'archer-c25-v1', + 'archer-c60-v2', + 'om2pv4', + 'om2p-hsv4', + }}, + {'ipq40xx', 'generic', { + 'linksys,ea6350v3', 'openmesh,a42', 'openmesh,a62', }}, {'mpc85xx', 'p1020', { 'aerohive,hiveap-330', + 'ocedo,panda', }}, {'ramips', 'mt7620', { - 'miwifi-mini', 'tplink,c2-v1', 'c20-v1', 'c20i', 'c50', - }}, - }}, - {netdev('eth0'), { - {'ar71xx', 'generic', { - 'archer-c5', - 'archer-c58-v1', - 'archer-c59-v1', - 'archer-c60-v1', - 'archer-c7', - }}, - {'ipq806x', 'generic', { - 'netgear,r7800', - }}, - {'mpc85xx', 'p1020', { - 'ocedo,panda', + 'miwifi-mini', }}, }}, {phy(1), { @@ -136,16 +146,6 @@ local primary_addrs = { 'dir-860l-b1', }}, }}, - {interface('lan'), { - {'lantiq', 'xway', { - 'netgear,dgn3500b', - }}, - }}, - {board('wan'), { - {'ipq40xx', 'generic', { - 'linksys,ea6350v3', - }}, - }}, -- phy0 default {phy(0), { {}, -- matches everything