+ return 0
+}
+
+set_interface_ifname() {
+ local config="$1"
+ local ifname="$2"
+
+ local device
+ config_get device "$1" device
+ uci_toggle_state network "$config" ifname "$ifname"
+ uci_toggle_state network "$config" device "$device"
+}
+
+setup_interface_none() {
+ env -i ACTION="ifup" INTERFACE="$2" DEVICE="$1" PROTO=none /sbin/hotplug-call "iface" &
+}
+
+setup_interface_static() {
+ local iface="$1"
+ local config="$2"
+
+ local ipaddr netmask ip6addrs ipaddr
+ config_get ipaddr "$config" ipaddr
+ config_get netmask "$config" netmask
+ config_get ip6addrs "$config" ip6addr
+ [ -z "$ipaddr" -o -z "$netmask" ] && [ -z "$ip6addr" ] && return 1
+
+ local gateway ip6gw dns bcast metric
+ config_get gateway "$config" gateway
+ config_get ip6gw "$config" ip6gw
+ config_get dns "$config" dns
+ config_get bcast "$config" broadcast
+ config_get metric "$config" metric
+
+ [ -z "$ipaddr" ] || $DEBUG ifconfig "$iface" "$ipaddr" netmask "$netmask" broadcast "${bcast:-+}"
+ for ip6addr in $ip6addrs; do
+ case "$ip6addr" in
+ */*) ;;
+ *:*) ip6addr="$ip6addr/64" ;;
+ esac
+ $DEBUG ifconfig "$iface" add "$ip6addr"
+ done
+ [ -z "$gateway" ] || $DEBUG route add default gw "$gateway" ${metric:+metric $metric} dev "$iface"
+ [ -z "$ip6gw" ] || $DEBUG route -A inet6 add default gw "$ip6gw" ${metric:+metric $metric} dev "$iface"
+ [ -z "$dns" ] || add_dns "$config" $dns
+
+ config_get type "$config" TYPE
+ [ "$type" = "alias" ] && return 0
+
+ env -i ACTION="ifup" INTERFACE="$config" DEVICE="$iface" PROTO=static /sbin/hotplug-call "iface" &
+}
+
+setup_interface_alias() {
+ local config="$1"
+ local parent="$2"
+ local iface="$3"
+
+ local cfg
+ config_get cfg "$config" interface
+ [ "$parent" == "$cfg" ] || return 0
+
+ # parent device and ifname
+ local p_device p_type
+ config_get p_device "$cfg" device
+ config_get p_type "$cfg" type
+
+ # select alias ifname
+ local layer use_iface
+ config_get layer "$config" layer 2
+ case "$layer:$p_type" in
+ # layer 3: e.g. pppoe-wan or pptp-vpn
+ 3:*) use_iface="$iface" ;;
+
+ # layer 2 and parent is bridge: e.g. br-wan
+ 2:bridge) use_iface="br-$cfg" ;;
+
+ # layer 1: e.g. eth0 or ath0
+ *) use_iface="$p_device" ;;
+ esac
+
+ # alias counter
+ local ctr
+ config_get ctr "$parent" alias_count 0
+ ctr="$(($ctr + 1))"
+ config_set "$parent" alias_count "$ctr"
+
+ # alias list
+ local list
+ config_get list "$parent" aliases
+ append list "$config"
+ config_set "$parent" aliases "$list"
+
+ use_iface="$use_iface:$ctr"
+ set_interface_ifname "$config" "$use_iface"
+
+ local proto
+ config_get proto "$config" proto "static"
+ case "${proto}" in
+ static)
+ setup_interface_static "$use_iface" "$config"
+ ;;
+ *)
+ echo "Unsupported type '$proto' for alias config '$config'"
+ return 1
+ ;;
+ esac
+}
+
+setup_interface() {
+ local iface="$1"
+ local config="$2"
+ local proto="$3"
+ local vifmac="$4"
+
+ [ -n "$config" ] || {
+ config=$(find_config "$iface")
+ [ "$?" = 0 ] || return 1
+ }
+
+ prepare_interface "$iface" "$config" "$vifmac" || return 0
+
+ [ "$iface" = "br-$config" ] && {
+ # need to bring up the bridge and wait a second for
+ # it to switch to the 'forwarding' state, otherwise
+ # it will lose its routes...
+ ifconfig "$iface" up
+ sleep 1
+ }
+