b68ec1be28cce1465c1df4445733c7f4b9f90c16
[openwrt.git] / package / base-files / default / etc / hotplug.d / net / 10-net
1 #!/bin/sh
2 find_name()
3 {
4         for ifname in lan wan wifi ${ifnames}; do
5                 IFTYPE="${ifname}"
6                 eval "IFPROTO=\"\${${IFTYPE}_proto}\""
7                 eval "IFACE=\"\${${IFTYPE}_ifname}\""
8                 case "$IFPROTO" in
9                         ""|none);;
10                         static|dhcp)
11                                 [ "${IFACE}" = "$INTERFACE" ] && return 0
12                                 [ "${IFACE%%[0-9]*}" = "br" ] && {
13                                         eval "ifs=\"\${${IFTYPE}_ifnames}\""
14                                         for part in $ifs; do
15                                                 [ "$part" = "$INTERFACE" ] && return 0
16                                         done
17                                 }
18                         ;;
19                         pppoa)
20                                 [ "$INTERFACE" = "atm0" \
21                                   -a -x /sbin/ifup.${IFPROTO} ] && return 0
22                         ;;
23                         *)
24                                 eval "device=\"\${${IFTYPE}_device}\""
25                                 [ "$device" = "$INTERFACE" \
26                                   -a -x /sbin/ifup.${IFPROTO} ] && return 0
27                         ;;
28                 esac
29         done
30         IFACE=""
31         IFTYPE=""
32         IFPROTO=""
33         return 255
34 }
35
36 do_ifup() {
37         if="$3"
38         eval "if_proto=\"\${${2}_proto}\""
39         
40         pidfile=/var/run/${if}.pid
41         [ -f $pidfile ] && $DEBUG kill $(cat $pidfile)
42
43         case "$1" in
44                 static)
45                         eval "ip=\"\${${2}_ipaddr}\""
46                         eval "ip6=\"\${${2}_ip6addr}\""
47                         eval "netmask=\"\${${2}_netmask}\""
48                         eval "gateway=\"\${${2}_gateway}\""
49                         eval "dns=\"\${${2}_dns}\""
50                         eval "static_route=\"\${${2}_static_route}\""
51         
52                         $DEBUG ifconfig $if $ip ${netmask:+netmask $netmask} broadcast + up
53                         [ -n "$ip6" ] && $DEBUG ifconfig $if add $ip6
54
55                         [ -n "$static_route" ] && {
56                                 for route in $static_route; do
57                                         if [ "$(echo $route | cut -d \/ -f2)" != "32" ];
58                                         then
59                                                 route add -net $(echo $route | cut -d \/ -f1) netmask $(echo $route | cut -d \/ -f1) dev $if
60                                         else
61                                                 route add -host $(echo $route | cut -d \/ -f1) dev $if
62                                         fi
63                                 done
64                         }
65
66                         ${gateway:+$DEBUG route add default gw $gateway}
67         
68                         [ -f /tmp/resolv.conf ] || {
69                                 debug "# --- creating /tmp/resolv.conf ---"
70                                 for ns in $dns; do
71                                         echo "nameserver $ns" >> /tmp/resolv.conf
72                                 done
73                         }
74                         
75                         env -i ACTION="ifup" INTERFACE="${2}" PROTO=static /sbin/hotplug "iface" &
76                 ;;
77                 dhcp)
78                         eval "ip=\"\${${2}_ipaddr}\""
79                         eval "netmask=\"\${${2}_netmask}\""
80                         eval "hostname=\"\${${2}_hostname}\""
81                         
82                         $DEBUG ifconfig $if $ip ${netmask:+netmask $netmask} broadcast + up
83         
84                         args="-i $if ${ip:+-r $ip} -b -p $pidfile"
85                         hostname="${hostname%%.*}"
86                         args="$args${hostname:+ -H $hostname}"
87                         [ "$if_proto" = "pptp" ] && args="$args -n -q" || args="$args -R &"
88                         ${DEBUG:-eval} "udhcpc $args"
89                         # hotplug events are handled by /usr/share/udhcpc/default.script
90                 ;;
91                 *)
92                         if [ -x "/sbin/ifup.$1" ]; then
93                                 ( $DEBUG . /sbin/ifup.$1 ${2} $3 )
94                         fi
95                 ;;
96         esac
97 }
98
99 do_register()
100 {
101         [ -z "$IFTYPE" -o -z "$IFPROTO" ] && {
102                 find_name || {
103                         case "${INTERFACE%%[0-9]*}" in
104                                 wds) 
105                                         for ifname in lan wifi; do
106                                                 eval "if=\"\${${ifname}_ifname}\""
107                                                 [ -z "$IFPROTO" ] && [ "$if" = "br0" ] && {
108                                                         eval "IFPROTO=\"\${${2}_proto}\""
109                                                         IFTYPE="${tmp}"
110                                                 }
111                                         done
112                                         [ -z "$IFPROTO" ] && return 0
113                                 ;;
114                                 atm)
115                                         for tmp in lan wan wifi ${ifnames}; do
116                                                 eval "if_proto=\"\${${2}_proto}\""
117                                                 [ "$if_proto" = "pppoa" ] && {
118                                                         do_ifup "pppoa" "$tmp" "$INTERFACE"
119                                                         return 0
120                                                 }
121                                         done
122                                 ;;
123                                 *)
124                                         return 0
125                                 ;;
126                         esac
127                 }
128         }
129
130         case "${INTERFACE%%[0-9]*}" in 
131                 ppp|atm);;
132                 *)
133                         eval "mac=\"\${${IFTYPE}_hwaddr}\""
134                         ${mac:+$DEBUG ifconfig $INTERFACE down hw ether $mac}
135                 ;;
136         esac
137
138         eval "if=\"\${${IFTYPE}_ifname}\""
139         if [ "${if%%[0-9]}" = "br" ]; then
140                 if_valid "$INTERFACE" && {
141                         ifconfig "$if" 2>&- >&- || {
142                                 eval "stp=\"\${${IFTYPE}_stp}\""
143                                 $DEBUG brctl addbr "$if"
144                                 $DEBUG brctl setfd "$if" 0
145                                 $DEBUG brctl stp "$if" "${stp:-0}"
146                         }
147
148                         if [ "$INTERFACE" != "$if" ]; then
149                                 $DEBUG ifconfig "$INTERFACE" 0.0.0.0 up
150                                 $DEBUG brctl addif "$if" "$INTERFACE"
151                                 $DEBUG ifconfig "$INTERFACE" allmulti
152                         else
153                                 do_ifup "$IFPROTO" "$IFTYPE" "$if"
154                         fi
155                 }
156         else 
157                 [ "${INTERFACE%%[0-9]*}" = "ppp" ] || do_ifup "$IFPROTO" "$IFTYPE" "$if"
158         fi
159 }
160
161 do_unregister() {
162         [ -z "$IFTYPE" -o -z "$IFPROTO" ] && {
163                 find_name || return 0
164         }
165         
166         [ "${IFACE%%[0-9]*}" = "br" ] && {
167                 if [ "$INTERFACE" != "$IFACE" ]; then
168                         brctl delif "$IFACE" "$INTERFACE" 2>&- >&-
169                 else
170                         brctl delbr "$IFACE" 2>&- >&-
171                 fi
172         }
173         
174         case "$IFPROTO" in
175                 pppoe|pppoa|pptp) 
176                         killall pppd 2>&- >&-
177                 ;;
178                 dhcp)
179                         [ -f /var/run/${INTERFACE}.pid ] && kill "$(cat /var/run/${INTERFACE}.pid)" 2>&- >&-
180                 ;;
181         esac
182
183         [ "${INTERFACE%%[0-9]*}" = "atm" ] || ifconfig "$INTERFACE" 0.0.0.0 down 2>&-
184 }
185
186 case "$ACTION" in
187         add|register) do_register;;
188         remove|unregister) do_unregister;;
189 esac