base-files: allow setting device and bridge macs
[openwrt/staging/jow.git] / package / base-files / files / bin / config_generate
index 79386d41b54fcc605c0ae4a3a4b7141bfed604d3..ee3958e733faadc36b427e132cacd26c15212840 100755 (executable)
@@ -9,11 +9,17 @@ 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
@@ -21,11 +27,11 @@ generate_bridge_vlan() {
        local name=$1_vlan
        local device=$2
        local ports="$3"
-       bridge_vlan_id=$((bridge_vlan_id + 1))
+       local vlan="$4"
        uci -q batch <<-EOF
                set network.$name=bridge-vlan
                set network.$name.device='$device'
-               set network.$name.vlan='$bridge_vlan_id'
+               set network.$name.vlan='$vlan'
                set network.$name.ports='$ports'
        EOF
 }
@@ -85,12 +91,12 @@ generate_static_network() {
 
 addr_offset=2
 generate_network() {
-       local ifname macaddr protocol type ipaddr netmask
+       local 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_vars ifname macaddr protocol ipaddr netmask vlan
                json_select ..
        json_select ..
 
@@ -102,8 +108,12 @@ generate_network() {
        esac
 
        [ -n "$bridge" ] && {
-               generate_bridge_vlan $1 $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=""
        }
 
@@ -465,14 +475,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