xref: /aosp_15_r20/external/iproute2/examples/dhcp-client-script (revision de1e4e894b0c224df933550f0afdecc354b238c4)
1*de1e4e89SAndroid Build Coastguard Worker#!/bin/bash
2*de1e4e89SAndroid Build Coastguard Worker#
3*de1e4e89SAndroid Build Coastguard Worker# dhclient-script for Linux.
4*de1e4e89SAndroid Build Coastguard Worker#
5*de1e4e89SAndroid Build Coastguard Worker#		This program is free software; you can redistribute it and/or
6*de1e4e89SAndroid Build Coastguard Worker#		modify it under the terms of the GNU General Public License
7*de1e4e89SAndroid Build Coastguard Worker#		as published by the Free Software Foundation; either version
8*de1e4e89SAndroid Build Coastguard Worker#		2 of the License, or (at your option) any later version.
9*de1e4e89SAndroid Build Coastguard Worker#
10*de1e4e89SAndroid Build Coastguard Worker# Authors:	Alexey Kuznetsov, <[email protected]>
11*de1e4e89SAndroid Build Coastguard Worker#
12*de1e4e89SAndroid Build Coastguard Worker# Probably, I did not understand, what this funny feature as "alias"
13*de1e4e89SAndroid Build Coastguard Worker# means exactly. For now I suppose, that it is a static address, which
14*de1e4e89SAndroid Build Coastguard Worker# we should install and preserve.
15*de1e4e89SAndroid Build Coastguard Worker#
16*de1e4e89SAndroid Build Coastguard Worker
17*de1e4e89SAndroid Build Coastguard Workerexec >> /var/log/DHS.log 2>&1
18*de1e4e89SAndroid Build Coastguard Worker
19*de1e4e89SAndroid Build Coastguard Workerecho dhc-script $* reason=$reason
20*de1e4e89SAndroid Build Coastguard Workerset | grep "^\(old_\|new_\|check_\)"
21*de1e4e89SAndroid Build Coastguard Worker
22*de1e4e89SAndroid Build Coastguard WorkerLOG () {
23*de1e4e89SAndroid Build Coastguard Worker    echo LOG $* ;
24*de1e4e89SAndroid Build Coastguard Worker}
25*de1e4e89SAndroid Build Coastguard Worker
26*de1e4e89SAndroid Build Coastguard Worker# convert 8bit mask to length
27*de1e4e89SAndroid Build Coastguard Worker# arg: $1 = mask
28*de1e4e89SAndroid Build Coastguard Worker#
29*de1e4e89SAndroid Build Coastguard WorkerMask8ToLen() {
30*de1e4e89SAndroid Build Coastguard Worker	local l=0;
31*de1e4e89SAndroid Build Coastguard Worker
32*de1e4e89SAndroid Build Coastguard Worker	while [ $l -le 7 ]; do
33*de1e4e89SAndroid Build Coastguard Worker		if [ $[ ( 1 << $l ) + $1 ] -eq 256 ]; then
34*de1e4e89SAndroid Build Coastguard Worker			return	$[ 8 - $l ]
35*de1e4e89SAndroid Build Coastguard Worker		fi
36*de1e4e89SAndroid Build Coastguard Worker		l=$[ $l + 1 ]
37*de1e4e89SAndroid Build Coastguard Worker	done
38*de1e4e89SAndroid Build Coastguard Worker	return 0;
39*de1e4e89SAndroid Build Coastguard Worker}
40*de1e4e89SAndroid Build Coastguard Worker
41*de1e4e89SAndroid Build Coastguard Worker# convert inet dotted quad mask to length
42*de1e4e89SAndroid Build Coastguard Worker# arg: $1 = dotquad mask
43*de1e4e89SAndroid Build Coastguard Worker#
44*de1e4e89SAndroid Build Coastguard WorkerMaskToLen() {
45*de1e4e89SAndroid Build Coastguard Worker local masklen=0
46*de1e4e89SAndroid Build Coastguard Worker local mask8=$1
47*de1e4e89SAndroid Build Coastguard Worker
48*de1e4e89SAndroid Build Coastguard Worker case $1 in
49*de1e4e89SAndroid Build Coastguard Worker 0.0.0.0)
50*de1e4e89SAndroid Build Coastguard Worker	return 0;
51*de1e4e89SAndroid Build Coastguard Worker	;;
52*de1e4e89SAndroid Build Coastguard Worker 255.*.0.0)
53*de1e4e89SAndroid Build Coastguard Worker	masklen=8
54*de1e4e89SAndroid Build Coastguard Worker	mask8=${mask8#255.}
55*de1e4e89SAndroid Build Coastguard Worker	mask8=${mask8%.0.0}
56*de1e4e89SAndroid Build Coastguard Worker	;;
57*de1e4e89SAndroid Build Coastguard Worker 255.255.*.0)
58*de1e4e89SAndroid Build Coastguard Worker	masklen=16
59*de1e4e89SAndroid Build Coastguard Worker	mask8=${mask8#255.255.}
60*de1e4e89SAndroid Build Coastguard Worker	mask8=${mask8%.0}
61*de1e4e89SAndroid Build Coastguard Worker	;;
62*de1e4e89SAndroid Build Coastguard Worker 255.255.255.*)
63*de1e4e89SAndroid Build Coastguard Worker	masklen=24
64*de1e4e89SAndroid Build Coastguard Worker	mask8=${mask8#255.255.255.}
65*de1e4e89SAndroid Build Coastguard Worker	;;
66*de1e4e89SAndroid Build Coastguard Worker *)
67*de1e4e89SAndroid Build Coastguard Worker	return 255
68*de1e4e89SAndroid Build Coastguard Worker	;;
69*de1e4e89SAndroid Build Coastguard Worker esac
70*de1e4e89SAndroid Build Coastguard Worker Mask8ToLen $mask8
71*de1e4e89SAndroid Build Coastguard Worker return $[ $? + $masklen ]
72*de1e4e89SAndroid Build Coastguard Worker}
73*de1e4e89SAndroid Build Coastguard Worker
74*de1e4e89SAndroid Build Coastguard Worker# calculate ABC "natural" mask
75*de1e4e89SAndroid Build Coastguard Worker# arg: $1 = dotquad address
76*de1e4e89SAndroid Build Coastguard Worker#
77*de1e4e89SAndroid Build Coastguard WorkerABCMask () {
78*de1e4e89SAndroid Build Coastguard Worker local class;
79*de1e4e89SAndroid Build Coastguard Worker
80*de1e4e89SAndroid Build Coastguard Worker class=${1%%.*}
81*de1e4e89SAndroid Build Coastguard Worker
82*de1e4e89SAndroid Build Coastguard Worker if [ "$1" = "255.255.255.255" ]; then
83*de1e4e89SAndroid Build Coastguard Worker    echo $1
84*de1e4e89SAndroid Build Coastguard Worker elif [ "$1" = "0.0.0.0" ]; then
85*de1e4e89SAndroid Build Coastguard Worker    echo $1
86*de1e4e89SAndroid Build Coastguard Worker elif [ $class -ge 224 ]; then
87*de1e4e89SAndroid Build Coastguard Worker    echo 240.0.0.0
88*de1e4e89SAndroid Build Coastguard Worker elif [ $class -ge 192 ]; then
89*de1e4e89SAndroid Build Coastguard Worker    echo 255.255.255.0
90*de1e4e89SAndroid Build Coastguard Worker elif [ $class -ge 128 ]; then
91*de1e4e89SAndroid Build Coastguard Worker    echo 255.255.0.0
92*de1e4e89SAndroid Build Coastguard Worker else
93*de1e4e89SAndroid Build Coastguard Worker    echo 255.0.0.0
94*de1e4e89SAndroid Build Coastguard Worker fi
95*de1e4e89SAndroid Build Coastguard Worker}
96*de1e4e89SAndroid Build Coastguard Worker
97*de1e4e89SAndroid Build Coastguard Worker# calculate ABC "natural" mask length
98*de1e4e89SAndroid Build Coastguard Worker# arg: $1 = dotquad address
99*de1e4e89SAndroid Build Coastguard Worker#
100*de1e4e89SAndroid Build Coastguard WorkerABCMaskLen () {
101*de1e4e89SAndroid Build Coastguard Worker local class;
102*de1e4e89SAndroid Build Coastguard Worker
103*de1e4e89SAndroid Build Coastguard Worker class=${1%%.*}
104*de1e4e89SAndroid Build Coastguard Worker
105*de1e4e89SAndroid Build Coastguard Worker if [ "$1" = "255.255.255.255" ]; then
106*de1e4e89SAndroid Build Coastguard Worker    return 32
107*de1e4e89SAndroid Build Coastguard Worker elif [ "$1" = "0.0.0.0" ]; then
108*de1e4e89SAndroid Build Coastguard Worker    return 0
109*de1e4e89SAndroid Build Coastguard Worker elif [ $class -ge 224 ]; then
110*de1e4e89SAndroid Build Coastguard Worker    return 4;
111*de1e4e89SAndroid Build Coastguard Worker elif [ $class -ge 192 ]; then
112*de1e4e89SAndroid Build Coastguard Worker    return 24;
113*de1e4e89SAndroid Build Coastguard Worker elif [ $class -ge 128 ]; then
114*de1e4e89SAndroid Build Coastguard Worker    return 16;
115*de1e4e89SAndroid Build Coastguard Worker else
116*de1e4e89SAndroid Build Coastguard Worker    return 8;
117*de1e4e89SAndroid Build Coastguard Worker fi
118*de1e4e89SAndroid Build Coastguard Worker}
119*de1e4e89SAndroid Build Coastguard Worker
120*de1e4e89SAndroid Build Coastguard Worker# Delete IP address
121*de1e4e89SAndroid Build Coastguard Worker# args: $1 = interface
122*de1e4e89SAndroid Build Coastguard Worker#       $2 = address
123*de1e4e89SAndroid Build Coastguard Worker#       $3 = mask
124*de1e4e89SAndroid Build Coastguard Worker#       $4 = broadcast
125*de1e4e89SAndroid Build Coastguard Worker#       $5 = label
126*de1e4e89SAndroid Build Coastguard Worker#
127*de1e4e89SAndroid Build Coastguard WorkerDelINETAddr () {
128*de1e4e89SAndroid Build Coastguard Worker  local masklen=32
129*de1e4e89SAndroid Build Coastguard Worker  local addrid=$1
130*de1e4e89SAndroid Build Coastguard Worker
131*de1e4e89SAndroid Build Coastguard Worker  LOG DelINETAddr $*
132*de1e4e89SAndroid Build Coastguard Worker
133*de1e4e89SAndroid Build Coastguard Worker  if [ "$5" ]; then
134*de1e4e89SAndroid Build Coastguard Worker    addrid=$addrid:$5
135*de1e4e89SAndroid Build Coastguard Worker  fi
136*de1e4e89SAndroid Build Coastguard Worker  LOG ifconfig $addrid down
137*de1e4e89SAndroid Build Coastguard Worker  ifconfig $addrid down
138*de1e4e89SAndroid Build Coastguard Worker}
139*de1e4e89SAndroid Build Coastguard Worker
140*de1e4e89SAndroid Build Coastguard Worker# Add IP address
141*de1e4e89SAndroid Build Coastguard Worker# args: $1 = interface
142*de1e4e89SAndroid Build Coastguard Worker#       $2 = address
143*de1e4e89SAndroid Build Coastguard Worker#       $3 = mask
144*de1e4e89SAndroid Build Coastguard Worker#       $4 = broadcast
145*de1e4e89SAndroid Build Coastguard Worker#       $5 = label
146*de1e4e89SAndroid Build Coastguard Worker#
147*de1e4e89SAndroid Build Coastguard WorkerAddINETAddr () {
148*de1e4e89SAndroid Build Coastguard Worker  local mask_arg
149*de1e4e89SAndroid Build Coastguard Worker  local brd_arg
150*de1e4e89SAndroid Build Coastguard Worker  local addrid=$1
151*de1e4e89SAndroid Build Coastguard Worker
152*de1e4e89SAndroid Build Coastguard Worker  LOG AddINETAddr $*
153*de1e4e89SAndroid Build Coastguard Worker
154*de1e4e89SAndroid Build Coastguard Worker  if [ "$5" ]; then
155*de1e4e89SAndroid Build Coastguard Worker    addrid=$addrid:$5
156*de1e4e89SAndroid Build Coastguard Worker  fi
157*de1e4e89SAndroid Build Coastguard Worker  if [ "$3" ]; then
158*de1e4e89SAndroid Build Coastguard Worker    mask_arg="netmask $3"
159*de1e4e89SAndroid Build Coastguard Worker  fi
160*de1e4e89SAndroid Build Coastguard Worker  if [ "$4" ]; then
161*de1e4e89SAndroid Build Coastguard Worker    brd_arg="broadcast $4"
162*de1e4e89SAndroid Build Coastguard Worker  fi
163*de1e4e89SAndroid Build Coastguard Worker
164*de1e4e89SAndroid Build Coastguard Worker  LOG ifconfig $addrid $2 $mask_arg $brd_arg up
165*de1e4e89SAndroid Build Coastguard Worker  ifconfig $addrid $2 $mask_arg $brd_arg up
166*de1e4e89SAndroid Build Coastguard Worker}
167*de1e4e89SAndroid Build Coastguard Worker
168*de1e4e89SAndroid Build Coastguard Worker# Add default routes
169*de1e4e89SAndroid Build Coastguard Worker# args: $1 = routers list
170*de1e4e89SAndroid Build Coastguard Worker#
171*de1e4e89SAndroid Build Coastguard WorkerAddDefaultRoutes() {
172*de1e4e89SAndroid Build Coastguard Worker    local router
173*de1e4e89SAndroid Build Coastguard Worker
174*de1e4e89SAndroid Build Coastguard Worker    if [ "$1" ]; then
175*de1e4e89SAndroid Build Coastguard Worker      LOG AddDefaultRoutes $*
176*de1e4e89SAndroid Build Coastguard Worker      for router in $1; do
177*de1e4e89SAndroid Build Coastguard Worker        LOG route add default gw $router
178*de1e4e89SAndroid Build Coastguard Worker        route add default gw $router
179*de1e4e89SAndroid Build Coastguard Worker      done ;
180*de1e4e89SAndroid Build Coastguard Worker    fi
181*de1e4e89SAndroid Build Coastguard Worker}
182*de1e4e89SAndroid Build Coastguard Worker
183*de1e4e89SAndroid Build Coastguard Worker# Delete default routes
184*de1e4e89SAndroid Build Coastguard Worker# args: $1 = routers list
185*de1e4e89SAndroid Build Coastguard Worker#
186*de1e4e89SAndroid Build Coastguard WorkerDelDefaultRoutes() {
187*de1e4e89SAndroid Build Coastguard Worker    local router
188*de1e4e89SAndroid Build Coastguard Worker
189*de1e4e89SAndroid Build Coastguard Worker    if [ "$1" ]; then
190*de1e4e89SAndroid Build Coastguard Worker      LOG DelDefaultRoutes $*
191*de1e4e89SAndroid Build Coastguard Worker
192*de1e4e89SAndroid Build Coastguard Worker      for router in $1; do
193*de1e4e89SAndroid Build Coastguard Worker        LOG route del default gw $router
194*de1e4e89SAndroid Build Coastguard Worker        route del default gw $router
195*de1e4e89SAndroid Build Coastguard Worker      done
196*de1e4e89SAndroid Build Coastguard Worker    fi
197*de1e4e89SAndroid Build Coastguard Worker}
198*de1e4e89SAndroid Build Coastguard Worker
199*de1e4e89SAndroid Build Coastguard Worker# ping a host
200*de1e4e89SAndroid Build Coastguard Worker# args: $1 = dotquad address of the host
201*de1e4e89SAndroid Build Coastguard Worker#
202*de1e4e89SAndroid Build Coastguard WorkerPingNode() {
203*de1e4e89SAndroid Build Coastguard Worker    LOG PingNode $*
204*de1e4e89SAndroid Build Coastguard Worker    if ping -q -c 1 -w 2 $1 ; then
205*de1e4e89SAndroid Build Coastguard Worker	return 0;
206*de1e4e89SAndroid Build Coastguard Worker    fi
207*de1e4e89SAndroid Build Coastguard Worker    return 1;
208*de1e4e89SAndroid Build Coastguard Worker}
209*de1e4e89SAndroid Build Coastguard Worker
210*de1e4e89SAndroid Build Coastguard Worker# Check (and add route, if alive) default routers
211*de1e4e89SAndroid Build Coastguard Worker# args: $1 = routers list
212*de1e4e89SAndroid Build Coastguard Worker# returns: 0 if at least one router is alive.
213*de1e4e89SAndroid Build Coastguard Worker#
214*de1e4e89SAndroid Build Coastguard WorkerCheckRouterList() {
215*de1e4e89SAndroid Build Coastguard Worker    local router
216*de1e4e89SAndroid Build Coastguard Worker    local succeed=1
217*de1e4e89SAndroid Build Coastguard Worker
218*de1e4e89SAndroid Build Coastguard Worker    LOG CheckRouterList $*
219*de1e4e89SAndroid Build Coastguard Worker
220*de1e4e89SAndroid Build Coastguard Worker    for router in $1; do
221*de1e4e89SAndroid Build Coastguard Worker      if PingNode $router ; then
222*de1e4e89SAndroid Build Coastguard Worker	succeed=0
223*de1e4e89SAndroid Build Coastguard Worker        route add default gw $router
224*de1e4e89SAndroid Build Coastguard Worker      fi
225*de1e4e89SAndroid Build Coastguard Worker    done
226*de1e4e89SAndroid Build Coastguard Worker    return $succeed
227*de1e4e89SAndroid Build Coastguard Worker}
228*de1e4e89SAndroid Build Coastguard Worker
229*de1e4e89SAndroid Build Coastguard Worker# Delete/create static routes.
230*de1e4e89SAndroid Build Coastguard Worker# args: $1 = operation (del/add)
231*de1e4e89SAndroid Build Coastguard Worker#       $2 = routes list in format "dst1 nexthop1 dst2 ..."
232*de1e4e89SAndroid Build Coastguard Worker#
233*de1e4e89SAndroid Build Coastguard Worker# BEWARE: this feature of DHCP is obsolete, because does not
234*de1e4e89SAndroid Build Coastguard Worker#         support subnetting.
235*de1e4e89SAndroid Build Coastguard Worker#
236*de1e4e89SAndroid Build Coastguard WorkerX-StaticRouteList() {
237*de1e4e89SAndroid Build Coastguard Worker    local op=$1
238*de1e4e89SAndroid Build Coastguard Worker    local lst="$2"
239*de1e4e89SAndroid Build Coastguard Worker    local masklen
240*de1e4e89SAndroid Build Coastguard Worker
241*de1e4e89SAndroid Build Coastguard Worker    LOG X-StaticRouteList $*
242*de1e4e89SAndroid Build Coastguard Worker
243*de1e4e89SAndroid Build Coastguard Worker    if [ "$lst" ]; then
244*de1e4e89SAndroid Build Coastguard Worker      set $lst
245*de1e4e89SAndroid Build Coastguard Worker      while [ $# -gt 1 ]; do
246*de1e4e89SAndroid Build Coastguard Worker	route $op -net $1 netmask `ABCMask "$1"` gw $2
247*de1e4e89SAndroid Build Coastguard Worker	shift; shift;
248*de1e4e89SAndroid Build Coastguard Worker      done
249*de1e4e89SAndroid Build Coastguard Worker   fi
250*de1e4e89SAndroid Build Coastguard Worker}
251*de1e4e89SAndroid Build Coastguard Worker
252*de1e4e89SAndroid Build Coastguard Worker# Create static routes.
253*de1e4e89SAndroid Build Coastguard Worker# arg: $1 = routes list in format "dst1 nexthop1 dst2 ..."
254*de1e4e89SAndroid Build Coastguard Worker#
255*de1e4e89SAndroid Build Coastguard WorkerAddStaticRouteList() {
256*de1e4e89SAndroid Build Coastguard Worker    LOG AddStaticRouteList $*
257*de1e4e89SAndroid Build Coastguard Worker    X-StaticRouteList add "$1"
258*de1e4e89SAndroid Build Coastguard Worker}
259*de1e4e89SAndroid Build Coastguard Worker
260*de1e4e89SAndroid Build Coastguard Worker# Delete static routes.
261*de1e4e89SAndroid Build Coastguard Worker# arg: $1 = routes list in format "dst1 nexthop1 dst2 ..."
262*de1e4e89SAndroid Build Coastguard Worker#
263*de1e4e89SAndroid Build Coastguard WorkerDelStaticRouteList() {
264*de1e4e89SAndroid Build Coastguard Worker    LOG DelStaticRouteList $*
265*de1e4e89SAndroid Build Coastguard Worker    X-StaticRouteList del "$1"
266*de1e4e89SAndroid Build Coastguard Worker}
267*de1e4e89SAndroid Build Coastguard Worker
268*de1e4e89SAndroid Build Coastguard Worker# Broadcast unsolicited ARP to update neighbours' caches.
269*de1e4e89SAndroid Build Coastguard Worker# args: $1 = interface
270*de1e4e89SAndroid Build Coastguard Worker#       $2 = address
271*de1e4e89SAndroid Build Coastguard Worker#
272*de1e4e89SAndroid Build Coastguard WorkerUnsolicitedARP() {
273*de1e4e89SAndroid Build Coastguard Worker    if [ -f /sbin/arping ]; then
274*de1e4e89SAndroid Build Coastguard Worker	/sbin/arping -A -c 1 -I "$1" "$2" &
275*de1e4e89SAndroid Build Coastguard Worker	(sleep 2 ; /sbin/arping -U -c 1 -I "$1" "$2" ) &
276*de1e4e89SAndroid Build Coastguard Worker    fi
277*de1e4e89SAndroid Build Coastguard Worker}
278*de1e4e89SAndroid Build Coastguard Worker
279*de1e4e89SAndroid Build Coastguard Worker# Duplicate address detection.
280*de1e4e89SAndroid Build Coastguard Worker# args: $1 = interface
281*de1e4e89SAndroid Build Coastguard Worker#       $2 = test address
282*de1e4e89SAndroid Build Coastguard Worker# returns: 0, if DAD succeeded.
283*de1e4e89SAndroid Build Coastguard WorkerDAD() {
284*de1e4e89SAndroid Build Coastguard Worker  if [ -f /sbin/arping ]; then
285*de1e4e89SAndroid Build Coastguard Worker	/sbin/arping -c 2 -w 3 -D -I "$1" "$2"
286*de1e4e89SAndroid Build Coastguard Worker	return $?
287*de1e4e89SAndroid Build Coastguard Worker  fi
288*de1e4e89SAndroid Build Coastguard Worker  return 0
289*de1e4e89SAndroid Build Coastguard Worker}
290*de1e4e89SAndroid Build Coastguard Worker
291*de1e4e89SAndroid Build Coastguard Worker
292*de1e4e89SAndroid Build Coastguard Worker# Setup resolver.
293*de1e4e89SAndroid Build Coastguard Worker# args: NO
294*de1e4e89SAndroid Build Coastguard Worker#       domain and nameserver list are passed in global variables.
295*de1e4e89SAndroid Build Coastguard Worker#
296*de1e4e89SAndroid Build Coastguard Worker# NOTE: we try to be careful and not to break user supplied resolv.conf.
297*de1e4e89SAndroid Build Coastguard Worker#       The script mangles it, only if it has dhcp magic signature.
298*de1e4e89SAndroid Build Coastguard Worker#
299*de1e4e89SAndroid Build Coastguard WorkerUpdateDNS() {
300*de1e4e89SAndroid Build Coastguard Worker    local nameserver
301*de1e4e89SAndroid Build Coastguard Worker    local idstring="#### Generated by DHCPCD"
302*de1e4e89SAndroid Build Coastguard Worker
303*de1e4e89SAndroid Build Coastguard Worker    LOG UpdateDNS $*
304*de1e4e89SAndroid Build Coastguard Worker
305*de1e4e89SAndroid Build Coastguard Worker    if [ "$new_domain_name" = "" -a "$new_domain_name_servers" = "" ]; then
306*de1e4e89SAndroid Build Coastguard Worker	return 0;
307*de1e4e89SAndroid Build Coastguard Worker    fi
308*de1e4e89SAndroid Build Coastguard Worker
309*de1e4e89SAndroid Build Coastguard Worker    echo $idstring > /etc/resolv.conf.dhcp
310*de1e4e89SAndroid Build Coastguard Worker    if [ "$new_domain_name" ]; then
311*de1e4e89SAndroid Build Coastguard Worker	echo search $new_domain_name >> /etc/resolv.conf.dhcp
312*de1e4e89SAndroid Build Coastguard Worker    fi
313*de1e4e89SAndroid Build Coastguard Worker    echo options ndots:1 >> /etc/resolv.conf.dhcp
314*de1e4e89SAndroid Build Coastguard Worker
315*de1e4e89SAndroid Build Coastguard Worker    if [ "$new_domain_name_servers" ]; then
316*de1e4e89SAndroid Build Coastguard Worker	for nameserver in $new_domain_name_servers; do
317*de1e4e89SAndroid Build Coastguard Worker	    echo nameserver $nameserver >> /etc/resolv.conf.dhcp
318*de1e4e89SAndroid Build Coastguard Worker	done
319*de1e4e89SAndroid Build Coastguard Worker    else
320*de1e4e89SAndroid Build Coastguard Worker	echo nameserver 127.0.0.1 >> /etc/resolv.conf.dhcp
321*de1e4e89SAndroid Build Coastguard Worker    fi
322*de1e4e89SAndroid Build Coastguard Worker
323*de1e4e89SAndroid Build Coastguard Worker    if [ -f /etc/resolv.conf ]; then
324*de1e4e89SAndroid Build Coastguard Worker	if [ "`head -1 /etc/resolv.conf`" != "$idstring" ]; then
325*de1e4e89SAndroid Build Coastguard Worker	    return 0
326*de1e4e89SAndroid Build Coastguard Worker	fi
327*de1e4e89SAndroid Build Coastguard Worker	if [ "$old_domain_name" = "$new_domain_name" -a
328*de1e4e89SAndroid Build Coastguard Worker	     "$new_domain_name_servers" = "$old_domain_name_servers" ]; then
329*de1e4e89SAndroid Build Coastguard Worker	     return 0
330*de1e4e89SAndroid Build Coastguard Worker	fi
331*de1e4e89SAndroid Build Coastguard Worker    fi
332*de1e4e89SAndroid Build Coastguard Worker    mv /etc/resolv.conf.dhcp /etc/resolv.conf
333*de1e4e89SAndroid Build Coastguard Worker}
334*de1e4e89SAndroid Build Coastguard Worker
335*de1e4e89SAndroid Build Coastguard Workercase $reason in
336*de1e4e89SAndroid Build Coastguard WorkerNBI)
337*de1e4e89SAndroid Build Coastguard Worker  exit 1
338*de1e4e89SAndroid Build Coastguard Worker  ;;
339*de1e4e89SAndroid Build Coastguard Worker
340*de1e4e89SAndroid Build Coastguard WorkerMEDIUM)
341*de1e4e89SAndroid Build Coastguard Worker  exit 0
342*de1e4e89SAndroid Build Coastguard Worker  ;;
343*de1e4e89SAndroid Build Coastguard Worker
344*de1e4e89SAndroid Build Coastguard WorkerPREINIT)
345*de1e4e89SAndroid Build Coastguard Worker  ifconfig $interface:dhcp down
346*de1e4e89SAndroid Build Coastguard Worker  ifconfig $interface:dhcp1 down
347*de1e4e89SAndroid Build Coastguard Worker  if [ -d /proc/sys/net/ipv4/conf/$interface ]; then
348*de1e4e89SAndroid Build Coastguard Worker    ifconfig $interface:dhcp 10.10.10.10 netmask 255.255.255.255
349*de1e4e89SAndroid Build Coastguard Worker    ifconfig $interface:dhcp down
350*de1e4e89SAndroid Build Coastguard Worker    if [ -d /proc/sys/net/ipv4/conf/$interface ]; then
351*de1e4e89SAndroid Build Coastguard Worker	LOG The interface $interface already configured.
352*de1e4e89SAndroid Build Coastguard Worker    fi
353*de1e4e89SAndroid Build Coastguard Worker  fi
354*de1e4e89SAndroid Build Coastguard Worker  ifconfig $interface:dhcp up
355*de1e4e89SAndroid Build Coastguard Worker  exit 0
356*de1e4e89SAndroid Build Coastguard Worker  ;;
357*de1e4e89SAndroid Build Coastguard Worker
358*de1e4e89SAndroid Build Coastguard WorkerARPSEND)
359*de1e4e89SAndroid Build Coastguard Worker  exit 0
360*de1e4e89SAndroid Build Coastguard Worker  ;;
361*de1e4e89SAndroid Build Coastguard Worker
362*de1e4e89SAndroid Build Coastguard WorkerARPCHECK)
363*de1e4e89SAndroid Build Coastguard Worker  if DAD "$interface" "$check_ip_address" ; then
364*de1e4e89SAndroid Build Coastguard Worker    exit 0
365*de1e4e89SAndroid Build Coastguard Worker  fi
366*de1e4e89SAndroid Build Coastguard Worker  exit 1
367*de1e4e89SAndroid Build Coastguard Worker  ;;
368*de1e4e89SAndroid Build Coastguard Worker
369*de1e4e89SAndroid Build Coastguard WorkerBOUND|RENEW|REBIND|REBOOT)
370*de1e4e89SAndroid Build Coastguard Worker  if [ "$old_ip_address" -a "$alias_ip_address" -a \
371*de1e4e89SAndroid Build Coastguard Worker	"$alias_ip_address" != "$old_ip_address" ]; then
372*de1e4e89SAndroid Build Coastguard Worker    DelINETAddr "$interface" "$alias_ip_address" "$alias_subnet_mask" "$alias_broadcast_address" dhcp1
373*de1e4e89SAndroid Build Coastguard Worker  fi
374*de1e4e89SAndroid Build Coastguard Worker  if [ "$old_ip_address" -a "$old_ip_address" != "$new_ip_address" ]; then
375*de1e4e89SAndroid Build Coastguard Worker    DelINETAddr "$interface" "$old_ip_address" "$old_subnet_mask" "$old_broadcast_address" dhcp
376*de1e4e89SAndroid Build Coastguard Worker    DelDefaultRoutes "$old_routers"
377*de1e4e89SAndroid Build Coastguard Worker    DelStaticRouteList "$old_static_routes"
378*de1e4e89SAndroid Build Coastguard Worker  fi
379*de1e4e89SAndroid Build Coastguard Worker  if [ "$old_ip_address" = "" -o "$old_ip_address" != "$new_ip_address" -o \
380*de1e4e89SAndroid Build Coastguard Worker       "$reason" = "BOUND" -o "$reason" = "REBOOT" ]; then
381*de1e4e89SAndroid Build Coastguard Worker    AddINETAddr "$interface" "$new_ip_address" "$new_subnet_mask" "$new_broadcast_address" dhcp
382*de1e4e89SAndroid Build Coastguard Worker    AddStaticRouteList "$new_static_routes"
383*de1e4e89SAndroid Build Coastguard Worker    AddDefaultRoutes "$new_routers"
384*de1e4e89SAndroid Build Coastguard Worker    UnsolicitedARP "$interface" "$new_ip_address"
385*de1e4e89SAndroid Build Coastguard Worker  fi
386*de1e4e89SAndroid Build Coastguard Worker  if [ "$new_ip_address" != "$alias_ip_address" -a "$alias_ip_address" ]; then
387*de1e4e89SAndroid Build Coastguard Worker    AddINETAddr "$interface" "$alias_ip_address" "$alias_subnet_mask" "$alias_broadcast_address" dhcp1
388*de1e4e89SAndroid Build Coastguard Worker  fi
389*de1e4e89SAndroid Build Coastguard Worker  UpdateDNS
390*de1e4e89SAndroid Build Coastguard Worker  exit 0
391*de1e4e89SAndroid Build Coastguard Worker  ;;
392*de1e4e89SAndroid Build Coastguard Worker
393*de1e4e89SAndroid Build Coastguard WorkerEXPIRE|FAIL)
394*de1e4e89SAndroid Build Coastguard Worker  if [ "$alias_ip_address" ]; then
395*de1e4e89SAndroid Build Coastguard Worker    DelINETAddr "$interface" "$alias_ip_address" "$alias_subnet_mask" "$alias_broadcast_address" dhcp1
396*de1e4e89SAndroid Build Coastguard Worker  fi
397*de1e4e89SAndroid Build Coastguard Worker  if [ "$old_ip_address" ]; then
398*de1e4e89SAndroid Build Coastguard Worker    DelINETAddr "$interface" "$old_ip_address" "$old_subnet_mask" "$old_broadcast_address" dhcp
399*de1e4e89SAndroid Build Coastguard Worker    DelDefaultRoutes "$old_routers"
400*de1e4e89SAndroid Build Coastguard Worker    DelStaticRouteList "$old_static_routes"
401*de1e4e89SAndroid Build Coastguard Worker  fi
402*de1e4e89SAndroid Build Coastguard Worker  if [ "$alias_ip_address" ]; then
403*de1e4e89SAndroid Build Coastguard Worker    AddINETAddr "$interface" "$alias_ip_address" "$alias_subnet_mask" "$alias_broadcast_address" dhcp1
404*de1e4e89SAndroid Build Coastguard Worker  fi
405*de1e4e89SAndroid Build Coastguard Worker  exit 0
406*de1e4e89SAndroid Build Coastguard Worker  ;;
407*de1e4e89SAndroid Build Coastguard Worker
408*de1e4e89SAndroid Build Coastguard WorkerTIMEOUT)
409*de1e4e89SAndroid Build Coastguard Worker  if [ "$alias_ip_address" ]; then
410*de1e4e89SAndroid Build Coastguard Worker    DelINETAddr "$interface" "$alias_ip_address" "$alias_subnet_mask" "$alias_broadcast_address" dhcp1
411*de1e4e89SAndroid Build Coastguard Worker  fi
412*de1e4e89SAndroid Build Coastguard Worker# Seems, <null address> means, that no more old leases found.
413*de1e4e89SAndroid Build Coastguard Worker# Or does it mean bug in dhcpcd? 8) Fail for now.
414*de1e4e89SAndroid Build Coastguard Worker  if [ "$new_ip_address" = "<null address>" ]; then
415*de1e4e89SAndroid Build Coastguard Worker    if [ "$old_ip_address" ]; then
416*de1e4e89SAndroid Build Coastguard Worker	DelINETAddr "$interface" "$old_ip_address" "$old_subnet_mask" "$old_broadcast_address" dhcp
417*de1e4e89SAndroid Build Coastguard Worker    fi
418*de1e4e89SAndroid Build Coastguard Worker    if [ "$alias_ip_address" ]; then
419*de1e4e89SAndroid Build Coastguard Worker        AddINETAddr "$interface" "$alias_ip_address" "$alias_subnet_mask" "$alias_broadcast_address" dhcp1
420*de1e4e89SAndroid Build Coastguard Worker    fi
421*de1e4e89SAndroid Build Coastguard Worker    exit 1
422*de1e4e89SAndroid Build Coastguard Worker  fi
423*de1e4e89SAndroid Build Coastguard Worker  if DAD "$interface" "$new_ip_address" ; then
424*de1e4e89SAndroid Build Coastguard Worker    AddINETAddr "$interface" "$new_ip_address" "$new_subnet_mask" "$new_broadcast_address" dhcp
425*de1e4e89SAndroid Build Coastguard Worker    UnsolicitedARP "$interface" "$new_ip_address"
426*de1e4e89SAndroid Build Coastguard Worker    if [ "$alias_ip_address" -a "$alias_ip_address" != "$new_ip_address" ]; then
427*de1e4e89SAndroid Build Coastguard Worker      AddINETAddr "$interface" "$alias_ip_address" "$alias_subnet_mask" "$alias_broadcast_address" dhcp1
428*de1e4e89SAndroid Build Coastguard Worker      UnsolicitedARP "$interface" "$alias_ip_address"
429*de1e4e89SAndroid Build Coastguard Worker    fi
430*de1e4e89SAndroid Build Coastguard Worker    if CheckRouterList "$new_routers" ; then
431*de1e4e89SAndroid Build Coastguard Worker	AddStaticRouteList "$new_static_routes"
432*de1e4e89SAndroid Build Coastguard Worker	UpdateDNS
433*de1e4e89SAndroid Build Coastguard Worker	exit 0
434*de1e4e89SAndroid Build Coastguard Worker    fi
435*de1e4e89SAndroid Build Coastguard Worker  fi
436*de1e4e89SAndroid Build Coastguard Worker  DelINETAddr "$interface" "$new_ip_address" "$new_subnet_mask" "$new_broadcast_address" dhcp
437*de1e4e89SAndroid Build Coastguard Worker  DelDefaultRoutes "$old_routers"
438*de1e4e89SAndroid Build Coastguard Worker  DelStaticRouteList "$old_static_routes"
439*de1e4e89SAndroid Build Coastguard Worker  if [ "$alias_ip_address" ]; then
440*de1e4e89SAndroid Build Coastguard Worker    AddINETAddr "$interface" "$alias_ip_address" "$alias_subnet_mask" "$alias_broadcast_address" dhcp1
441*de1e4e89SAndroid Build Coastguard Worker  fi
442*de1e4e89SAndroid Build Coastguard Worker  exit 1
443*de1e4e89SAndroid Build Coastguard Worker  ;;
444*de1e4e89SAndroid Build Coastguard Workeresac
445*de1e4e89SAndroid Build Coastguard Worker
446*de1e4e89SAndroid Build Coastguard Workerexit 0
447