From b51e1063b7c20aca078c7ee07fbde15de84520c2 Mon Sep 17 00:00:00 2001
From: Matthias Schiffer <mschiffer@universe-factory.net>
Date: Mon, 15 Sep 2014 18:55:22 +0200
Subject: [PATCH] Add utility function to generate unique MAC addresses derived
 from the primary MAC

---
 .../files/usr/lib/lua/gluon/util.lua          | 25 +++++++++++++++++--
 .../mesh-batman-adv-core/invariant/010-wan    | 18 +++++--------
 .../invariant/010-mesh-vpn-fastd              | 10 ++------
 3 files changed, 31 insertions(+), 22 deletions(-)

diff --git a/package/gluon-core/files/usr/lib/lua/gluon/util.lua b/package/gluon-core/files/usr/lib/lua/gluon/util.lua
index 4c067736d..c3d643945 100644
--- a/package/gluon-core/files/usr/lib/lua/gluon/util.lua
+++ b/package/gluon-core/files/usr/lib/lua/gluon/util.lua
@@ -25,7 +25,11 @@ end
 
 local os = os
 local string = string
-local require = require
+local tonumber = tonumber
+
+local nixio = require 'nixio'
+local sysconfig = require 'gluon.sysconfig'
+
 
 module 'gluon.util'
 
@@ -53,6 +57,23 @@ function unlock(file)
 end
 
 function node_id()
-  local sysconfig = require 'gluon.sysconfig'
   return string.gsub(sysconfig.primary_mac, ':', '')
 end
+
+-- Generates a (hopefully) unique MAC address
+-- The first parameter defines the function and the second
+-- parameter an ID to add to the MAC address
+-- Functions and IDs defined so far:
+-- (1, 0): WAN (for mesh-on-WAN)
+-- (1, 1): LAN (for mesh-on-LAN)
+-- (2, X): client interface for radioX
+-- (3, X): adhoc interface for radioX
+-- (4, 0): mesh VPN
+function generate_mac(f, i)
+  local m1, m2, m3, m4, m5, m6 = string.match(sysconfig.primary_mac, '(%x%x):(%x%x):(%x%x):(%x%x):(%x%x):(%x%x)')
+  m1 = nixio.bit.bor(tonumber(m1, 16), 0x02)
+  m2 = (tonumber(m2, 16)+f) % 0x100
+  m3 = (tonumber(m3, 16)+i) % 0x100
+
+  return string.format('%02x:%02x:%02x:%s:%s:%s', m1, m2, m3, m4, m5, m6)
+end
diff --git a/package/gluon-mesh-batman-adv-core/files/lib/gluon/upgrade/mesh-batman-adv-core/invariant/010-wan b/package/gluon-mesh-batman-adv-core/files/lib/gluon/upgrade/mesh-batman-adv-core/invariant/010-wan
index 3b6611cc6..f84a104d1 100755
--- a/package/gluon-mesh-batman-adv-core/files/lib/gluon/upgrade/mesh-batman-adv-core/invariant/010-wan
+++ b/package/gluon-mesh-batman-adv-core/files/lib/gluon/upgrade/mesh-batman-adv-core/invariant/010-wan
@@ -1,20 +1,14 @@
 #!/usr/bin/lua
 
-local nixio = require 'nixio'
 local sysconfig = require 'gluon.sysconfig'
+local util = require 'gluon.util'
 local uci = require('luci.model.uci').cursor()
 
 
-if sysconfig.wan_ifname:match('%.') and not uci:get('network', 'wan', 'macaddr') then
-  -- fix up duplicate mac addresses
-  local m1, m2, m3, m4, m5, m6 = string.match(sysconfig.primary_mac, '(%x%x):(%x%x):(%x%x):(%x%x):(%x%x):(%x%x)')
-  m1 = nixio.bit.bor(tonumber(m1, 16), 0x02)
-  m4 = (tonumber(m4, 16)+1) % 0x100
-  m6 = (tonumber(m6, 16)+1) % 0x100
-  local wanaddr = string.format('%02x:%s:%s:%02x:%s:%02x', m1, m2, m3, m4, m5, m6)
-
-  uci:set('network', 'wan', 'macaddr', wanaddr)
+if sysconfig.wan_ifname:match('%.') then
+  -- fix up duplicate mac addresses (for mesh-on-WAN)
+  uci:set('network', 'wan', 'macaddr', util.generate_mac(1, 0))
+  uci:save('network')
+  uci:commit('network')
 end
 
-uci:save('network')
-uci:commit('network')
diff --git a/package/gluon-mesh-vpn-fastd/files/lib/gluon/upgrade/mesh-vpn-fastd/invariant/010-mesh-vpn-fastd b/package/gluon-mesh-vpn-fastd/files/lib/gluon/upgrade/mesh-vpn-fastd/invariant/010-mesh-vpn-fastd
index 6e06e1428..13342d325 100755
--- a/package/gluon-mesh-vpn-fastd/files/lib/gluon/upgrade/mesh-vpn-fastd/invariant/010-mesh-vpn-fastd
+++ b/package/gluon-mesh-vpn-fastd/files/lib/gluon/upgrade/mesh-vpn-fastd/invariant/010-mesh-vpn-fastd
@@ -1,10 +1,9 @@
 #!/usr/bin/lua
 
 local site = require 'gluon.site_config'
-local sysconfig = require 'gluon.sysconfig'
 local users = require 'gluon.users'
+local util = require 'gluon.util'
 
-local nixio = require 'nixio'
 local uci = require 'luci.model.uci'
 
 local c = uci.cursor()
@@ -64,18 +63,13 @@ c:save('fastd')
 c:commit('fastd')
 
 
-local m1, m2, m3, m4, m5, m6 = string.match(sysconfig.primary_mac, '(%x%x):(%x%x):(%x%x):(%x%x):(%x%x):(%x%x)')
-m1 = nixio.bit.bor(tonumber(m1, 16), 0x02)
-m4 = (tonumber(m4, 16)+1) % 0x100
-local vpnaddr = string.format('%02x:%s:%s:%02x:%s:%s', m1, m2, m3, m4, m5, m6)
-
 c:section('network', 'interface', 'mesh_vpn',
 	  {
 		  ifname = 'mesh-vpn',
 		  proto = 'batadv',
 		  mesh = 'bat0',
 		  mesh_no_rebroadcast = 1,
-		  macaddr = vpnaddr,
+		  macaddr = util.generate_mac(4, 0),
 	  }
 )
 
-- 
GitLab