base-files: add protocol qmi/mbim support for ucidef_set_interface()
[openwrt/openwrt.git] / package / base-files / files / bin / config_generate
index df221cc26ca478a3923bf2299b7b2d26ae75119f..0001f887466196373077d6ba01e47dbde9aabfbb 100755 (executable)
@@ -7,11 +7,40 @@ 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
                set network.loopback='interface'
-               set network.loopback.ifname='lo'
+               set network.loopback.device='lo'
                set network.loopback.proto='static'
                set network.loopback.ipaddr='127.0.0.1'
                set network.loopback.netmask='255.0.0.0'
@@ -62,36 +91,73 @@ generate_static_network() {
 
 addr_offset=2
 generate_network() {
-       local ifname macaddr protocol type ipaddr netmask
+       local ports device 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_vars device macaddr metric protocol ipaddr netmask vlan
+                       json_get_values ports ports
                json_select ..
        json_select ..
 
-       [ -n "$ifname" ] || return
-
-       # force bridge for multi-interface devices (and lan)
-       case "$1:$ifname" in
-               *\ * | lan:*) type="bridge" ;;
-       esac
+       [ -n "$device" -o -n "$ports" ] || return
+
+       # Force bridge for "lan" as it may have other devices (e.g. wireless)
+       # bridged
+       [ "$1" = "lan" -a -z "$ports" ] && {
+               ports="$device"
+       }
+
+       [ -n "$ports" -a -z "$bridge" ] && {
+               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
+               [ -n "$macaddr" ] && {
+                       for port in $ports; do
+                               uci -q batch <<-EOF
+                                       add network device
+                                       set network.@device[-1].name='$port'
+                                       set network.@device[-1].macaddr='$macaddr'
+                               EOF
+                       done
+               }
+               device=br-$1
+               type=
+               macaddr=""
+       }
+
+       [ -n "$bridge" ] && {
+               [ -z "$ports" ] && ports="$device"
+               if [ -z "$vlan" ]; then
+                       bridge_vlan_id=$((bridge_vlan_id + 1))
+                       vlan=$bridge_vlan_id
+               fi
+               generate_bridge_vlan $1 $bridge "$ports" $vlan
+               device=$bridge.$vlan
+               type=""
+       }
+
+       if [ -n "$macaddr" ]; then
+               uci -q batch <<-EOF
+                       add network device
+                       set network.@device[-1].name='$device'
+                       set network.@device[-1].macaddr='$macaddr'
+               EOF
+       fi
 
        uci -q batch <<-EOF
                delete network.$1
                set network.$1='interface'
                set network.$1.type='$type'
-               set network.$1.ifname='$ifname'
+               set network.$1.device='$device'
+               set network.$1.metric='$metric'
                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
-
        case "$protocol" in
                static)
                        local ipad
@@ -112,14 +178,14 @@ generate_network() {
 
                dhcp)
                        # fixup IPv6 slave interface if parent is a bridge
-                       [ "$type" = "bridge" ] && ifname="br-$1"
+                       [ "$type" = "bridge" ] && device="br-$1"
 
                        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.device='$device'
                                        set network.${1}6.proto='dhcpv6'
                                EOF
                        }
@@ -136,11 +202,19 @@ generate_network() {
                                        set network.$1.ipv6='1'
                                        delete network.${1}6
                                        set network.${1}6='interface'
-                                       set network.${1}6.ifname='@${1}'
+                                       set network.${1}6.device='@${1}'
                                        set network.${1}6.proto='dhcpv6'
                                EOF
                        }
                ;;
+
+               qmi|\
+               mbim)
+                       uci -q batch <<-EOF
+                               set network.$1.proto='${protocol}'
+                               set network.$1.pdptype='ipv4'
+                       EOF
+               ;;
        esac
 }
 
@@ -213,7 +287,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
@@ -221,6 +296,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"
@@ -229,7 +306,6 @@ generate_switch() {
        json_select ..
 }
 
-
 generate_static_system() {
        uci -q batch <<-EOF
                delete system.@system[0]
@@ -257,6 +333,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
@@ -419,12 +502,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