]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests: tc: Add generic erspan_opts matching support for tc-flower
authorLi Shuang <shuali@redhat.com>
Fri, 18 Jul 2025 14:16:12 +0000 (22:16 +0800)
committerJakub Kicinski <kuba@kernel.org>
Mon, 21 Jul 2025 23:12:09 +0000 (16:12 -0700)
Add test cases to tc_flower.sh to validate generic matching on ERSPAN
options. Both ERSPAN Type II and Type III are covered.

Also add check_tc_erspan_support() to verify whether tc supports
erspan_opts.

Signed-off-by: Li Shuang <shuali@redhat.com>
Reviewed-by: Xin Long <lucien.xin@gmail.com>
Link: https://patch.msgid.link/1f354a1afd60f29bbbf02bd60cb52ecfc0b6bd17.1752848172.git.shuali@redhat.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/testing/selftests/net/forwarding/lib.sh
tools/testing/selftests/net/forwarding/tc_flower.sh

index 9308b2f77fedd781a92fb52bf4b6a6dec5fb6134..890b3374dacdac5383956820658257cee49b1b4a 100644 (file)
@@ -142,6 +142,20 @@ check_tc_version()
        fi
 }
 
+check_tc_erspan_support()
+{
+       local dev=$1; shift
+
+       tc filter add dev $dev ingress pref 1 handle 1 flower \
+               erspan_opts 1:0:0:0 &> /dev/null
+       if [[ $? -ne 0 ]]; then
+               echo "SKIP: iproute2 too old; tc is missing erspan support"
+               return $ksft_skip
+       fi
+       tc filter del dev $dev ingress pref 1 handle 1 flower \
+               erspan_opts 1:0:0:0 &> /dev/null
+}
+
 # Old versions of tc don't understand "mpls_uc"
 check_tc_mpls_support()
 {
index b1daad19b01ec7f75cd9d4870db2e3ada26b86b5..b58909a9311298178fdd212994cfc6c62231b415 100755 (executable)
@@ -6,7 +6,7 @@ ALL_TESTS="match_dst_mac_test match_src_mac_test match_dst_ip_test \
        match_ip_tos_test match_indev_test match_ip_ttl_test
        match_mpls_label_test \
        match_mpls_tc_test match_mpls_bos_test match_mpls_ttl_test \
-       match_mpls_lse_test"
+       match_mpls_lse_test match_erspan_opts_test"
 NUM_NETIFS=2
 source tc_common.sh
 source lib.sh
@@ -676,6 +676,56 @@ match_mpls_lse_test()
        log_test "mpls lse match ($tcflags)"
 }
 
+match_erspan_opts_test()
+{
+       RET=0
+
+       check_tc_erspan_support $h2 || return 0
+
+       # h1 erspan setup
+       tunnel_create erspan1 erspan 192.0.2.1 192.0.2.2 dev $h1 seq key 1001 \
+               tos C ttl 64 erspan_ver 1 erspan 6789 # ERSPAN Type II
+       tunnel_create erspan2 erspan 192.0.2.1 192.0.2.2 dev $h1 seq key 1002 \
+               tos C ttl 64 erspan_ver 2 erspan_dir egress erspan_hwid 63 \
+               # ERSPAN Type III
+       ip link set dev erspan1 master v$h1
+       ip link set dev erspan2 master v$h1
+       # h2 erspan setup
+       ip link add ep-ex type erspan ttl 64 external # To collect tunnel info
+       ip link set ep-ex up
+       ip link set dev ep-ex master v$h2
+       tc qdisc add dev ep-ex clsact
+
+       # ERSPAN Type II [decap direction]
+       tc filter add dev ep-ex ingress protocol ip  handle 101 flower \
+               $tcflags enc_src_ip 192.0.2.1 enc_dst_ip 192.0.2.2 \
+               enc_key_id 1001 erspan_opts 1:6789:0:0 \
+               action drop
+       # ERSPAN Type III [decap direction]
+       tc filter add dev ep-ex ingress protocol ip  handle 102 flower \
+               $tcflags enc_src_ip 192.0.2.1 enc_dst_ip 192.0.2.2 \
+               enc_key_id 1002 erspan_opts 2:0:1:63 action drop
+
+       ep1mac=$(mac_get erspan1)
+       $MZ erspan1 -c 1 -p 64 -a $ep1mac -b $h2mac -t ip -q
+       tc_check_packets "dev ep-ex ingress" 101 1
+       check_err $? "ERSPAN Type II"
+
+       ep2mac=$(mac_get erspan2)
+       $MZ erspan2 -c 1 -p 64 -a $ep1mac -b $h2mac -t ip -q
+       tc_check_packets "dev ep-ex ingress" 102 1
+       check_err $? "ERSPAN Type III"
+
+       # h2 erspan cleanup
+       tc qdisc del dev ep-ex clsact
+       tunnel_destroy ep-ex
+       # h1 erspan cleanup
+       tunnel_destroy erspan2 # ERSPAN Type III
+       tunnel_destroy erspan1 # ERSPAN Type II
+
+       log_test "erspan_opts match ($tcflags)"
+}
+
 setup_prepare()
 {
        h1=${NETIFS[p1]}