base-files: generate "device" UCI type section for bridge
[openwrt/openwrt.git] / package / base-files / files / bin / config_generate
index e23f901504f0e0622c75e5a2d41fc7efd221be28..0f6f280cf095e7ca367d0ac88c1857aaf57f08b8 100755 (executable)
@@ -9,23 +9,30 @@ 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
 generate_bridge_vlan() {
-       local device=$1
-       local ports="$2"
-       bridge_vlan_id=$((bridge_vlan_id + 1))
+       local name=$1_vlan
+       local device=$2
+       local ports="$3"
+       local vlan="$4"
        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'
+               set network.$name=bridge-vlan
+               set network.$name.device='$device'
+               set network.$name.vlan='$vlan'
+               set network.$name.ports='$ports'
        EOF
 }
 
@@ -84,25 +91,42 @@ generate_static_network() {
 
 addr_offset=2
 generate_network() {
-       local ifname macaddr protocol type ipaddr netmask
+       local ports 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_values ports ports
+                       json_get_vars ifname macaddr protocol ipaddr netmask vlan
                json_select ..
        json_select ..
 
-       [ -n "$ifname" ] || return
+       [ -n "$ifname" -o -n "$ports" ] || return
 
-       # force bridge for multi-interface devices (and lan)
-       case "$1:$ifname" in
-               *\ * | lan:*) type="bridge" ;;
-       esac
+       # Force bridge for "lan" as it may have other devices (e.g. wireless)
+       # bridged
+       [ "$1" = "lan" -a -z "$ports" ] && {
+               ports="$ifname"
+       }
+
+       [ -n "$ports" ] && {
+               uci -q batch <<-EOF
+                       add network device
+                       set network.@device[-1].name='$1'
+                       set network.@device[-1].type='bridge'
+               EOF
+               for port in $ports; do uci add_list network.@device[-1].ports="$port"; done
+               ifname=$1
+               type=
+       }
 
        [ -n "$bridge" ] && {
-               generate_bridge_vlan $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=""
        }
 
@@ -464,14 +488,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