#!/bin/bash # SPDX-License-Identifier: GPL-2.0 ROUTER_NUM_NETIFS=4 router_h1_create() { simple_if_init $h1 192.0.1.1/24 ip route add 193.0.0.0/8 via 192.0.1.2 dev $h1 } router_h1_destroy() { ip route del 193.0.0.0/8 via 192.0.1.2 dev $h1 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 } router_offload_validate() { local route_count=$1 local offloaded_count offloaded_count=$(ip route | grep -o 'offload' | wc -l) [[ $offloaded_count -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 via \ 192.0.2.1 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 count=0 RET=0 router_routes_create $route_count router_offload_validate $route_count check_err_fail $should_fail $? "Offload of $route_count routes" if [[ $RET -ne 0 ]] || [[ $should_fail -eq 1 ]]; then return fi tc filter add dev $h2 ingress protocol ip pref 1 flower \ skip_sw dst_ip 193.0.0.0/8 action drop 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 $MZ $h1 -c 1 -p 64 -a $h1mac -b $rp1mac \ -A 192.0.1.1 -B 193.${i}.${j}.${k} \ -t ip -q ((count++)) done done done tc_check_packets "dev $h2 ingress" 1 $route_count check_err $? "Offload mismatch" tc filter del dev $h2 ingress protocol ip pref 1 flower \ skip_sw dst_ip 193.0.0.0/8 action drop router_routes_destroy } router_cleanup() { pre_cleanup router_routes_destroy router_destroy router_h2_destroy router_h1_destroy vrf_cleanup }