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