Commit 3407df8d authored by Kui-Feng Lee's avatar Kui-Feng Lee Committed by David S. Miller

selftests/net: Adding test cases of replacing routes and route advertisements.

Add tests of changing permanent routes to temporary routes and the reversed
case to make sure GC working correctly in these cases.  Add tests for the
temporary routes from RA.

The existing device will be deleted between tests to remove all routes
associated with it, so that the earlier tests don't mess up the later ones.
Reviewed-by: default avatarHangbin Liu <liuhangbin@gmail.com>
Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
Tested-by: default avatarHangbin Liu <liuhangbin@gmail.com>
Signed-off-by: default avatarKui-Feng Lee <thinker.li@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 768e06a8
...@@ -743,6 +743,43 @@ fib_notify_test() ...@@ -743,6 +743,43 @@ fib_notify_test()
cleanup &> /dev/null cleanup &> /dev/null
} }
# Create a new dummy_10 to remove all associated routes.
reset_dummy_10()
{
$IP link del dev dummy_10
$IP link add dummy_10 type dummy
$IP link set dev dummy_10 up
$IP -6 address add 2001:10::1/64 dev dummy_10
}
check_rt_num()
{
local expected=$1
local num=$2
if [ $num -ne $expected ]; then
echo "FAIL: Expected $expected routes, got $num"
ret=1
else
ret=0
fi
}
check_rt_num_clean()
{
local expected=$1
local num=$2
if [ $num -ne $expected ]; then
log_test 1 0 "expected $expected routes, got $num"
set +e
cleanup &> /dev/null
return 1
fi
return 0
}
fib6_gc_test() fib6_gc_test()
{ {
setup setup
...@@ -751,7 +788,7 @@ fib6_gc_test() ...@@ -751,7 +788,7 @@ fib6_gc_test()
echo "Fib6 garbage collection test" echo "Fib6 garbage collection test"
set -e set -e
EXPIRE=3 EXPIRE=5
# Check expiration of routes every $EXPIRE seconds (GC) # Check expiration of routes every $EXPIRE seconds (GC)
$NS_EXEC sysctl -wq net.ipv6.route.gc_interval=$EXPIRE $NS_EXEC sysctl -wq net.ipv6.route.gc_interval=$EXPIRE
...@@ -763,44 +800,114 @@ fib6_gc_test() ...@@ -763,44 +800,114 @@ fib6_gc_test()
$NS_EXEC sysctl -wq net.ipv6.route.flush=1 $NS_EXEC sysctl -wq net.ipv6.route.flush=1
# Temporary routes # Temporary routes
for i in $(seq 1 1000); do for i in $(seq 1 5); do
# Expire route after $EXPIRE seconds # Expire route after $EXPIRE seconds
$IP -6 route add 2001:20::$i \ $IP -6 route add 2001:20::$i \
via 2001:10::2 dev dummy_10 expires $EXPIRE via 2001:10::2 dev dummy_10 expires $EXPIRE
done done
sleep $(($EXPIRE * 2)) sleep $(($EXPIRE * 2 + 1))
N_EXP_SLEEP=$($IP -6 route list |grep expires|wc -l) $NS_EXEC sysctl -wq net.ipv6.route.flush=1
if [ $N_EXP_SLEEP -ne 0 ]; then check_rt_num 0 $($IP -6 route list |grep expires|wc -l)
echo "FAIL: expected 0 routes with expires, got $N_EXP_SLEEP" log_test $ret 0 "ipv6 route garbage collection"
ret=1
else reset_dummy_10
ret=0
fi
# Permanent routes # Permanent routes
for i in $(seq 1 5000); do for i in $(seq 1 5); do
$IP -6 route add 2001:30::$i \ $IP -6 route add 2001:30::$i \
via 2001:10::2 dev dummy_10 via 2001:10::2 dev dummy_10
done done
# Temporary routes # Temporary routes
for i in $(seq 1 1000); do for i in $(seq 1 5); do
# Expire route after $EXPIRE seconds # Expire route after $EXPIRE seconds
$IP -6 route add 2001:20::$i \ $IP -6 route add 2001:20::$i \
via 2001:10::2 dev dummy_10 expires $EXPIRE via 2001:10::2 dev dummy_10 expires $EXPIRE
done done
sleep $(($EXPIRE * 2)) sleep $(($EXPIRE * 2 + 1))
N_EXP_SLEEP=$($IP -6 route list |grep expires|wc -l) check_rt_num 0 $($IP -6 route list |grep expires|wc -l)
if [ $N_EXP_SLEEP -ne 0 ]; then log_test $ret 0 "ipv6 route garbage collection (with permanent routes)"
echo "FAIL: expected 0 routes with expires," \
"got $N_EXP_SLEEP (5000 permanent routes)" reset_dummy_10
ret=1
else # Permanent routes
ret=0 for i in $(seq 1 5); do
$IP -6 route add 2001:20::$i \
via 2001:10::2 dev dummy_10
done
# Replace with temporary routes
for i in $(seq 1 5); do
# Expire route after $EXPIRE seconds
$IP -6 route replace 2001:20::$i \
via 2001:10::2 dev dummy_10 expires $EXPIRE
done
check_rt_num_clean 5 $($IP -6 route list |grep expires|wc -l) || return
# Wait for GC
sleep $(($EXPIRE * 2 + 1))
$NS_EXEC sysctl -wq net.ipv6.route.flush=1
check_rt_num 0 $($IP -6 route list |grep expires|wc -l)
log_test $ret 0 "ipv6 route garbage collection (replace with expires)"
reset_dummy_10
# Temporary routes
for i in $(seq 1 5); do
# Expire route after $EXPIRE seconds
$IP -6 route add 2001:20::$i \
via 2001:10::2 dev dummy_10 expires $EXPIRE
done
# Replace with permanent routes
for i in $(seq 1 5); do
$IP -6 route replace 2001:20::$i \
via 2001:10::2 dev dummy_10
done
check_rt_num_clean 0 $($IP -6 route list |grep expires|wc -l) || return
# Wait for GC
sleep $(($EXPIRE * 2 + 1))
check_rt_num 5 $($IP -6 route list |grep -v expires|grep 2001:20::|wc -l)
log_test $ret 0 "ipv6 route garbage collection (replace with permanent)"
# ra6 is required for the next test. (ipv6toolkit)
if [ ! -x "$(command -v ra6)" ]; then
echo "SKIP: ra6 not found."
set +e
cleanup &> /dev/null
return
fi fi
set +e # Delete dummy_10 and remove all routes
$IP link del dev dummy_10
log_test $ret 0 "ipv6 route garbage collection" # Create a pair of veth devices to send a RA message from one
# device to another.
$IP link add veth1 type veth peer name veth2
$IP link set dev veth1 up
$IP link set dev veth2 up
$IP -6 address add 2001:10::1/64 dev veth1 nodad
$IP -6 address add 2001:10::2/64 dev veth2 nodad
# Make veth1 ready to receive RA messages.
$NS_EXEC sysctl -wq net.ipv6.conf.veth1.accept_ra=2
# Send a RA message with a route from veth2 to veth1.
$NS_EXEC ra6 -i veth2 -d 2001:10::1 -t $EXPIRE
# Wait for the RA message.
sleep 1
# systemd may mess up the test. You syould make sure that
# systemd-networkd.service and systemd-networkd.socket are stopped.
check_rt_num_clean 1 $($IP -6 route list|grep expires|wc -l) || return
# Wait for GC
sleep $(($EXPIRE * 2 + 1))
$NS_EXEC sysctl -wq net.ipv6.route.flush=1
check_rt_num 0 $($IP -6 route list |grep expires|wc -l)
log_test $ret 0 "ipv6 route garbage collection (RA message)"
set +e
cleanup &> /dev/null cleanup &> /dev/null
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment