168 lines
2.6 KiB
Bash
168 lines
2.6 KiB
Bash
|
#!/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
|
||
|
}
|