base-files: generate bridge device sections with br- name prefix
[openwrt/openwrt.git] / package / base-files / files / bin / config_generate
index fa148685ccc6de0108b75d5e5268b1a4cfbd4615..efcd7342423268ea60a004942c3e4f1f04faf6ad 100755 (executable)
@@ -7,6 +7,35 @@ 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
+       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 name=$1_vlan
+       local device=$2
+       local ports="$3"
+       local vlan="$4"
+       uci -q batch <<-EOF
+               set network.$name=bridge-vlan
+               set network.$name.device='$device'
+               set network.$name.vlan='$vlan'
+               set network.$name.ports='$ports'
+       EOF
+}
+
 generate_static_network() {
        uci -q batch <<-EOF
                delete network.loopback
@@ -15,10 +44,14 @@ generate_static_network() {
                set network.loopback.proto='static'
                set network.loopback.ipaddr='127.0.0.1'
                set network.loopback.netmask='255.0.0.0'
-               delete network.globals
-               set network.globals='globals'
-               set network.globals.ula_prefix='auto'
        EOF
+               [ -e /proc/sys/net/ipv6 ] && {
+                       uci -q batch <<-EOF
+                               delete network.globals
+                               set network.globals='globals'
+                               set network.globals.ula_prefix='auto'
+                       EOF
+               }
 
        if json_is_a dsl object; then
                json_select dsl
@@ -58,20 +91,44 @@ 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
-
-       # force bridge for multi-interface devices (and lan)
-       case "$1:$ifname" in
-               *\ * | lan:*) type="bridge" ;;
-       esac
+       [ -n "$ifname" -o -n "$ports" ] || return
+
+       # 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='br-$1'
+                       set network.@device[-1].type='bridge'
+               EOF
+               for port in $ports; do uci add_list network.@device[-1].ports="$port"; done
+               ifname=br-$1
+               type=
+       }
+
+       [ -n "$bridge" ] && {
+               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=""
+       }
 
        uci -q batch <<-EOF
                delete network.$1
@@ -81,12 +138,16 @@ generate_network() {
                set network.$1.proto='none'
        EOF
 
-       [ -n "$macaddr" ] && uci -q batch <<-EOF
-               delete network.$1_dev
-               set network.$1_dev='device'
-               set network.$1_dev.name='$ifname'
-               set network.$1_dev.macaddr='$macaddr'
-       EOF
+       if [ -n "$macaddr" ]; then
+               for name in $ifname; do
+                       uci -q batch <<-EOF
+                               delete network.$1_${name/./_}_dev
+                               set network.$1_${name/./_}_dev='device'
+                               set network.$1_${name/./_}_dev.name='$name'
+                               set network.$1_${name/./_}_dev.macaddr='$macaddr'
+                       EOF
+               done
+       fi
 
        case "$protocol" in
                static)
@@ -102,21 +163,23 @@ generate_network() {
                                set network.$1.proto='static'
                                set network.$1.ipaddr='$ipad'
                                set network.$1.netmask='$netm'
-                               set network.$1.ip6assign='60'
                        EOF
+                       [ -e /proc/sys/net/ipv6 ] && uci set network.$1.ip6assign='60'
                ;;
 
                dhcp)
                        # fixup IPv6 slave interface if parent is a bridge
                        [ "$type" = "bridge" ] && ifname="br-$1"
 
-                       uci -q batch <<-EOF
-                               set network.$1.proto='dhcp'
-                               delete network.${1}6
-                               set network.${1}6='interface'
-                               set network.${1}6.ifname='$ifname'
-                               set network.${1}6.proto='dhcpv6'
-                       EOF
+                       uci set network.$1.proto='dhcp'
+                       [ -e /proc/sys/net/ipv6 ] && {
+                               uci -q batch <<-EOF
+                                       delete network.${1}6
+                                       set network.${1}6='interface'
+                                       set network.${1}6.ifname='$ifname'
+                                       set network.${1}6.proto='dhcpv6'
+                               EOF
+                       }
                ;;
 
                pppoe)
@@ -124,12 +187,16 @@ generate_network() {
                                set network.$1.proto='pppoe'
                                set network.$1.username='username'
                                set network.$1.password='password'
-                               set network.$1.ipv6='1'
-                               delete network.${1}6
-                               set network.${1}6='interface'
-                               set network.${1}6.ifname='@${1}'
-                               set network.${1}6.proto='dhcpv6'
                        EOF
+                       [ -e /proc/sys/net/ipv6 ] && {
+                               uci -q batch <<-EOF
+                                       set network.$1.ipv6='1'
+                                       delete network.${1}6
+                                       set network.${1}6='interface'
+                                       set network.${1}6.ifname='@${1}'
+                                       set network.${1}6.proto='dhcpv6'
+                               EOF
+                       }
                ;;
        esac
 }
@@ -203,7 +270,8 @@ generate_switch() {
 
        json_select switch
        json_select "$key"
-       json_get_vars enable reset blinkrate cpu_port
+       json_get_vars enable reset blinkrate cpu_port \
+               ar8xxx_mib_type ar8xxx_mib_poll_interval
 
        uci -q batch <<-EOF
                add network switch
@@ -211,6 +279,8 @@ generate_switch() {
                set network.@switch[-1].reset='$reset'
                set network.@switch[-1].enable_vlan='$enable'
                set network.@switch[-1].blinkrate='$blinkrate'
+               set network.@switch[-1].ar8xxx_mib_type='$ar8xxx_mib_type'
+               set network.@switch[-1].ar8xxx_mib_poll_interval='$ar8xxx_mib_poll_interval'
        EOF
 
        generate_switch_vlans_ports "$1"
@@ -219,7 +289,6 @@ generate_switch() {
        json_select ..
 }
 
-
 generate_static_system() {
        uci -q batch <<-EOF
                delete system.@system[0]
@@ -247,6 +316,13 @@ generate_static_system() {
                                uci -q set "system.@system[-1].hostname=$hostname"
                        fi
 
+                       local compat_version
+                       if json_get_var compat_version compat_version; then
+                               uci -q set "system.@system[-1].compat_version=$compat_version"
+                       else
+                               uci -q set "system.@system[-1].compat_version=1.0"
+                       fi
+
                        if json_is_a ntpserver array; then
                                local keys key
                                json_get_keys keys ntpserver
@@ -356,11 +432,12 @@ generate_led() {
                ;;
 
                switch)
-                       local port_mask speed_mask
-                       json_get_vars port_mask speed_mask
+                       local port_mask speed_mask mode
+                       json_get_vars port_mask speed_mask mode
                        uci -q batch <<-EOF
                                set system.$cfg.port_mask='$port_mask'
                                set system.$cfg.speed_mask='$speed_mask'
+                               set system.$cfg.mode='$mode'
                        EOF
                ;;
 
@@ -408,12 +485,24 @@ generate_gpioswitch() {
 json_init
 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" ] && {
+               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; 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