add_route() { local config="$1" # is this route intended for the # $INTERFACE of this hotplug event config_get interface "$config" interface [ "$interface" != "$INTERFACE" ] && return 0 # get the real interface name from network config config_get dev "$interface" ifname config_get target "$config" target config_get netmask "$config" netmask config_get gateway "$config" gateway config_get metric "$config" metric config_get mtu "$config" mtu # make sure there is a gateway and a target [ -n "$target" ] || { echo "Missing target in route section $config" return 1 } [ -n "$gateway" ] || { config_get gateway "$interface" gateway } # handle "0.0.0.0" as "no gateway given" to allow # defining gateway-less routes while still keeping # the possibility to have static routes with a # proper gateway on interfaces with dynamic ips [ "$gateway" = "0.0.0.0" ] && gateway="" dest="${netmask:+-net "$target" netmask "$netmask"}" dest="${dest:--host "$target"}" /sbin/route add $dest ${gateway:+gw "$gateway"} \ ${dev:+dev "$dev"} ${metric:+ metric "$metric"} \ ${mtu:+mss "$mtu"} } add_route6() { local config="$1" # is this route intended for the # $INTERFACE of this hotplug event config_get interface "$config" interface [ "$interface" != "$INTERFACE" ] && return 0 # get the real interface name from network config config_get dev "$interface" ifname config_get target "$config" target config_get gateway "$config" gateway config_get metric "$config" metric config_get mtu "$config" mtu # make sure there is a gateway and a target [ -n "$target" ] || { echo "Missing target in route section $config" return 1 } [ -n "$gateway" ] || { config_get gateway "$interface" gateway } /sbin/route -A inet6 add $target ${gateway:+gw "$gateway"} \ ${dev:+dev "$dev"} ${metric:+ metric "$metric"} \ ${mtu:+mss "$mtu"} } # Skip fake devices (e.g. relayd) grep -qs "^ *$DEVICE:" /proc/net/dev || exit 0 case "$ACTION" in ifup) include /lib/network scan_interfaces # Setup aliases config_set "$INTERFACE" aliases "" config_set "$INTERFACE" alias_count 0 config_foreach setup_interface_alias alias "$INTERFACE" "$DEVICE" # Save alias references in state vars local aliases config_get aliases "$INTERFACE" aliases [ -z "$aliases" ] || uci_set_state network "$INTERFACE" aliases "$aliases" # Make ip6addr of parent iface the main address again local ip6addr config_get ip6addr "$INTERFACE" ip6addr [ -z "$ip6addr" ] || { ifconfig "$DEVICE" del "$ip6addr" ifconfig "$DEVICE" add "$ip6addr" } # Setup sysctls local proto accept_ra send_rs config_get proto "$INTERFACE" proto if [ "$proto" = dhcp ]; then accept_ra=1 send_rs=0 else accept_ra=0 send_rs=1 fi config_get_bool accept_ra "$INTERFACE" accept_ra $accept_ra [ $accept_ra -eq 0 ] || { logger -t ifup "Allowing Router Advertisements on $INTERFACE ($DEVICE)" accept_ra=2 } do_sysctl "net.ipv6.conf.$DEVICE.accept_ra" $accept_ra config_get_bool send_rs "$INTERFACE" send_rs $send_rs [ $send_rs -eq 0 ] || { logger -t ifup "Enabling Router Solicitations on $INTERFACE ($DEVICE)" send_rs=2 } do_sysctl "net.ipv6.conf.$DEVICE.forwarding" $send_rs # Setup routes config_foreach "add_route" route config_foreach "add_route6" route6 ;; ifdown) # Bring down named aliases local device=$(uci_get_state network "$INTERFACE" device) local ifn for ifn in $(ifconfig | sed -ne "s/^\(\($DEVICE${device:+\|$device}\|br-$INTERFACE\):[^[:space:]]\+\).*/\1/p"); do ifconfig "$ifn" down done ;; esac