40network/ifup.sh: do_static() and do_ipv6auto return 0 if no errors.
[platform/upstream/dracut.git] / modules.d / 40network / ifup.sh
1 #!/bin/sh
2 # -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*-
3 # ex: ts=8 sw=4 sts=4 et filetype=sh
4 #
5 # We don't need to check for ip= errors here, that is handled by the
6 # cmdline parser script
7 #
8 # without $2 means this is for real netroot case
9 # or it is for manually bring up network ie. for kdump scp vmcore
10 PATH=/usr/sbin:/usr/bin:/sbin:/bin
11
12 type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh
13 type ip_to_var >/dev/null 2>&1 || . /lib/net-lib.sh
14
15 # Huh? No $1?
16 [ -z "$1" ] && exit 1
17
18 # $netif reads easier than $1
19 netif=$1
20
21 # enslave this interface to bond?
22 if [ -e /tmp/bond.info ]; then
23     . /tmp/bond.info
24     for slave in $bondslaves ; do
25         if [ "$netif" = "$slave" ] ; then
26             netif=$bondname
27         fi
28     done
29 fi
30
31 # bridge this interface?
32 if [ -e /tmp/bridge.info ]; then
33     . /tmp/bridge.info
34     for ethname in $ethnames ; do
35         if [ "$netif" = "$ethname" ]; then
36             if [ "$netif" = "$bondname" ] && [ -n "$DO_BOND_SETUP" ] ; then
37                 : # We need to really setup bond (recursive call)
38             else
39                 netif="$bridgename"
40             fi
41         fi
42     done
43 fi
44
45 if [ -e /tmp/vlan.info ]; then
46     . /tmp/vlan.info
47     if [ "$netif" = "$phydevice" ]; then
48         if [ "$netif" = "$bondname" ] && [ -n "$DO_BOND_SETUP" ] ; then
49             : # We need to really setup bond (recursive call)
50         else
51             netif="$vlanname"
52         fi
53     fi
54 fi
55
56 # disable manual ifup while netroot is set for simplifying our logic
57 # in netroot case we prefer netroot to bringup $netif automaticlly
58 [ -n "$2" -a "$2" = "-m" ] && [ -z "$netroot" ] && manualup="$2"
59 [ -z "$netroot" ] && [ -z "$manualup" ] && exit 0
60 [ -n "$manualup" ] && >/tmp/net.$netif.manualup
61
62 # Run dhclient
63 do_dhcp() {
64     # dhclient-script will mark the netif up and generate the online
65     # event for nfsroot
66     # XXX add -V vendor class and option parsing per kernel
67     echo "Starting dhcp for interface $netif"
68     dhclient "$@" -1 -q -cf /etc/dhclient.conf -pf /tmp/dhclient.$netif.pid -lf /tmp/dhclient.$netif.lease $netif \
69         || echo "dhcp failed"
70 }
71
72 load_ipv6() {
73     modprobe ipv6
74     i=0
75     while [ ! -d /proc/sys/net/ipv6 ]; do
76         i=$(($i+1))
77         [ $i -gt 10 ] && break
78         sleep 0.1
79     done
80 }
81
82 do_ipv6auto() {
83     load_ipv6
84     echo 0 > /proc/sys/net/ipv6/conf/$netif/forwarding
85     echo 1 > /proc/sys/net/ipv6/conf/$netif/accept_ra
86     echo 1 > /proc/sys/net/ipv6/conf/$netif/accept_redirects
87     ip link set $netif up
88     wait_for_if_up $netif
89
90     [ -n "$hostname" ] && echo "echo $hostname > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname
91
92     return 0
93 }
94
95 # Handle static ip configuration
96 do_static() {
97     strstr $ip '*:*:*' && load_ipv6
98
99     ip link set $netif up
100     wait_for_if_up $netif
101     [ -n "$macaddr" ] && ip link set address $macaddr
102     [ -n "$mtu" ] && ip link set mtu $mtu
103     if strstr $ip '*:*:*'; then
104         # note no ip addr flush for ipv6
105         ip addr add $ip/$mask dev $netif
106     else
107         ip addr flush dev $netif
108         ip addr add $ip/$mask brd + dev $netif
109     fi
110
111     [ -n "$gw" ] && echo ip route add default via $gw dev $netif > /tmp/net.$netif.gw
112     [ -n "$hostname" ] && echo "echo $hostname > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname
113
114     return 0
115 }
116
117 # loopback is always handled the same way
118 if [ "$netif" = "lo" ] ; then
119     ip link set lo up
120     ip addr add 127.0.0.1/8 dev lo
121     exit 0
122 fi
123
124 # start bond if needed
125 if [ -e /tmp/bond.info ]; then
126     . /tmp/bond.info
127
128     if [ "$netif" = "$bondname" ] && [ ! -e /tmp/net.$bondname.up ] ; then # We are master bond device
129         modprobe bonding
130         ip link set $netif down
131
132         # Stolen from ifup-eth
133         # add the bits to setup driver parameters here
134         for arg in $bondoptions ; do
135             key=${arg%%=*};
136             value=${arg##*=};
137             # %{value:0:1} is replaced with non-bash specific construct
138             if [ "${key}" = "arp_ip_target" -a "${#value}" != "0" -a "+${value%%+*}" != "+" ]; then
139                 OLDIFS=$IFS;
140                 IFS=',';
141                 for arp_ip in $value; do
142                     echo +$arp_ip > /sys/class/net/${netif}/bonding/$key
143                 done
144                 IFS=$OLDIFS;
145             else
146                 echo $value > /sys/class/net/${netif}/bonding/$key
147             fi
148         done
149
150         ip link set $netif up
151
152         for slave in $bondslaves ; do
153             ip link set $slave down
154             echo "+$slave" > /sys/class/net/$bondname/bonding/slaves
155             ip link set $slave up
156             wait_for_if_up $slave
157         done
158
159         # add the bits to setup the needed post enslavement parameters
160         for arg in $BONDING_OPTS ; do
161             key=${arg%%=*};
162             value=${arg##*=};
163             if [ "${key}" = "primary" ]; then
164                 echo $value > /sys/class/net/${netif}/bonding/$key
165             fi
166         done
167     fi
168 fi
169
170
171 # XXX need error handling like dhclient-script
172
173 if [ -e /tmp/bridge.info ]; then
174     . /tmp/bridge.info
175 # start bridge if necessary
176     if [ "$netif" = "$bridgename" ] && [ ! -e /tmp/net.$bridgename.up ]; then
177         brctl addbr $bridgename
178         brctl setfd $bridgename 0
179         for ethname in $ethnames ; do
180             if [ "$ethname" = "$bondname" ] ; then
181                 DO_BOND_SETUP=yes ifup $bondname -m
182             else
183                 ip link set $ethname up
184             fi
185             wait_for_if_up $ethname
186             brctl addif $bridgename $ethname
187         done
188     fi
189 fi
190
191 get_vid() {
192     case "$1" in
193     vlan*)
194         return ${1#vlan}
195         ;;
196     *.*)
197         return ${1##*.}
198         ;;
199     esac
200 }
201
202 if [ "$netif" = "$vlanname" ] && [ ! -e /tmp/net.$vlanname.up ]; then
203     modprobe 8021q
204     if [ "$phydevice" = "$bondname" ] ; then
205         DO_BOND_SETUP=yes ifup $phydevice -m
206     else
207         ip link set "$phydevice" up
208     fi
209     wait_for_if_up "$phydevice"
210     ip link add dev "$vlanname" link "$phydevice" type vlan id "$(get_vid $vlanname; echo $?)"
211 fi
212
213 # setup nameserver
214 namesrv=$(getargs nameserver)
215 if  [ -n "$namesrv" ] ; then
216     for s in $namesrv; do
217         echo nameserver $s
218     done
219 fi >> /tmp/net.$netif.resolv.conf
220
221 # No ip lines default to dhcp
222 ip=$(getarg ip)
223
224 if [ -z "$ip" ]; then
225     if [ "$netroot" = "dhcp6" ]; then
226         do_dhcp -6
227     else
228         do_dhcp -4
229     fi
230 fi
231
232 # Specific configuration, spin through the kernel command line
233 # looking for ip= lines
234 for p in $(getargs ip=); do
235     ip_to_var $p
236     # skip ibft
237     [ "$autoconf" = "ibft" ] && continue
238
239     # If this option isn't directed at our interface, skip it
240     [ -n "$dev" ] && [ "$dev" != "$netif" ] && continue
241
242     # Store config for later use
243     for i in ip srv gw mask hostname macaddr; do
244         eval '[ "$'$i'" ] && echo '$i'="$'$i'"'
245     done > /tmp/net.$netif.override
246
247     case $autoconf in
248         dhcp|on|any)
249             do_dhcp -4 ;;
250         dhcp6)
251             do_dhcp -6 ;;
252         auto6)
253             do_ipv6auto ;;
254         *)
255             do_static ;;
256     esac
257
258     case $autoconf in
259         dhcp|on|any|dhcp6)
260             ;;
261         *)
262             if [ $? -eq 0 ]; then
263                 setup_net $netif
264                 source_hook initqueue/online $netif
265                 if [ -z "$manualup" ]; then
266                     /sbin/netroot $netif
267                 fi
268             fi
269             ;;
270     esac
271
272     break
273 done
274 exit 0