209 lines
6.2 KiB
Bash
Executable File
209 lines
6.2 KiB
Bash
Executable File
#!/bin/sh
|
|
# IPv4 routing functions, included by /etc/bewan/init.d/routes
|
|
# This file is largely shared by what's in ipv6_routing_functions.
|
|
# So when you fix something here, please take a look at the other.
|
|
|
|
[ ${IPV4_ROUTING_LIB:-0} = 1 ] && return
|
|
IPV4_ROUTING_LIB=1
|
|
|
|
check_routes_ipv4() {
|
|
base_check_arg '/bin/true' "test -d $ROUTED"
|
|
}
|
|
|
|
stop_routes_ipv4() {
|
|
local i j
|
|
for i in `ls $ROUTED`; do
|
|
if [ "$i" != 'status' ]; then
|
|
local rtdir=$ROUTED/$i
|
|
for j in `ls $rtdir`; do
|
|
ip -4 route flush table $j 2>/dev/null
|
|
local rule
|
|
rule=`cat $rtdir/$j/rule 2>/dev/null`
|
|
[ "$rule" != '' ] && ip -4 rule del $rule 2>&1 | base_log - debug
|
|
done
|
|
fi
|
|
done
|
|
rm -rf $ROUTED
|
|
ip -4 route flush table default
|
|
rm -f $WAND/default
|
|
}
|
|
|
|
init_routes_ipv4() {
|
|
# Change the priority of routing lookup
|
|
# We search in the main table first
|
|
# Then check the additional source routing rules
|
|
# We finally lookup the default table
|
|
ip -4 rule del pref 10 lookup main 2>/dev/null
|
|
ip -4 rule del pref 32766 lookup main 2>/dev/null
|
|
ip -4 rule add pref 10 lookup main
|
|
}
|
|
|
|
start_routes_ipv4() {
|
|
local i router
|
|
mkdir -p $ROUTED
|
|
|
|
# Brings-up the main default route
|
|
local defrte=$Layer3Forwarding_DefaultConnectionService
|
|
local ifname=`cat $WAND/$defrte/ip/ifname 2>/dev/null`
|
|
local ipaddr=`cat $WAND/$defrte/ip/ipaddr 2>/dev/null`
|
|
local fakeip=`cat $WAND/$defrte/ip/fakeip 2>/dev/null`
|
|
local routers=`cat $WAND/$defrte/ip/routers 2>/dev/null`
|
|
echo "$defrte" >$WAND/default
|
|
if [ "$routers" != '' ]; then
|
|
for router in $routers; do
|
|
ip -4 route add default metric 5 via $router dev $ifname table default 2>&1 | base_log - debug
|
|
done
|
|
elif [ "$ipaddr" != '' ] || [ "$fakeip" != '' ]; then
|
|
ip -4 route add default metric 5 dev $ifname table default 2>&1 | base_log - debug
|
|
fi
|
|
}
|
|
|
|
add_route_ipv4() {
|
|
local ext; eval ext=\${$l3f$i'_External'}
|
|
local intf; eval intf=\${$l3f$i'_Interface'}
|
|
local srcip; eval srcip=\${$l3f$i'_SourceIPAddress'}
|
|
local srcmask; eval srcmask=\${$l3f$i'_SourceSubnetMask'}
|
|
local dstip; eval dstip=\${$l3f$i'_DestIPAddress'}
|
|
local dstmask; eval dstmask=\${$l3f$i'_DestSubnetMask'}
|
|
local tos; eval tos=\${$l3f$i'_TOS'}
|
|
local mark; eval mark=\${$l3f$i'_Mark'}
|
|
local gateway; eval gateway=\${$l3f$i'_GatewayIPAddress'}
|
|
local metric; eval metric=\${$l3f$i'_ForwardingMetric'}
|
|
local mtu; eval mtu=\${$l3f$i'_MTU'}
|
|
local table; eval table=\${$l3f$i'_RoutingTable'}
|
|
local pref; eval pref=\${$l3f$i'_RoutingTablePref'}
|
|
|
|
local smask=`ipmask $srcmask`
|
|
local dmask=`ipmask $dstmask`
|
|
|
|
# Not an ipv4 address, should we complain ?
|
|
if [ "$gateway" != '' ]; then isip $gateway || return; fi
|
|
if [ "$srcip" != '' ]; then isip $srcip || return; fi
|
|
if [ "$dstip" != '' ]; then isip $dstip || return; fi
|
|
|
|
local dst
|
|
if [ "$dstip" = '' ] || [ "$dstip" = '0.0.0.0' ]; then
|
|
dst='default'
|
|
else
|
|
[ "$dmask" = '' ] && dmask=32
|
|
dst="$dstip/$dmask"
|
|
fi
|
|
local dest="$dst"
|
|
if [ "$mtu" != '' ]; then
|
|
dest="$dest mtu $mtu"
|
|
fi
|
|
if [ "$metric" != '' ]; then
|
|
dest="$dest metric $metric"
|
|
fi
|
|
local ifname ipaddr fakeip routers rtdir
|
|
if [ "$intf" = 0 ]; then
|
|
ifname='' ipaddr='' fakeip='' routers=''
|
|
rtdir="$ROUTED/unreachable"
|
|
elif [ "$ext" = 1 ]; then
|
|
ifname=`cat $WAND/$intf/ip/ifname 2>/dev/null`
|
|
ipaddr=`cat $WAND/$intf/ip/ipaddr 2>/dev/null`
|
|
fakeip=`cat $WAND/$intf/ip/fakeip 2>/dev/null`
|
|
routers=`cat $WAND/$intf/ip/routers 2>/dev/null`
|
|
rtdir="$ROUTED/wan$intf"
|
|
else
|
|
ifname=`cat $LAND/$intf/ifname 2>/dev/null`
|
|
ipaddr=`cat $LAND/$intf/ip/ipaddr 2>/dev/null`
|
|
routers=`cat $LAND/$intf/ip/routers 2>/dev/null`
|
|
rtdir="$ROUTED/lan$intf"
|
|
fakeip=''
|
|
fi
|
|
local rule
|
|
if [ "$srcip" = '' ]; then
|
|
rule="to $dst"
|
|
else
|
|
[ "$smask" = '' ] && smask=32
|
|
rule="from $srcip/$smask to $dst"
|
|
fi
|
|
if [ "$tos" != '' ]; then
|
|
rule="$rule tos $tos"
|
|
fi
|
|
if [ "$mark" != '' ]; then
|
|
rule="$rule fwmark $mark"
|
|
fi
|
|
|
|
mkdir -p $ROUTED/status
|
|
local tbl prf res=''
|
|
if [ "$srcip" = '' ] && [ "$tos" = '' ] && [ "$mark" = '' ] && [ "$dst" = 'default' ]; then
|
|
# Put the route in table named 'default'
|
|
# a rule to lookup in that table already exists
|
|
tbl='default'
|
|
prf=32767
|
|
mkdir -p $rtdir/$tbl
|
|
res=0
|
|
else
|
|
if [ "$table" != '' ]; then
|
|
# Put the route in the table given by config
|
|
tbl=$table
|
|
else
|
|
# Put the route in table $num and
|
|
# a rule to lookup in that table
|
|
tbl=$num
|
|
fi
|
|
if [ "$pref" != '' ]; then
|
|
prf=$pref
|
|
else
|
|
prf=$tbl
|
|
fi
|
|
mkdir -p $rtdir/$tbl
|
|
# Set rule priority
|
|
rule="$rule pref $prf"
|
|
echo $rule >$rtdir/$tbl/rule
|
|
local ret_log
|
|
ret_log="$(ip -4 rule add $rule table $tbl 2>&1)"
|
|
res=$?
|
|
[ "$ret_log" != '' ] && base_log "$ret_log" debug
|
|
fi
|
|
# Save route info to rebuild it in script update-routes
|
|
echo $i >$rtdir/$tbl/idx
|
|
echo $dest >$rtdir/$tbl/dest
|
|
echo $gateway >$rtdir/$tbl/gate
|
|
if [ "$intf" != 0 ] && ( [ "$ifname" = '' ] || ( [ "$ipaddr" = '' ] && [ "$fakeip" = '' ] )); then
|
|
# No interface
|
|
echo 'Disabled' >$ROUTED/status/$i
|
|
res=''
|
|
elif [ $res != 0 ]; then
|
|
# Error in ip rule add...
|
|
echo 'Error' >$ROUTED/status/$i
|
|
res=''
|
|
elif [ "$intf" = 0 ]; then
|
|
# Unreachable route
|
|
local ret_log
|
|
ret_log="$(ip -4 route add unreachable $dest table $tbl 2>&1)"
|
|
res=$?
|
|
[ "$ret_log" != '' ] && base_log "$ret_log" debug
|
|
elif [ "$gateway" != '' ]; then
|
|
local ret_log
|
|
ret_log="$(ip -4 route add $dest via $gateway dev $ifname table $tbl 2>&1)"
|
|
res=$?
|
|
[ "$ret_log" != '' ] && base_log "$ret_log" debug
|
|
elif [ "$routers" != '' ]; then
|
|
for router in $routers; do
|
|
local ret_log
|
|
ret_log="$(ip -4 route add $dest via $router dev $ifname table $tbl 2>&1)"
|
|
res=$?
|
|
[ "$ret_log" != '' ] && base_log "$ret_log" debug
|
|
[ $res != 0 ] && break
|
|
done
|
|
# No gateway found (ppp interface)
|
|
elif [ "$ipaddr" != '' ] || [ "$fakeip" != '' ]; then
|
|
local ret_log
|
|
ret_log="$(ip -4 route add $dest dev $ifname table $tbl 2>&1)"
|
|
res=$?
|
|
[ "$ret_log" != '' ] && base_log "$ret_log" debug
|
|
fi
|
|
if [ "$res" = 0 ]; then
|
|
# Success
|
|
echo 'Enabled' >$ROUTED/status/$i
|
|
elif [ "$res" != '' ]; then
|
|
# Error in ip route add...
|
|
echo 'Error' >$ROUTED/status/$i
|
|
fi
|
|
}
|
|
|
|
|