#!/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 }