Skip to content

Commit

Permalink
selftests/net: Adding test cases of replacing routes and route advert…
Browse files Browse the repository at this point in the history
…isements.

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.

Signed-off-by: Kui-Feng Lee <thinker.li@gmail.com>
Signed-off-by: NipaLocal <nipa@local>
  • Loading branch information
ThinkerYzu1 authored and NipaLocal committed Feb 2, 2024
1 parent 9a60fbd commit 0086e86
Showing 1 changed file with 146 additions and 15 deletions.
161 changes: 146 additions & 15 deletions tools/testing/selftests/net/fib_tests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -743,6 +743,16 @@ fib_notify_test()
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
}

fib6_gc_test()
{
setup
Expand All @@ -751,7 +761,7 @@ fib6_gc_test()
echo "Fib6 garbage collection test"
set -e

EXPIRE=3
EXPIRE=5

# Check expiration of routes every $EXPIRE seconds (GC)
$NS_EXEC sysctl -wq net.ipv6.route.gc_interval=$EXPIRE
Expand All @@ -763,44 +773,165 @@ fib6_gc_test()
$NS_EXEC sysctl -wq net.ipv6.route.flush=1

# Temporary routes
for i in $(seq 1 1000); do
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
sleep $(($EXPIRE * 2))
N_EXP_SLEEP=$($IP -6 route list |grep expires|wc -l)
if [ $N_EXP_SLEEP -ne 0 ]; then
echo "FAIL: expected 0 routes with expires, got $N_EXP_SLEEP"
sleep $(($EXPIRE * 2 + 1))
N_EXP=$($IP -6 route list |grep expires|wc -l)
if [ $N_EXP -ne 0 ]; then
echo "FAIL: expected 0 routes with expires, got $N_EXP"
ret=1
else
ret=0
fi

log_test $ret 0 "ipv6 route garbage collection"

reset_dummy_10

# Permanent routes
for i in $(seq 1 5000); do
for i in $(seq 1 5); do
$IP -6 route add 2001:30::$i \
via 2001:10::2 dev dummy_10
done
# Temporary routes
for i in $(seq 1 1000); do
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
sleep $(($EXPIRE * 2))
N_EXP_SLEEP=$($IP -6 route list |grep expires|wc -l)
if [ $N_EXP_SLEEP -ne 0 ]; then
echo "FAIL: expected 0 routes with expires," \
"got $N_EXP_SLEEP (5000 permanent routes)"
sleep $(($EXPIRE * 2 + 1))
N_EXP=$($IP -6 route list |grep expires|wc -l)
if [ $N_EXP -ne 0 ]; then
echo "FAIL: expected 0 routes with expires, got $N_EXP"
ret=1
else
ret=0
fi

set +e
log_test $ret 0 "ipv6 route garbage collection (with permanent routes)"

log_test $ret 0 "ipv6 route garbage collection"
reset_dummy_10

# Permanent routes
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
N_EXP=$($IP -6 route list |grep expires|wc -l)
if [ $N_EXP -ne 5 ]; then
log_test 1 0 "expected 5 routes with expires, got $N_EXP"
set +e
cleanup &> /dev/null
return
fi
# Wait for GC
sleep $(($EXPIRE * 2 + 1))
N_EXP=$($IP -6 route list |grep expires|wc -l)
if [ $N_EXP -ne 0 ]; then
echo "FAIL: expected 0 routes with expires, got $N_EXP"
ret=1
else
ret=0
fi

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
N_EXP=$($IP -6 route list |grep expires|wc -l)
if [ $N_EXP -ne 0 ]; then
log_test 1 0 "expected 0 routes with expires, got $N_EXP"
set +e
cleanup &> /dev/null
return
fi

# Wait for GC
sleep $(($EXPIRE * 2 + 1))

N_PERM=$($IP -6 route list |grep -v expires|grep 2001:20::|wc -l)
if [ $N_PERM -ne 5 ]; then
echo "FAIL: expected 5 permanent routes, got $N_PERM"
ret=1
else
ret=0
fi

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

# Delete dummy_10 and remove all routes
$IP link del dev dummy_10

# 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

N_EXP=$($IP -6 route list|grep expires|wc -l)
if [ $N_EXP -ne 1 ]; then
# systemd may mess up the test. Make sure that
# systemd-networkd.service and systemd-networkd.socket are
# stopped.
log_test 1 0 "expected 1 routes with expires, got $N_EXP"
set +e
cleanup &> /dev/null
return
fi

# Wait for GC
sleep $(($EXPIRE * 2 + 1))

N_EXP=$($IP -6 route list |grep expires|wc -l)
if [ $N_EXP -ne 0 ]; then
echo "FAIL: expected 0 routes with expires, got $N_EXP"
ret=1
else
ret=0
fi

log_test $ret 0 "ipv6 route garbage collection (RA message)"

set +e

cleanup &> /dev/null
}
Expand Down

0 comments on commit 0086e86

Please sign in to comment.