base-files: allow setting device and bridge macs

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>
This commit is contained in:
John Crispin 2020-11-28 11:43:47 +01:00
parent f3926d233d
commit 9290539ca9
2 changed files with 42 additions and 9 deletions

View file

@ -9,11 +9,17 @@ CFG=/etc/board.json
generate_bridge() { generate_bridge() {
local name=$1 local name=$1
local macaddr=$2
uci -q batch <<-EOF uci -q batch <<-EOF
set network.$name=device set network.$name=device
set network.$name.name=$name set network.$name.name=$name
set network.$name.type=bridge set network.$name.type=bridge
EOF EOF
if [ -n "$macaddr" ]; then
uci -q batch <<-EOF
set network.$name.macaddr=$macaddr
EOF
fi
} }
bridge_vlan_id=0 bridge_vlan_id=0
@ -21,11 +27,11 @@ generate_bridge_vlan() {
local name=$1_vlan local name=$1_vlan
local device=$2 local device=$2
local ports="$3" local ports="$3"
bridge_vlan_id=$((bridge_vlan_id + 1)) local vlan="$4"
uci -q batch <<-EOF uci -q batch <<-EOF
set network.$name=bridge-vlan set network.$name=bridge-vlan
set network.$name.device='$device' set network.$name.device='$device'
set network.$name.vlan='$bridge_vlan_id' set network.$name.vlan='$vlan'
set network.$name.ports='$ports' set network.$name.ports='$ports'
EOF EOF
} }
@ -85,12 +91,12 @@ generate_static_network() {
addr_offset=2 addr_offset=2
generate_network() { generate_network() {
local ifname macaddr protocol type ipaddr netmask local ifname macaddr protocol type ipaddr netmask vlan
local bridge=$2 local bridge=$2
json_select network json_select network
json_select "$1" json_select "$1"
json_get_vars ifname macaddr protocol ipaddr netmask json_get_vars ifname macaddr protocol ipaddr netmask vlan
json_select .. json_select ..
json_select .. json_select ..
@ -102,8 +108,12 @@ generate_network() {
esac esac
[ -n "$bridge" ] && { [ -n "$bridge" ] && {
generate_bridge_vlan $1 $bridge "$ifname" if [ -z "$vlan" ]; then
ifname=$bridge.$bridge_vlan_id bridge_vlan_id=$((bridge_vlan_id + 1))
vlan=$bridge_vlan_id
fi
generate_bridge_vlan $1 $bridge "$ifname" $vlan
ifname=$bridge.$vlan
type="" type=""
} }
@ -465,14 +475,21 @@ json_load "$(cat ${CFG})"
umask 077 umask 077
if [ ! -s /etc/config/network ]; then if [ ! -s /etc/config/network ]; then
bridge_name=""
touch /etc/config/network touch /etc/config/network
generate_static_network generate_static_network
json_get_vars bridge 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 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 json_get_keys keys switch
for key in $keys; do generate_switch $key; done for key in $keys; do generate_switch $key; done

View file

@ -91,7 +91,23 @@ ucidef_set_interfaces_lan_wan() {
} }
ucidef_set_bridge_device() { 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() { _ucidef_add_switch_port() {