Add support for static routes per interface. You can specify one or more routes,...
[openwrt.git] / package / base-files / default / etc / hotplug.d / net / 10-net
index 29df1d2..b68ec1b 100644 (file)
@@ -1,44 +1,31 @@
 #!/bin/sh
-setup_eth()
-{
-       [ -f /proc/net/wl0 ] && {
-               lsmod | grep wlcompat >&- || insmod wlcompat
-       }
-       iwconfig "$INTERFACE" 2>&- | grep -v 'no wireless' >&- && {
-               /sbin/wifi
-       }
-       if="$(echo "$INTERFACE" | sed s,eth,et,)"
-       ifconfig "$INTERFACE" up 2>&- >&-
-       for vlan in $(seq 0 15); do
-               [ "$(nvram get vlan${vlan}hwname)" = "$if" ] && \
-                       $DEBUG vconfig add "$INTERFACE" "$vlan"
-       done
-}
-
 find_name()
 {
-       pppoa_ifname="atm0" # hack for ppp over atm, which has no ${proto}_ifname
-       interfaces="lan wan wifi $(nvram get ifnames)"
-       for ifname in $interfaces; do
+       for ifname in lan wan wifi ${ifnames}; do
                IFTYPE="${ifname}"
-               IFPROTO="$(nvram get ${IFTYPE}_proto)"
-               IFACE="$(nvram get ${IFTYPE}_ifname)"
-               [ -z "$IFPROTO" -o "$IFPROTO" = "none" ] || {
-                       [ "${IFACE}" = "$INTERFACE" ] && return 0
-                       case "$IFPROTO" in
-                               static|dhcp)
-                                       [ "${IFACE%%[0-9]*}" = "br" ] && {
-                                               for part in $(nvram get ${IFTYPE}_ifnames); do
-                                                       [ "$part" = "$INTERFACE" ] && return 0
-                                               done
-                                       }
-                               ;;
-                               *)
-                                       [ "$(nvram get ${IFPROTO}_ifname)" = "$INTERFACE" \
-                                         -a -x /sbin/ifup.${IFPROTO} ] && return 0
-                               ;;
-                       esac
-               }
+               eval "IFPROTO=\"\${${IFTYPE}_proto}\""
+               eval "IFACE=\"\${${IFTYPE}_ifname}\""
+               case "$IFPROTO" in
+                       ""|none);;
+                       static|dhcp)
+                               [ "${IFACE}" = "$INTERFACE" ] && return 0
+                               [ "${IFACE%%[0-9]*}" = "br" ] && {
+                                       eval "ifs=\"\${${IFTYPE}_ifnames}\""
+                                       for part in $ifs; do
+                                               [ "$part" = "$INTERFACE" ] && return 0
+                                       done
+                               }
+                       ;;
+                       pppoa)
+                               [ "$INTERFACE" = "atm0" \
+                                 -a -x /sbin/ifup.${IFPROTO} ] && return 0
+                       ;;
+                       *)
+                               eval "device=\"\${${IFTYPE}_device}\""
+                               [ "$device" = "$INTERFACE" \
+                                 -a -x /sbin/ifup.${IFPROTO} ] && return 0
+                       ;;
+               esac
        done
        IFACE=""
        IFTYPE=""
@@ -48,45 +35,57 @@ find_name()
 
 do_ifup() {
        if="$3"
-       if_proto="$(nvram get ${2}_proto)"
+       eval "if_proto=\"\${${2}_proto}\""
        
        pidfile=/var/run/${if}.pid
        [ -f $pidfile ] && $DEBUG kill $(cat $pidfile)
 
        case "$1" in
                static)
-                       ip=$(nvram get ${2}_ipaddr)
-                       netmask=$(nvram get ${2}_netmask)
-                       gateway=$(nvram get ${2}_gateway)
+                       eval "ip=\"\${${2}_ipaddr}\""
+                       eval "ip6=\"\${${2}_ip6addr}\""
+                       eval "netmask=\"\${${2}_netmask}\""
+                       eval "gateway=\"\${${2}_gateway}\""
+                       eval "dns=\"\${${2}_dns}\""
+                       eval "static_route=\"\${${2}_static_route}\""
        
                        $DEBUG ifconfig $if $ip ${netmask:+netmask $netmask} broadcast + up
+                       [ -n "$ip6" ] && $DEBUG ifconfig $if add $ip6
+
+                       [ -n "$static_route" ] && {
+                               for route in $static_route; do
+                                       if [ "$(echo $route | cut -d \/ -f2)" != "32" ];
+                                       then
+                                               route add -net $(echo $route | cut -d \/ -f1) netmask $(echo $route | cut -d \/ -f1) dev $if
+                                       else
+                                               route add -host $(echo $route | cut -d \/ -f1) dev $if
+                                       fi
+                               done
+                       }
+
                        ${gateway:+$DEBUG route add default gw $gateway}
        
-                       [ -f /etc/resolv.conf ] || {
-                               debug "# --- creating /etc/resolv.conf ---"
-                               for dns in $(nvram get ${2}_dns); do
-                                       echo "nameserver $dns" >> /etc/resolv.conf
+                       [ -f /tmp/resolv.conf ] || {
+                               debug "# --- creating /tmp/resolv.conf ---"
+                               for ns in $dns; do
+                                       echo "nameserver $ns" >> /tmp/resolv.conf
                                done
                        }
                        
                        env -i ACTION="ifup" INTERFACE="${2}" PROTO=static /sbin/hotplug "iface" &
                ;;
                dhcp)
-                       DHCP_IP=$(nvram get ${2}_ipaddr)
-                       DHCP_NETMASK=$(nvram get ${2}_netmask)
+                       eval "ip=\"\${${2}_ipaddr}\""
+                       eval "netmask=\"\${${2}_netmask}\""
+                       eval "hostname=\"\${${2}_hostname}\""
+                       
                        $DEBUG ifconfig $if $ip ${netmask:+netmask $netmask} broadcast + up
        
-                       DHCP_ARGS="-i $if ${DHCP_IP:+-r $DHCP_IP} -b -p $pidfile"
-                       DHCP_HOSTNAME=$(nvram get ${2}_hostname)
-                       DHCP_HOSTNAME=${DHCP_HOSTNAME%%.*}
-                       [ -z $DHCP_HOSTNAME ] || DHCP_ARGS="$DHCP_ARGS -H $DHCP_HOSTNAME"
-                       [ "$if_proto" = "pptp" ] && DHCP_ARGS="$DHCP_ARGS -n -q" || DHCP_ARGS="$DHCP_ARGS -R &"
-                       oldpid=$(cat $pidfile)
-                       ${DEBUG:-eval} "udhcpc $DHCP_ARGS"
-                       pidof udhcpc | grep "$oldpid" >&- 2>&- && {
-                               sleep 1
-                               kill -9 $oldpid
-                       }
+                       args="-i $if ${ip:+-r $ip} -b -p $pidfile"
+                       hostname="${hostname%%.*}"
+                       args="$args${hostname:+ -H $hostname}"
+                       [ "$if_proto" = "pptp" ] && args="$args -n -q" || args="$args -R &"
+                       ${DEBUG:-eval} "udhcpc $args"
                        # hotplug events are handled by /usr/share/udhcpc/default.script
                ;;
                *)
@@ -99,25 +98,23 @@ do_ifup() {
 
 do_register()
 {
-       case "${INTERFACE%%[0-9]*}" in
-               eth) setup_eth;;
-       esac
-
        [ -z "$IFTYPE" -o -z "$IFPROTO" ] && {
                find_name || {
                        case "${INTERFACE%%[0-9]*}" in
                                wds) 
-                                       for tmp in lan wifi; do
-                                               [ -z "$IFPROTO" ] && [ "$(nvram get ${tmp}_ifname)" = "br0" ] && {
-                                                       IFPROTO="$(nvram get ${tmp}_proto)"
+                                       for ifname in lan wifi; do
+                                               eval "if=\"\${${ifname}_ifname}\""
+                                               [ -z "$IFPROTO" ] && [ "$if" = "br0" ] && {
+                                                       eval "IFPROTO=\"\${${2}_proto}\""
                                                        IFTYPE="${tmp}"
                                                }
                                        done
                                        [ -z "$IFPROTO" ] && return 0
                                ;;
                                atm)
-                                       for tmp in lan wan wifi $(nvram get ifnames); do
-                                               [ "$(nvram get ${tmp}_proto)" = "pppoa" ] && {
+                                       for tmp in lan wan wifi ${ifnames}; do
+                                               eval "if_proto=\"\${${2}_proto}\""
+                                               [ "$if_proto" = "pppoa" ] && {
                                                        do_ifup "pppoa" "$tmp" "$INTERFACE"
                                                        return 0
                                                }
@@ -133,16 +130,16 @@ do_register()
        case "${INTERFACE%%[0-9]*}" in 
                ppp|atm);;
                *)
-                       mac=$(nvram get ${IFTYPE}_hwaddr)
+                       eval "mac=\"\${${IFTYPE}_hwaddr}\""
                        ${mac:+$DEBUG ifconfig $INTERFACE down hw ether $mac}
                ;;
        esac
 
-       if="$(nvram get ${IFTYPE}_ifname)"
+       eval "if=\"\${${IFTYPE}_ifname}\""
        if [ "${if%%[0-9]}" = "br" ]; then
                if_valid "$INTERFACE" && {
                        ifconfig "$if" 2>&- >&- || {
-                               stp=$(nvram get ${IFTYPE}_stp)
+                               eval "stp=\"\${${IFTYPE}_stp}\""
                                $DEBUG brctl addbr "$if"
                                $DEBUG brctl setfd "$if" 0
                                $DEBUG brctl stp "$if" "${stp:-0}"
@@ -150,20 +147,21 @@ do_register()
 
                        if [ "$INTERFACE" != "$if" ]; then
                                $DEBUG ifconfig "$INTERFACE" 0.0.0.0 up
-                               brctl addif "$if" "$INTERFACE"
+                               $DEBUG brctl addif "$if" "$INTERFACE"
+                               $DEBUG ifconfig "$INTERFACE" allmulti
                        else
                                do_ifup "$IFPROTO" "$IFTYPE" "$if"
                        fi
                }
-       else
-               do_ifup "$IFPROTO" "$IFTYPE" "$if"
+       else 
+               [ "${INTERFACE%%[0-9]*}" = "ppp" ] || do_ifup "$IFPROTO" "$IFTYPE" "$if"
        fi
 }
 
 do_unregister() {
-       [ "${INTERFACE%%[0-9]*}" = "atm" ] || ifconfig "$INTERFACE" 0.0.0.0 down 2>&-
-       [ -z "$IFTYPE" -o -z "$IFPROTO" ] && find_name
-       [ -z "$IFTYPE" -o -z "$IFPROTO" ] && return 0
+       [ -z "$IFTYPE" -o -z "$IFPROTO" ] && {
+               find_name || return 0
+       }
        
        [ "${IFACE%%[0-9]*}" = "br" ] && {
                if [ "$INTERFACE" != "$IFACE" ]; then
@@ -175,16 +173,17 @@ do_unregister() {
        
        case "$IFPROTO" in
                pppoe|pppoa|pptp) 
-                       killall ifup.${IFPROTO}
-                       killall pppd
+                       killall pppd 2>&- >&-
                ;;
                dhcp)
                        [ -f /var/run/${INTERFACE}.pid ] && kill "$(cat /var/run/${INTERFACE}.pid)" 2>&- >&-
                ;;
        esac
+
+       [ "${INTERFACE%%[0-9]*}" = "atm" ] || ifconfig "$INTERFACE" 0.0.0.0 down 2>&-
 }
 
 case "$ACTION" in
-       register) do_register;;
-       unregister) do_unregister;;
+       add|register) do_register;;
+       remove|unregister) do_unregister;;
 esac
This page took 0.027518 seconds and 4 git commands to generate.