diff mbox series

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

Message ID 20201103164322.3964629-1-john@phrozen.org
State Accepted
Delegated to: John Crispin
Headers show
Series base-files: add board.d support for bridge device | expand

Commit Message

John Crispin Nov. 3, 2020, 4:43 p.m. UTC
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/files/bin/config_generate  | 35 +++++++++++++++++--
 .../files/lib/functions/uci-defaults.sh       |  4 +++
 2 files changed, 37 insertions(+), 2 deletions(-)

Comments

Adrian Schmutzler Nov. 3, 2020, 5:24 p.m. UTC | #1
Hi John,

> -----Original Message-----
> From: openwrt-devel [mailto:openwrt-devel-bounces@lists.openwrt.org]
> On Behalf Of John Crispin
> Sent: Dienstag, 3. November 2020 17:43
> To: openwrt-devel@lists.openwrt.org
> Cc: John Crispin <john@phrozen.org>
> Subject: [PATCH] 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.

Please also bump PKG_RELEASE for base-files when you apply this.

One typo below ...

> 
> Signed-off-by: John Crispin <john@phrozen.org>
> ---
>  package/base-files/files/bin/config_generate  | 35 +++++++++++++++++--
>  .../files/lib/functions/uci-defaults.sh       |  4 +++
>  2 files changed, 37 insertions(+), 2 deletions(-)
> 
> diff --git a/package/base-files/files/bin/config_generate b/package/base-
> files/files/bin/config_generate
> index eb6816e519..e23f901504 100755
> --- a/package/base-files/files/bin/config_generate
> +++ b/package/base-files/files/bin/config_generate
> @@ -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 diff --git
> a/package/base-files/files/lib/functions/uci-defaults.sh b/package/base-
> files/files/lib/functions/uci-defaults.sh
> index 27a409fe3b..73ba279fd5 100755
> --- a/package/base-files/files/lib/functions/uci-defaults.sh
> +++ b/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_brigde_device() {

brigde->bridge

Best

Adrian

> +	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
> --
> 2.25.1
> 
> 
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
John Crispin Nov. 3, 2020, 5:25 p.m. UTC | #2
thanks for the quick review

     John

On 03.11.20 18:24, Adrian Schmutzler wrote:
> Hi John,
>
>> -----Original Message-----
>> From: openwrt-devel [mailto:openwrt-devel-bounces@lists.openwrt.org]
>> On Behalf Of John Crispin
>> Sent: Dienstag, 3. November 2020 17:43
>> To: openwrt-devel@lists.openwrt.org
>> Cc: John Crispin <john@phrozen.org>
>> Subject: [PATCH] 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.
> Please also bump PKG_RELEASE for base-files when you apply this.
>
> One typo below ...
>
>> Signed-off-by: John Crispin <john@phrozen.org>
>> ---
>>   package/base-files/files/bin/config_generate  | 35 +++++++++++++++++--
>>   .../files/lib/functions/uci-defaults.sh       |  4 +++
>>   2 files changed, 37 insertions(+), 2 deletions(-)
>>
>> diff --git a/package/base-files/files/bin/config_generate b/package/base-
>> files/files/bin/config_generate
>> index eb6816e519..e23f901504 100755
>> --- a/package/base-files/files/bin/config_generate
>> +++ b/package/base-files/files/bin/config_generate
>> @@ -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 diff --git
>> a/package/base-files/files/lib/functions/uci-defaults.sh b/package/base-
>> files/files/lib/functions/uci-defaults.sh
>> index 27a409fe3b..73ba279fd5 100755
>> --- a/package/base-files/files/lib/functions/uci-defaults.sh
>> +++ b/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_brigde_device() {
> brigde->bridge
>
> Best
>
> Adrian
>
>> +	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
>> --
>> 2.25.1
>>
>>
>> _______________________________________________
>> openwrt-devel mailing list
>> openwrt-devel@lists.openwrt.org
>> https://lists.openwrt.org/mailman/listinfo/openwrt-devel
diff mbox series

Patch

diff --git a/package/base-files/files/bin/config_generate b/package/base-files/files/bin/config_generate
index eb6816e519..e23f901504 100755
--- a/package/base-files/files/bin/config_generate
+++ b/package/base-files/files/bin/config_generate
@@ -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
diff --git a/package/base-files/files/lib/functions/uci-defaults.sh b/package/base-files/files/lib/functions/uci-defaults.sh
index 27a409fe3b..73ba279fd5 100755
--- a/package/base-files/files/lib/functions/uci-defaults.sh
+++ b/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_brigde_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