[backfire] merge r25713
[openwrt-10.03/.git] / package / base-files / files / etc / hotplug.d / iface / 10-routes
index 4b55f8bb1e78a6925c932c6f5740d7a3fbba7ef6..a36885b871f93ff4cd035a74dde4ad887eda589c 100644 (file)
@@ -13,6 +13,7 @@ add_route() {
        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" ] || {
@@ -20,21 +21,117 @@ add_route() {
                return 1
        }
        [ -n "$gateway" ] || {
-               echo "Missing gateway in route section $config"
-               return 1
+               config_get gateway "$interface" gateway
        }
 
-       netmask="${netmask:-255.255.255.255}"
+       # 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 gw "$gateway" ${dev:+dev "$dev"} ${metric:+ metric "$metric"}
+       /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
+