base-files: allow setting device and bridge macs
authorJohn Crispin <john@phrozen.org>
Sat, 28 Nov 2020 10:43:47 +0000 (11:43 +0100)
committerJohn Crispin <john@phrozen.org>
Wed, 2 Dec 2020 06:51:36 +0000 (07:51 +0100)
Add code for setting mac addresses inside board.json and rendering
them out to uci. On switches we want to have a unique MAC on each port.
With 48 port switches that would require 48 device sections in
/etc/config/network. Doing so via board.json is easier.

Signed-off-by: John Crispin <john@phrozen.org>
package/base-files/files/bin/config_generate
package/base-files/files/lib/functions/uci-defaults.sh

index 79386d41b54fcc605c0ae4a3a4b7141bfed604d3..ee3958e733faadc36b427e132cacd26c15212840 100755 (executable)
@@ -9,11 +9,17 @@ CFG=/etc/board.json
 
 generate_bridge() {
        local name=$1
+       local macaddr=$2
        uci -q batch <<-EOF
                set network.$name=device
                set network.$name.name=$name
                set network.$name.type=bridge
        EOF
+       if [ -n "$macaddr" ]; then
+               uci -q batch <<-EOF
+                       set network.$name.macaddr=$macaddr
+               EOF
+       fi
 }
 
 bridge_vlan_id=0
@@ -21,11 +27,11 @@ generate_bridge_vlan() {
        local name=$1_vlan
        local device=$2
        local ports="$3"
-       bridge_vlan_id=$((bridge_vlan_id + 1))
+       local vlan="$4"
        uci -q batch <<-EOF
                set network.$name=bridge-vlan
                set network.$name.device='$device'
-               set network.$name.vlan='$bridge_vlan_id'
+               set network.$name.vlan='$vlan'
                set network.$name.ports='$ports'
        EOF
 }
@@ -85,12 +91,12 @@ generate_static_network() {
 
 addr_offset=2
 generate_network() {
-       local ifname macaddr protocol type ipaddr netmask
+       local ifname macaddr protocol type ipaddr netmask vlan
        local bridge=$2
 
        json_select network
                json_select "$1"
-                       json_get_vars ifname macaddr protocol ipaddr netmask
+                       json_get_vars ifname macaddr protocol ipaddr netmask vlan
                json_select ..
        json_select ..
 
@@ -102,8 +108,12 @@ generate_network() {
        esac
 
        [ -n "$bridge" ] && {
-               generate_bridge_vlan $1 $bridge "$ifname"
-               ifname=$bridge.$bridge_vlan_id
+               if [ -z "$vlan" ]; then
+                       bridge_vlan_id=$((bridge_vlan_id + 1))
+                       vlan=$bridge_vlan_id
+               fi
+               generate_bridge_vlan $1 $bridge "$ifname" $vlan
+               ifname=$bridge.$vlan
                type=""
        }
 
@@ -465,14 +475,21 @@ json_load "$(cat ${CFG})"
 umask 077
 
 if [ ! -s /etc/config/network ]; then
+       bridge_name=""
        touch /etc/config/network
        generate_static_network
 
        json_get_vars bridge
-       [ -n "$bridge" ] && generate_bridge $bridge
+       [ -n "$bridge" ] && {
+               json_select bridge
+               json_get_vars name macaddr
+               generate_bridge "$name" "$macaddr"
+               json_select ..
+               bridge_name=$name
+       }
 
        json_get_keys keys network
-       for key in $keys; do generate_network $key $bridge; done
+       for key in $keys; do generate_network $key $bridge_name; done
 
        json_get_keys keys switch
        for key in $keys; do generate_switch $key; done
index 39bbeda24c17e4703863f993b1f355981a8a50c5..2f50cd6bfdf543c6f4590a43fdded72505b3e6a1 100755 (executable)
@@ -91,7 +91,23 @@ ucidef_set_interfaces_lan_wan() {
 }
 
 ucidef_set_bridge_device() {
-       json_add_string bridge "${1:switch0}"
+       json_select_object bridge
+       json_add_string name "${1:switch0}"
+       json_select ..
+}
+
+ucidef_set_bridge_mac() {
+       json_select_object bridge
+       json_add_string macaddr "${1}"
+       json_select ..
+}
+
+ucidef_set_network_device_mac() {
+       json_select_object "network-device"
+       json_select_object "${1}"
+       json_add_string macaddr "${2}"
+       json_select ..
+       json_select ..
 }
 
 _ucidef_add_switch_port() {