base-files: add protocol qmi/mbim support for ucidef_set_interface()
[openwrt/openwrt.git] / package / base-files / files / bin / config_generate
index ee3958e733faadc36b427e132cacd26c15212840..0001f887466196373077d6ba01e47dbde9aabfbb 100755 (executable)
@@ -40,7 +40,7 @@ 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'
@@ -91,51 +91,73 @@ generate_static_network() {
 
 addr_offset=2
 generate_network() {
-       local ifname macaddr protocol type ipaddr netmask vlan
+       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 vlan
+                       json_get_vars device macaddr metric protocol ipaddr netmask vlan
+                       json_get_values ports ports
                json_select ..
        json_select ..
 
-       [ -n "$ifname" ] || return
+       [ -n "$device" -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="$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 "$ifname" $vlan
-               ifname=$bridge.$vlan
+               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
 
-       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)
                        local ipad
@@ -156,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
                        }
@@ -180,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
 }