xref: /aosp_15_r20/external/iproute2/ip/ifcfg (revision de1e4e894b0c224df933550f0afdecc354b238c4)
1*de1e4e89SAndroid Build Coastguard Worker#! /bin/bash
2*de1e4e89SAndroid Build Coastguard Worker
3*de1e4e89SAndroid Build Coastguard WorkerCheckForwarding () {
4*de1e4e89SAndroid Build Coastguard Worker  local sbase fwd
5*de1e4e89SAndroid Build Coastguard Worker  sbase=/proc/sys/net/ipv4/conf
6*de1e4e89SAndroid Build Coastguard Worker  fwd=0
7*de1e4e89SAndroid Build Coastguard Worker  if [ -d $sbase ]; then
8*de1e4e89SAndroid Build Coastguard Worker    for dir in $sbase/*/forwarding; do
9*de1e4e89SAndroid Build Coastguard Worker      fwd=$[$fwd + `cat $dir`]
10*de1e4e89SAndroid Build Coastguard Worker    done
11*de1e4e89SAndroid Build Coastguard Worker  else
12*de1e4e89SAndroid Build Coastguard Worker    fwd=2
13*de1e4e89SAndroid Build Coastguard Worker  fi
14*de1e4e89SAndroid Build Coastguard Worker  return $fwd
15*de1e4e89SAndroid Build Coastguard Worker}
16*de1e4e89SAndroid Build Coastguard Worker
17*de1e4e89SAndroid Build Coastguard WorkerRestartRDISC () {
18*de1e4e89SAndroid Build Coastguard Worker  killall -HUP rdisc || rdisc -fs
19*de1e4e89SAndroid Build Coastguard Worker}
20*de1e4e89SAndroid Build Coastguard Worker
21*de1e4e89SAndroid Build Coastguard WorkerABCMaskLen () {
22*de1e4e89SAndroid Build Coastguard Worker  local class;
23*de1e4e89SAndroid Build Coastguard Worker
24*de1e4e89SAndroid Build Coastguard Worker  class=${1%%.*}
25*de1e4e89SAndroid Build Coastguard Worker  if [ "$1" = "" -o $class -eq 0 -o $class -ge 224 ]; then return 0
26*de1e4e89SAndroid Build Coastguard Worker  elif [ $class -ge 224 ]; then return 0
27*de1e4e89SAndroid Build Coastguard Worker  elif [ $class -ge 192 ]; then return 24
28*de1e4e89SAndroid Build Coastguard Worker  elif [ $class -ge 128 ]; then return 16
29*de1e4e89SAndroid Build Coastguard Worker  else return 8; fi
30*de1e4e89SAndroid Build Coastguard Worker}
31*de1e4e89SAndroid Build Coastguard Worker
32*de1e4e89SAndroid Build Coastguard Workerlabel="label $1"
33*de1e4e89SAndroid Build Coastguard Workerldev="$1"
34*de1e4e89SAndroid Build Coastguard Workerdev=${1%:*}
35*de1e4e89SAndroid Build Coastguard Workerif [ "$dev" = "" -o "$1" = "help" ]; then
36*de1e4e89SAndroid Build Coastguard Worker  echo "Usage: ifcfg DEV [[add|del [ADDR[/LEN]] [PEER] | stop]" 1>&2
37*de1e4e89SAndroid Build Coastguard Worker  echo "       add - add new address" 1>&2
38*de1e4e89SAndroid Build Coastguard Worker  echo "       del - delete address" 1>&2
39*de1e4e89SAndroid Build Coastguard Worker  echo "       stop - completely disable IP" 1>&2
40*de1e4e89SAndroid Build Coastguard Worker  exit 1
41*de1e4e89SAndroid Build Coastguard Workerfi
42*de1e4e89SAndroid Build Coastguard Workershift
43*de1e4e89SAndroid Build Coastguard Worker
44*de1e4e89SAndroid Build Coastguard WorkerCheckForwarding
45*de1e4e89SAndroid Build Coastguard Workerfwd=$?
46*de1e4e89SAndroid Build Coastguard Workerif [ $fwd -ne 0 ]; then
47*de1e4e89SAndroid Build Coastguard Worker  echo "Forwarding is ON or its state is unknown ($fwd). OK, No RDISC." 1>&2
48*de1e4e89SAndroid Build Coastguard Workerfi
49*de1e4e89SAndroid Build Coastguard Worker
50*de1e4e89SAndroid Build Coastguard Worker
51*de1e4e89SAndroid Build Coastguard Workerdeleting=0
52*de1e4e89SAndroid Build Coastguard Workercase "$1" in
53*de1e4e89SAndroid Build Coastguard Workeradd) shift ;;
54*de1e4e89SAndroid Build Coastguard Workerstop)
55*de1e4e89SAndroid Build Coastguard Worker  if [ "$ldev" != "$dev" ]; then
56*de1e4e89SAndroid Build Coastguard Worker    echo "Cannot stop alias $ldev" 1>&2
57*de1e4e89SAndroid Build Coastguard Worker    exit 1;
58*de1e4e89SAndroid Build Coastguard Worker  fi
59*de1e4e89SAndroid Build Coastguard Worker  ip -4 addr flush dev $dev $label || exit 1
60*de1e4e89SAndroid Build Coastguard Worker  if [ $fwd -eq 0 ]; then RestartRDISC; fi
61*de1e4e89SAndroid Build Coastguard Worker  exit 0 ;;
62*de1e4e89SAndroid Build Coastguard Workerdel*)
63*de1e4e89SAndroid Build Coastguard Worker  deleting=1; shift ;;
64*de1e4e89SAndroid Build Coastguard Worker*)
65*de1e4e89SAndroid Build Coastguard Workeresac
66*de1e4e89SAndroid Build Coastguard Worker
67*de1e4e89SAndroid Build Coastguard Workeripaddr=
68*de1e4e89SAndroid Build Coastguard Workerpfxlen=
69*de1e4e89SAndroid Build Coastguard Workerif [ "$1" != "" ]; then
70*de1e4e89SAndroid Build Coastguard Worker  ipaddr=${1%/*}
71*de1e4e89SAndroid Build Coastguard Worker  if [ "$1" != "$ipaddr" ]; then
72*de1e4e89SAndroid Build Coastguard Worker    pfxlen=${1#*/}
73*de1e4e89SAndroid Build Coastguard Worker  fi
74*de1e4e89SAndroid Build Coastguard Worker  if [ "$ipaddr" = "" ]; then
75*de1e4e89SAndroid Build Coastguard Worker    echo "$1 is bad IP address." 1>&2
76*de1e4e89SAndroid Build Coastguard Worker    exit 1
77*de1e4e89SAndroid Build Coastguard Worker  fi
78*de1e4e89SAndroid Build Coastguard Workerfi
79*de1e4e89SAndroid Build Coastguard Workershift
80*de1e4e89SAndroid Build Coastguard Worker
81*de1e4e89SAndroid Build Coastguard Workerpeer=$1
82*de1e4e89SAndroid Build Coastguard Workerif [ "$peer" != "" ]; then
83*de1e4e89SAndroid Build Coastguard Worker  if [ "$pfxlen" != "" -a "$pfxlen" != "32" ]; then
84*de1e4e89SAndroid Build Coastguard Worker    echo "Peer address with non-trivial netmask." 1>&2
85*de1e4e89SAndroid Build Coastguard Worker    exit 1
86*de1e4e89SAndroid Build Coastguard Worker  fi
87*de1e4e89SAndroid Build Coastguard Worker  pfx="$ipaddr peer $peer"
88*de1e4e89SAndroid Build Coastguard Workerelse
89*de1e4e89SAndroid Build Coastguard Worker  if [ "$ipaddr" = "" ]; then
90*de1e4e89SAndroid Build Coastguard Worker    echo "Missing IP address argument." 1>&2
91*de1e4e89SAndroid Build Coastguard Worker    exit 1
92*de1e4e89SAndroid Build Coastguard Worker  fi
93*de1e4e89SAndroid Build Coastguard Worker  if [ "$pfxlen" = "" ]; then
94*de1e4e89SAndroid Build Coastguard Worker    ABCMaskLen $ipaddr
95*de1e4e89SAndroid Build Coastguard Worker    pfxlen=$?
96*de1e4e89SAndroid Build Coastguard Worker  fi
97*de1e4e89SAndroid Build Coastguard Worker  pfx="$ipaddr/$pfxlen"
98*de1e4e89SAndroid Build Coastguard Workerfi
99*de1e4e89SAndroid Build Coastguard Worker
100*de1e4e89SAndroid Build Coastguard Workerif [ "$ldev" = "$dev" -a "$ipaddr" != "" ]; then
101*de1e4e89SAndroid Build Coastguard Worker  label=
102*de1e4e89SAndroid Build Coastguard Workerfi
103*de1e4e89SAndroid Build Coastguard Worker
104*de1e4e89SAndroid Build Coastguard Workerif [ $deleting -ne 0 ]; then
105*de1e4e89SAndroid Build Coastguard Worker  ip addr del $pfx dev $dev $label || exit 1
106*de1e4e89SAndroid Build Coastguard Worker  if [ $fwd -eq 0 ]; then RestartRDISC; fi
107*de1e4e89SAndroid Build Coastguard Worker  exit 0
108*de1e4e89SAndroid Build Coastguard Workerfi
109*de1e4e89SAndroid Build Coastguard Worker
110*de1e4e89SAndroid Build Coastguard Worker
111*de1e4e89SAndroid Build Coastguard Workerif ! ip link set up dev $dev ; then
112*de1e4e89SAndroid Build Coastguard Worker  echo "Error: cannot enable interface $dev." 1>&2
113*de1e4e89SAndroid Build Coastguard Worker  exit 1
114*de1e4e89SAndroid Build Coastguard Workerfi
115*de1e4e89SAndroid Build Coastguard Workerif [ "$ipaddr" = "" ]; then exit 0; fi
116*de1e4e89SAndroid Build Coastguard Worker
117*de1e4e89SAndroid Build Coastguard Workerif ! arping -q -c 2 -w 3 -D -I $dev $ipaddr ; then
118*de1e4e89SAndroid Build Coastguard Worker  echo "Error: some host already uses address $ipaddr on $dev." 1>&2
119*de1e4e89SAndroid Build Coastguard Worker  exit 1
120*de1e4e89SAndroid Build Coastguard Workerfi
121*de1e4e89SAndroid Build Coastguard Worker
122*de1e4e89SAndroid Build Coastguard Workerif ! ip address add $pfx brd + dev $dev $label; then
123*de1e4e89SAndroid Build Coastguard Worker  echo "Error: failed to add $pfx on $dev." 1>&2
124*de1e4e89SAndroid Build Coastguard Worker  exit 1
125*de1e4e89SAndroid Build Coastguard Workerfi
126*de1e4e89SAndroid Build Coastguard Worker
127*de1e4e89SAndroid Build Coastguard Workerarping -q -A -c 1 -I $dev $ipaddr
128*de1e4e89SAndroid Build Coastguard Workernoarp=$?
129*de1e4e89SAndroid Build Coastguard Worker( sleep 2 ;
130*de1e4e89SAndroid Build Coastguard Worker  arping -q -U -c 1 -I $dev $ipaddr ) >& /dev/null </dev/null &
131*de1e4e89SAndroid Build Coastguard Worker
132*de1e4e89SAndroid Build Coastguard Workerip route add unreachable 224.0.0.0/24 >& /dev/null
133*de1e4e89SAndroid Build Coastguard Workerip route add unreachable 255.255.255.255 >& /dev/null
134*de1e4e89SAndroid Build Coastguard Workerif [ "`ip link ls $dev | grep -c MULTICAST`" -ge 1 ]; then
135*de1e4e89SAndroid Build Coastguard Worker  ip route add 224.0.0.0/4 dev $dev scope global >& /dev/null
136*de1e4e89SAndroid Build Coastguard Workerfi
137*de1e4e89SAndroid Build Coastguard Worker
138*de1e4e89SAndroid Build Coastguard Workerif [ $fwd -eq 0 ]; then
139*de1e4e89SAndroid Build Coastguard Worker  if [ $noarp -eq 0 ]; then
140*de1e4e89SAndroid Build Coastguard Worker    ip ro append default dev $dev metric 30000 scope global
141*de1e4e89SAndroid Build Coastguard Worker  elif [ "$peer" != "" ]; then
142*de1e4e89SAndroid Build Coastguard Worker    if ping -q -c 2 -w 4 $peer ; then
143*de1e4e89SAndroid Build Coastguard Worker      ip ro append default via $peer dev $dev metric 30001
144*de1e4e89SAndroid Build Coastguard Worker    fi
145*de1e4e89SAndroid Build Coastguard Worker  fi
146*de1e4e89SAndroid Build Coastguard Worker  RestartRDISC
147*de1e4e89SAndroid Build Coastguard Workerfi
148*de1e4e89SAndroid Build Coastguard Worker
149*de1e4e89SAndroid Build Coastguard Workerexit 0
150