]>
Commit | Line | Data |
---|---|---|
3b403b32 | 1 | #!/bin/sh |
7e9919b9 | 2 | |
a9d30a40 HH |
3 | PATH=/usr/sbin:/usr/bin:/sbin:/bin |
4 | ||
5 | type getarg >/dev/null 2>&1 || . /lib/dracut-lib.sh | |
6 | type ip_to_var >/dev/null 2>&1 || . /lib/net-lib.sh | |
7 | ||
8 | # We already need a set netif here | |
9 | netif=$interface | |
10 | ||
7e9919b9 | 11 | setup_interface() { |
580bb541 PS |
12 | ip=$new_ip_address |
13 | mtu=$new_interface_mtu | |
14 | mask=$new_subnet_mask | |
15 | bcast=$new_broadcast_address | |
16 | gw=${new_routers%%,*} | |
17 | domain=$new_domain_name | |
b093aa2d | 18 | search=$(printf -- "$new_domain_search") |
580bb541 PS |
19 | namesrv=$new_domain_name_servers |
20 | hostname=$new_host_name | |
8d09f493 HH |
21 | [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time |
22 | [ -n "$new_max_life" ] && lease_time=$new_max_life | |
23 | preferred_lft=$lease_time | |
24 | [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life | |
580bb541 PS |
25 | |
26 | [ -f /tmp/net.$netif.override ] && . /tmp/net.$netif.override | |
27 | ||
d1dd6bb7 PS |
28 | # Taken from debian dhclient-script: |
29 | # The 576 MTU is only used for X.25 and dialup connections | |
30 | # where the admin wants low latency. Such a low MTU can cause | |
31 | # problems with UDP traffic, among other things. As such, | |
32 | # disallow MTUs from 576 and below by default, so that broken | |
33 | # MTUs are ignored, but higher stuff is allowed (1492, 1500, etc). | |
34 | if [ -n "$mtu" ] && [ $mtu -gt 576 ] ; then | |
c6c704fd HH |
35 | if ! ip link set $netif mtu $mtu ; then |
36 | ip link set $netif down | |
37 | ip link set $netif mtu $mtu | |
6cb77ea9 | 38 | linkup $netif |
c6c704fd HH |
39 | fi |
40 | fi | |
7e9919b9 | 41 | |
0f89ec31 HH |
42 | ip addr add $ip${mask:+/$mask} ${bcast:+broadcast $bcast} dev $netif \ |
43 | ${lease_time:+valid_lft $lease_time} \ | |
44 | ${preferred_lft:+preferred_lft ${preferred_lft}} | |
db815843 | 45 | |
99ccbc30 | 46 | if [ -n "$gw" ] ; then |
78362bc5 | 47 | if [ "$mask" = "255.255.255.255" ] ; then |
99ccbc30 GE |
48 | # point-to-point connection => set explicit route to gateway |
49 | echo ip route add $gw dev $netif > /tmp/net.$netif.gw | |
50 | fi | |
727e2a1d DS |
51 | |
52 | echo "$gw" | { | |
53 | IFS=' ' read -r main_gw other_gw | |
54 | echo ip route replace default via $main_gw dev $netif >> /tmp/net.$netif.gw | |
55 | if [ -n "$other_gw" ] ; then | |
56 | for g in $other_gw; do | |
57 | echo ip route add default via $g dev $netif >> /tmp/net.$netif.gw | |
58 | done | |
59 | fi | |
60 | } | |
99ccbc30 | 61 | fi |
db815843 | 62 | |
df0bdd5a HH |
63 | if getargbool 1 rd.peerdns; then |
64 | [ -n "${search}${domain}" ] && echo "search $search $domain" > /tmp/net.$netif.resolv.conf | |
65 | if [ -n "$namesrv" ] ; then | |
66 | for s in $namesrv; do | |
67 | echo nameserver $s | |
68 | done | |
69 | fi >> /tmp/net.$netif.resolv.conf | |
70 | fi | |
da55af47 ID |
71 | # Note: hostname can be fqdn OR short hostname, so chop off any |
72 | # trailing domain name and explicity add any domain if set. | |
ffc68f35 | 73 | [ -n "$hostname" ] && echo "echo ${hostname%.$domain}${domain:+.$domain} > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname |
7e9919b9 DD |
74 | } |
75 | ||
2ac599dc HH |
76 | setup_interface6() { |
77 | domain=$new_domain_name | |
78 | search=$(printf -- "$new_domain_search") | |
79 | namesrv=$new_domain_name_servers | |
80 | hostname=$new_host_name | |
ebe74116 HH |
81 | [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time |
82 | [ -n "$new_max_life" ] && lease_time=$new_max_life | |
83 | preferred_lft=$lease_time | |
84 | [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life | |
2ac599dc HH |
85 | |
86 | [ -f /tmp/net.$netif.override ] && . /tmp/net.$netif.override | |
87 | ||
88 | ip -6 addr add ${new_ip6_address}/${new_ip6_prefixlen} \ | |
ebe74116 HH |
89 | dev ${netif} scope global \ |
90 | ${lease_time:+valid_lft $lease_time} \ | |
91 | ${preferred_lft:+preferred_lft ${preferred_lft}} | |
2ac599dc | 92 | |
df0bdd5a HH |
93 | if getargbool 1 rd.peerdns; then |
94 | [ -n "${search}${domain}" ] && echo "search $search $domain" > /tmp/net.$netif.resolv.conf | |
95 | if [ -n "$namesrv" ] ; then | |
96 | for s in $namesrv; do | |
97 | echo nameserver $s | |
98 | done | |
99 | fi >> /tmp/net.$netif.resolv.conf | |
100 | fi | |
2ac599dc HH |
101 | |
102 | # Note: hostname can be fqdn OR short hostname, so chop off any | |
103 | # trailing domain name and explicity add any domain if set. | |
104 | [ -n "$hostname" ] && echo "echo ${hostname%.$domain}${domain:+.$domain} > /proc/sys/kernel/hostname" > /tmp/net.$netif.hostname | |
105 | } | |
106 | ||
bcabe0fe | 107 | parse_option_121() { |
caf12d67 HH |
108 | while [ $# -ne 0 ]; do |
109 | mask="$1" | |
110 | shift | |
111 | ||
112 | # Is the destination a multicast group? | |
113 | if [ $1 -ge 224 -a $1 -lt 240 ]; then | |
114 | multicast=1 | |
115 | else | |
116 | multicast=0 | |
117 | fi | |
118 | ||
119 | # Parse the arguments into a CIDR net/mask string | |
120 | if [ $mask -gt 24 ]; then | |
121 | destination="$1.$2.$3.$4/$mask" | |
122 | shift; shift; shift; shift | |
123 | elif [ $mask -gt 16 ]; then | |
124 | destination="$1.$2.$3.0/$mask" | |
125 | shift; shift; shift | |
126 | elif [ $mask -gt 8 ]; then | |
127 | destination="$1.$2.0.0/$mask" | |
128 | shift; shift | |
11e1f680 | 129 | elif [ $mask -gt 0 ]; then |
caf12d67 HH |
130 | destination="$1.0.0.0/$mask" |
131 | shift | |
11e1f680 FD |
132 | else |
133 | destination="0.0.0.0/$mask" | |
caf12d67 HH |
134 | fi |
135 | ||
136 | # Read the gateway | |
137 | gateway="$1.$2.$3.$4" | |
138 | shift; shift; shift; shift | |
139 | ||
140 | # Multicast routing on Linux | |
141 | # - If you set a next-hop address for a multicast group, this breaks with Cisco switches | |
142 | # - If you simply leave it link-local and attach it to an interface, it works fine. | |
11e1f680 | 143 | if [ $multicast -eq 1 -o "$gateway" = "0.0.0.0" ]; then |
caf12d67 HH |
144 | temp_result="$destination dev $interface" |
145 | else | |
146 | temp_result="$destination via $gateway dev $interface" | |
147 | fi | |
148 | ||
d5e818f3 | 149 | echo "/sbin/ip route replace $temp_result" |
caf12d67 HH |
150 | done |
151 | } | |
152 | ||
153 | ||
7e9919b9 DD |
154 | case $reason in |
155 | PREINIT) | |
cc02093d | 156 | echo "dhcp: PREINIT $netif up" |
6cb77ea9 | 157 | linkup $netif |
cc02093d | 158 | ;; |
2ac599dc | 159 | |
a9d30a40 | 160 | PREINIT6) |
7c5ec0f5 | 161 | echo "dhcp: PREINIT6 $netif up" |
a9d30a40 | 162 | linkup $netif |
811a070d | 163 | wait_for_ipv6_dad_link $netif |
a9d30a40 HH |
164 | ;; |
165 | ||
7e9919b9 | 166 | BOUND) |
cc02093d | 167 | echo "dhcp: BOND setting $netif" |
8b88dc7f HH |
168 | unset layer2 |
169 | if [ -f /sys/class/net/$netif/device/layer2 ]; then | |
170 | read layer2 < /sys/class/net/$netif/device/layer2 | |
cc02093d | 171 | fi |
8b88dc7f | 172 | if [ "$layer2" != "0" ]; then |
9853791d | 173 | if command -v arping2 >/dev/null; then |
00ca15ab | 174 | if arping2 -q -C 1 -c 2 -I $netif -0 $new_ip_address ; then |
9853791d HH |
175 | warn "Duplicate address detected for $new_ip_address while doing dhcp. retrying" |
176 | exit 1 | |
177 | fi | |
178 | else | |
179 | if ! arping -f -q -D -c 2 -I $netif $new_ip_address ; then | |
180 | warn "Duplicate address detected for $new_ip_address while doing dhcp. retrying" | |
181 | exit 1 | |
182 | fi | |
8b88dc7f HH |
183 | fi |
184 | fi | |
185 | unset layer2 | |
3b403b32 | 186 | setup_interface |
6d58fa27 | 187 | set | while read line || [ -n "$line" ]; do |
cc02093d | 188 | [ "${line#new_}" = "$line" ] && continue |
3b403b32 | 189 | echo "$line" |
cc02093d | 190 | done >/tmp/dhclient.$netif.dhcpopts |
957bc5c9 | 191 | |
c6c704fd HH |
192 | { |
193 | echo '. /lib/net-lib.sh' | |
194 | echo "setup_net $netif" | |
caf12d67 | 195 | if [ -n "$new_classless_static_routes" ]; then |
337a55eb LN |
196 | OLDIFS="$IFS" |
197 | IFS=".$IFS" | |
cf9a4e0c | 198 | parse_option_121 $new_classless_static_routes |
337a55eb | 199 | IFS="$OLDIFS" |
caf12d67 | 200 | fi |
c6c704fd HH |
201 | echo "source_hook initqueue/online $netif" |
202 | [ -e /tmp/net.$netif.manualup ] || echo "/sbin/netroot $netif" | |
32bd2fbb | 203 | echo "rm -f -- $hookdir/initqueue/setup_net_$netif.sh" |
c6c704fd HH |
204 | } > $hookdir/initqueue/setup_net_$netif.sh |
205 | ||
43a85a73 | 206 | echo "[ -f /tmp/net.$netif.did-setup ]" > $hookdir/initqueue/finished/dhclient-$netif.sh |
2ac599dc | 207 | >/tmp/net.$netif.up |
26fbe97b HH |
208 | if [ -e /sys/class/net/${netif}/address ]; then |
209 | > /tmp/net.$(cat /sys/class/net/${netif}/address).up | |
210 | fi | |
211 | ||
2ac599dc HH |
212 | ;; |
213 | ||
cf627b20 HH |
214 | RENEW|REBIND) |
215 | unset lease_time | |
216 | [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time | |
217 | [ -n "$new_max_life" ] && lease_time=$new_max_life | |
218 | preferred_lft=$lease_time | |
219 | [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life | |
e847a78b | 220 | ip -4 addr change ${new_ip_address}/${new_subnet_mask} broadcast ${new_broadcast_address} dev ${interface} \ |
cf627b20 HH |
221 | ${lease_time:+valid_lft $lease_time} ${preferred_lft:+preferred_lft ${preferred_lft}} \ |
222 | >/dev/null 2>&1 | |
223 | ;; | |
224 | ||
2ac599dc HH |
225 | BOUND6) |
226 | echo "dhcp: BOND6 setting $netif" | |
227 | setup_interface6 | |
228 | ||
6d58fa27 | 229 | set | while read line || [ -n "$line" ]; do |
2ac599dc HH |
230 | [ "${line#new_}" = "$line" ] && continue |
231 | echo "$line" | |
232 | done >/tmp/dhclient.$netif.dhcpopts | |
233 | ||
234 | { | |
235 | echo '. /lib/net-lib.sh' | |
236 | echo "setup_net $netif" | |
237 | echo "source_hook initqueue/online $netif" | |
238 | [ -e /tmp/net.$netif.manualup ] || echo "/sbin/netroot $netif" | |
2ac599dc HH |
239 | echo "rm -f -- $hookdir/initqueue/setup_net_$netif.sh" |
240 | } > $hookdir/initqueue/setup_net_$netif.sh | |
241 | ||
43a85a73 | 242 | echo "[ -f /tmp/net.$netif.did-setup ]" > $hookdir/initqueue/finished/dhclient-$netif.sh |
c6c704fd | 243 | >/tmp/net.$netif.up |
26fbe97b HH |
244 | if [ -e /sys/class/net/${netif}/address ]; then |
245 | > /tmp/net.$(cat /sys/class/net/${netif}/address).up | |
246 | fi | |
cc02093d | 247 | ;; |
cf627b20 HH |
248 | |
249 | RENEW6|REBIND6) | |
250 | unset lease_time | |
251 | [ -n "$new_dhcp_lease_time" ] && lease_time=$new_dhcp_lease_time | |
252 | [ -n "$new_max_life" ] && lease_time=$new_max_life | |
253 | preferred_lft=$lease_time | |
254 | [ -n "$new_preferred_life" ] && preferred_lft=$new_preferred_life | |
255 | ip -6 addr change ${new_ip6_address}/${new_ip6_prefixlen} dev ${interface} scope global \ | |
256 | ${lease_time:+valid_lft $lease_time} ${preferred_lft:+preferred_lft ${preferred_lft}} \ | |
257 | >/dev/null 2>&1 | |
258 | ;; | |
259 | ||
9ab14265 | 260 | *) echo "dhcp: $reason";; |
0ac9584d | 261 | esac |
7e9919b9 | 262 | |
7e9919b9 | 263 | exit 0 |