| #!/bin/bash |
| # SPDX-License-Identifier: GPL-2.0 |
| |
| ROUTER_NUM_NETIFS=4 |
| : ${TIMEOUT:=20000} # ms |
| |
| router_h1_create() |
| { |
| simple_if_init $h1 192.0.1.1/24 |
| } |
| |
| router_h1_destroy() |
| { |
| simple_if_fini $h1 192.0.1.1/24 |
| } |
| |
| router_h2_create() |
| { |
| simple_if_init $h2 192.0.2.1/24 |
| tc qdisc add dev $h2 handle ffff: ingress |
| } |
| |
| router_h2_destroy() |
| { |
| tc qdisc del dev $h2 handle ffff: ingress |
| simple_if_fini $h2 192.0.2.1/24 |
| } |
| |
| router_create() |
| { |
| ip link set dev $rp1 up |
| ip link set dev $rp2 up |
| |
| ip address add 192.0.1.2/24 dev $rp1 |
| ip address add 192.0.2.2/24 dev $rp2 |
| } |
| |
| router_destroy() |
| { |
| ip address del 192.0.2.2/24 dev $rp2 |
| ip address del 192.0.1.2/24 dev $rp1 |
| |
| ip link set dev $rp2 down |
| ip link set dev $rp1 down |
| } |
| |
| router_setup_prepare() |
| { |
| h1=${NETIFS[p1]} |
| rp1=${NETIFS[p2]} |
| |
| rp2=${NETIFS[p3]} |
| h2=${NETIFS[p4]} |
| |
| h1mac=$(mac_get $h1) |
| rp1mac=$(mac_get $rp1) |
| |
| vrf_prepare |
| |
| router_h1_create |
| router_h2_create |
| |
| router_create |
| } |
| |
| wait_for_routes() |
| { |
| local t0=$1; shift |
| local route_count=$1; shift |
| |
| local t1=$(ip route | grep 'offload' | grep -v 'offload_failed' | wc -l) |
| local delta=$((t1 - t0)) |
| echo $delta |
| [[ $delta -ge $route_count ]] |
| } |
| |
| router_routes_create() |
| { |
| local route_count=$1 |
| local count=0 |
| |
| ROUTE_FILE="$(mktemp)" |
| |
| for i in {0..255} |
| do |
| for j in {0..255} |
| do |
| for k in {0..255} |
| do |
| if [[ $count -eq $route_count ]]; then |
| break 3 |
| fi |
| |
| echo route add 193.${i}.${j}.${k}/32 dev $rp2 \ |
| >> $ROUTE_FILE |
| ((count++)) |
| done |
| done |
| done |
| |
| ip -b $ROUTE_FILE &> /dev/null |
| } |
| |
| router_routes_destroy() |
| { |
| if [[ -v ROUTE_FILE ]]; then |
| rm -f $ROUTE_FILE |
| fi |
| } |
| |
| router_test() |
| { |
| local route_count=$1 |
| local should_fail=$2 |
| local delta |
| |
| RET=0 |
| |
| local t0=$(ip route | grep -o 'offload' | wc -l) |
| router_routes_create $route_count |
| delta=$(busywait "$TIMEOUT" wait_for_routes $t0 $route_count) |
| |
| check_err_fail $should_fail $? "Offload routes: Expected $route_count, got $delta." |
| if [[ $RET -ne 0 ]] || [[ $should_fail -eq 1 ]]; then |
| return |
| fi |
| |
| router_routes_destroy |
| } |
| |
| router_cleanup() |
| { |
| pre_cleanup |
| |
| router_routes_destroy |
| router_destroy |
| |
| router_h2_destroy |
| router_h1_destroy |
| |
| vrf_cleanup |
| } |