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
}
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=""
}
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