Răsfoiți Sursa

base-files: add board.d support for bridge device

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 <[email protected]>
John Crispin 5 ani în urmă
părinte
comite
be09c5a3cd

+ 1 - 1
package/base-files/Makefile

@@ -12,7 +12,7 @@ include $(INCLUDE_DIR)/version.mk
 include $(INCLUDE_DIR)/feeds.mk
 include $(INCLUDE_DIR)/feeds.mk
 
 
 PKG_NAME:=base-files
 PKG_NAME:=base-files
-PKG_RELEASE:=234
+PKG_RELEASE:=235
 PKG_FLAGS:=nonshared
 PKG_FLAGS:=nonshared
 
 
 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/
 PKG_FILE_DEPENDS:=$(PLATFORM_DIR)/ $(GENERIC_PLATFORM_DIR)/base-files/

+ 33 - 2
package/base-files/files/bin/config_generate

@@ -7,6 +7,28 @@ CFG=/etc/board.json
 [ -s $CFG ] || /bin/board_detect || exit 1
 [ -s $CFG ] || /bin/board_detect || exit 1
 [ -s /etc/config/network -a -s /etc/config/system ] && exit 0
 [ -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() {
 generate_static_network() {
 	uci -q batch <<-EOF
 	uci -q batch <<-EOF
 		delete network.loopback
 		delete network.loopback
@@ -63,6 +85,7 @@ 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
+	local bridge=$2
 
 
 	json_select network
 	json_select network
 		json_select "$1"
 		json_select "$1"
@@ -77,6 +100,12 @@ generate_network() {
 		*\ * | lan:*) type="bridge" ;;
 		*\ * | lan:*) type="bridge" ;;
 	esac
 	esac
 
 
+	[ -n "$bridge" ] && {
+		generate_bridge_vlan $bridge "$ifname"
+		ifname=$bridge.$bridge_vlan_id
+		type=""
+	}
+
 	uci -q batch <<-EOF
 	uci -q batch <<-EOF
 		delete network.$1
 		delete network.$1
 		set network.$1='interface'
 		set network.$1='interface'
@@ -236,7 +265,6 @@ generate_switch() {
 	json_select ..
 	json_select ..
 }
 }
 
 
-
 generate_static_system() {
 generate_static_system() {
 	uci -q batch <<-EOF
 	uci -q batch <<-EOF
 		delete system.@system[0]
 		delete system.@system[0]
@@ -439,8 +467,11 @@ if [ ! -s /etc/config/network ]; then
 	touch /etc/config/network
 	touch /etc/config/network
 	generate_static_network
 	generate_static_network
 
 
+	json_get_vars bridge
+	[ -n "$bridge" ] && generate_bridge $bridge
+
 	json_get_keys keys network
 	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
 	json_get_keys keys switch
 	for key in $keys; do generate_switch $key; done
 	for key in $keys; do generate_switch $key; done

+ 4 - 0
package/base-files/files/lib/functions/uci-defaults.sh

@@ -90,6 +90,10 @@ ucidef_set_interfaces_lan_wan() {
 	ucidef_set_interface_wan "$wan_if"
 	ucidef_set_interface_wan "$wan_if"
 }
 }
 
 
+ucidef_set_bridge_device() {
+	json_add_string bridge "${1:switch0}"
+}
+
 _ucidef_add_switch_port() {
 _ucidef_add_switch_port() {
 	# inherited: $num $device $need_tag $want_untag $role $index $prev_role
 	# inherited: $num $device $need_tag $want_untag $role $index $prev_role
 	# inherited: $n_cpu $n_ports $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5
 	# inherited: $n_cpu $n_ports $n_vlan $cpu0 $cpu1 $cpu2 $cpu3 $cpu4 $cpu5