base-files: add board.d support for bridge device
authorJohn Crispin <john@phrozen.org>
Tue, 3 Nov 2020 16:43:22 +0000 (17:43 +0100)
committerJohn Crispin <john@phrozen.org>
Wed, 4 Nov 2020 06:36:49 +0000 (07:36 +0100)
Latest netifd allows us to setup network bridges with implicit vlan
tagging. For this to work, we need to setup several additional uci
sections. This feature is particularly usefull for DSA tupe devices.
Add board.d and uci-defaults support for generating the sections.

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

index c139ea313b1aa729ac424a7957fce8a961ba2f22..f63c4db5339d0896e95fa633f7c7be7cc1fab4f2 100644 (file)
@@ -12,7 +12,7 @@ include $(INCLUDE_DIR)/version.mk
 include $(INCLUDE_DIR)/feeds.mk
 
 PKG_NAME:=base-files
-PKG_RELEASE:=234
+PKG_RELEASE:=235
 PKG_FLAGS:=nonshared
 
 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
index eb6816e5195ea94206ed2ed24d4c805db52b00f5..e23f901504f0e0622c75e5a2d41fc7efd221be28 100755 (executable)
@@ -7,6 +7,28 @@ CFG=/etc/board.json
 [ -s $CFG ] || /bin/board_detect || exit 1
 [ -s /etc/config/network -a -s /etc/config/system ] && exit 0
 
+generate_bridge() {
+       local name=$1
+       uci -q batch <<-EOF
+               set network.$name=device
+               set network.$name.name=$name
+               set network.$name.type=bridge
+       EOF
+}
+
+bridge_vlan_id=0
+generate_bridge_vlan() {
+       local device=$1
+       local ports="$2"
+       bridge_vlan_id=$((bridge_vlan_id + 1))
+       uci -q batch <<-EOF
+               add network bridge-vlan
+               set network.@bridge-vlan[-1].device='$device'
+               set network.@bridge-vlan[-1].vlan='$bridge_vlan_id'
+               set network.@bridge-vlan[-1].ports='$ports'
+       EOF
+}
+
 generate_static_network() {
        uci -q batch <<-EOF
                delete network.loopback
@@ -63,6 +85,7 @@ generate_static_network() {
 addr_offset=2
 generate_network() {
        local ifname macaddr protocol type ipaddr netmask
+       local bridge=$2
 
        json_select network
                json_select "$1"
@@ -77,6 +100,12 @@ generate_network() {
                *\ * | lan:*) type="bridge" ;;
        esac
 
+       [ -n "$bridge" ] && {
+               generate_bridge_vlan $bridge "$ifname"
+               ifname=$bridge.$bridge_vlan_id
+               type=""
+       }
+
        uci -q batch <<-EOF
                delete network.$1
                set network.$1='interface'
@@ -236,7 +265,6 @@ generate_switch() {
        json_select ..
 }
 
-
 generate_static_system() {
        uci -q batch <<-EOF
                delete system.@system[0]
@@ -439,8 +467,11 @@ if [ ! -s /etc/config/network ]; then
        touch /etc/config/network
        generate_static_network
 
+       json_get_vars bridge
+       [ -n "$bridge" ] && generate_bridge $bridge
+
        json_get_keys keys network
-       for key in $keys; do generate_network $key; done
+       for key in $keys; do generate_network $key $bridge; done
 
        json_get_keys keys switch
        for key in $keys; do generate_switch $key; done
index 27a409fe3b5ebcf14cacd63847c26f8e21f19cbd..39bbeda24c17e4703863f993b1f355981a8a50c5 100755 (executable)
@@ -90,6 +90,10 @@ ucidef_set_interfaces_lan_wan() {
        ucidef_set_interface_wan "$wan_if"
 }
 
+ucidef_set_bridge_device() {
+       json_add_string bridge "${1:switch0}"
+}
+
 _ucidef_add_switch_port() {
        # inherited: $num $device $need_tag $want_untag $role $index $prev_role
        # inherited: $n_cpu $n_ports $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5