162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4.
562306a36Sopenharmony_ciksft_skip=4
662306a36Sopenharmony_ci
762306a36Sopenharmony_ciALL_TESTS="loopback_test"
862306a36Sopenharmony_ciNUM_NETIFS=2
962306a36Sopenharmony_cisource tc_common.sh
1062306a36Sopenharmony_cisource lib.sh
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cih1_create()
1362306a36Sopenharmony_ci{
1462306a36Sopenharmony_ci	simple_if_init $h1 192.0.2.1/24
1562306a36Sopenharmony_ci	tc qdisc add dev $h1 clsact
1662306a36Sopenharmony_ci}
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cih1_destroy()
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	tc qdisc del dev $h1 clsact
2162306a36Sopenharmony_ci	simple_if_fini $h1 192.0.2.1/24
2262306a36Sopenharmony_ci}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cih2_create()
2562306a36Sopenharmony_ci{
2662306a36Sopenharmony_ci	simple_if_init $h2
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cih2_destroy()
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	simple_if_fini $h2
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ciloopback_test()
3562306a36Sopenharmony_ci{
3662306a36Sopenharmony_ci	RET=0
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	tc filter add dev $h1 ingress protocol arp pref 1 handle 101 flower \
3962306a36Sopenharmony_ci		skip_hw arp_op reply arp_tip 192.0.2.1 action drop
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	$MZ $h1 -c 1 -t arp -q
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	tc_check_packets "dev $h1 ingress" 101 1
4462306a36Sopenharmony_ci	check_fail $? "Matched on a filter without loopback setup"
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci	ethtool -K $h1 loopback on
4762306a36Sopenharmony_ci	check_err $? "Failed to enable loopback"
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	setup_wait_dev $h1
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	$MZ $h1 -c 1 -t arp -q
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	tc_check_packets "dev $h1 ingress" 101 1
5462306a36Sopenharmony_ci	check_err $? "Did not match on filter with loopback"
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	ethtool -K $h1 loopback off
5762306a36Sopenharmony_ci	check_err $? "Failed to disable loopback"
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	$MZ $h1 -c 1 -t arp -q
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_ci	tc_check_packets "dev $h1 ingress" 101 2
6262306a36Sopenharmony_ci	check_fail $? "Matched on a filter after loopback was removed"
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	tc filter del dev $h1 ingress protocol arp pref 1 handle 101 flower
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	log_test "loopback"
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cisetup_prepare()
7062306a36Sopenharmony_ci{
7162306a36Sopenharmony_ci	h1=${NETIFS[p1]}
7262306a36Sopenharmony_ci	h2=${NETIFS[p2]}
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	vrf_prepare
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	h1_create
7762306a36Sopenharmony_ci	h2_create
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	if ethtool -k $h1 | grep loopback | grep -q fixed; then
8062306a36Sopenharmony_ci		log_test "SKIP: dev $h1 does not support loopback feature"
8162306a36Sopenharmony_ci		exit $ksft_skip
8262306a36Sopenharmony_ci	fi
8362306a36Sopenharmony_ci}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cicleanup()
8662306a36Sopenharmony_ci{
8762306a36Sopenharmony_ci	pre_cleanup
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	h2_destroy
9062306a36Sopenharmony_ci	h1_destroy
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci	vrf_cleanup
9362306a36Sopenharmony_ci}
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_citrap cleanup EXIT
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cisetup_prepare
9862306a36Sopenharmony_cisetup_wait
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_citests_run
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ciexit $EXIT_STATUS
103