Commit f76b9bba authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files

Merge branch 'net-sched-act_tunnel_key-add-support-for-tunnel_dont_fragment'

Davide Caratti says:

====================
net/sched: act_tunnel_key: add support for TUNNEL_DONT_FRAGMENT

- patch 1 extends TC tunnel_key action to add support for TUNNEL_DONT_FRAGMENT
- patch 2 extends tdc to skip tests when iproute2 support is missing
- patch 3 adds a tdc test case to verify functionality of the control plane
- patch 4 adds a net/forwarding test case to verify functionality of the data plane
====================

Link: https://lore.kernel.org/r/cover.1680082990.git.dcaratti@redhat.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents 46e9acb7 533a89b1
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ enum {
					 */
	TCA_TUNNEL_KEY_ENC_TOS,		/* u8 */
	TCA_TUNNEL_KEY_ENC_TTL,		/* u8 */
	TCA_TUNNEL_KEY_NO_FRAG,		/* flag */
	__TCA_TUNNEL_KEY_MAX,
};

+5 −0
Original line number Diff line number Diff line
@@ -420,6 +420,9 @@ static int tunnel_key_init(struct net *net, struct nlattr *nla,
		    nla_get_u8(tb[TCA_TUNNEL_KEY_NO_CSUM]))
			flags &= ~TUNNEL_CSUM;

		if (nla_get_flag(tb[TCA_TUNNEL_KEY_NO_FRAG]))
			flags |= TUNNEL_DONT_FRAGMENT;

		if (tb[TCA_TUNNEL_KEY_ENC_DST_PORT])
			dst_port = nla_get_be16(tb[TCA_TUNNEL_KEY_ENC_DST_PORT]);

@@ -747,6 +750,8 @@ static int tunnel_key_dump(struct sk_buff *skb, struct tc_action *a,
				   key->tp_dst)) ||
		    nla_put_u8(skb, TCA_TUNNEL_KEY_NO_CSUM,
			       !(key->tun_flags & TUNNEL_CSUM)) ||
		    ((key->tun_flags & TUNNEL_DONT_FRAGMENT) &&
		     nla_put_flag(skb, TCA_TUNNEL_KEY_NO_FRAG)) ||
		    tunnel_key_opts_dump(skb, info))
			goto nla_put_failure;

+1 −0
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@ TEST_PROGS = bridge_igmp.sh \
	tc_mpls_l2vpn.sh \
	tc_police.sh \
	tc_shblocks.sh \
	tc_tunnel_key.sh \
	tc_vlan_modify.sh \
	vxlan_asymmetric_ipv6.sh \
	vxlan_asymmetric.sh \
+161 −0
Original line number Diff line number Diff line
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Kselftest framework requirement - SKIP code is 4.
ksft_skip=4

ALL_TESTS="tunnel_key_nofrag_test"

NUM_NETIFS=4
source tc_common.sh
source lib.sh

tcflags="skip_hw"

h1_create()
{
	simple_if_init $h1 192.0.2.1/24
	forwarding_enable
	mtu_set $h1 1500
	tunnel_create h1-et vxlan 192.0.2.1 192.0.2.2 dev $h1 dstport 0 external
	tc qdisc add dev h1-et clsact
	mtu_set h1-et 1230
	mtu_restore $h1
	mtu_set $h1 1000
}

h1_destroy()
{
	tc qdisc del dev h1-et clsact
	tunnel_destroy h1-et
	forwarding_restore
	mtu_restore $h1
	simple_if_fini $h1 192.0.2.1/24
}

h2_create()
{
	simple_if_init $h2 192.0.2.2/24
}

h2_destroy()
{
	simple_if_fini $h2 192.0.2.2/24
}

switch_create()
{
	simple_if_init $swp1 192.0.2.2/24
	tc qdisc add dev $swp1 clsact
	simple_if_init $swp2 192.0.2.1/24
}

switch_destroy()
{
	simple_if_fini $swp2 192.0.2.1/24
	tc qdisc del dev $swp1 clsact
	simple_if_fini $swp1 192.0.2.2/24
}

setup_prepare()
{
	h1=${NETIFS[p1]}
	swp1=${NETIFS[p2]}

	swp2=${NETIFS[p3]}
	h2=${NETIFS[p4]}

	h1mac=$(mac_get $h1)
	h2mac=$(mac_get $h2)

	swp1origmac=$(mac_get $swp1)
	swp2origmac=$(mac_get $swp2)
	ip link set $swp1 address $h2mac
	ip link set $swp2 address $h1mac

	vrf_prepare

	h1_create
	h2_create
	switch_create

	if ! tc action add action tunnel_key help 2>&1 | grep -q nofrag; then
		log_test "SKIP: iproute doesn't support nofrag"
		exit $ksft_skip
	fi
}

cleanup()
{
	pre_cleanup

	switch_destroy
	h2_destroy
	h1_destroy

	vrf_cleanup

	ip link set $swp2 address $swp2origmac
	ip link set $swp1 address $swp1origmac
}

tunnel_key_nofrag_test()
{
	RET=0
	local i

	tc filter add dev $swp1 ingress protocol ip pref 100 handle 100 \
		flower ip_flags nofrag action drop
	tc filter add dev $swp1 ingress protocol ip pref 101 handle 101 \
		flower ip_flags firstfrag action drop
	tc filter add dev $swp1 ingress protocol ip pref 102 handle 102 \
		flower ip_flags nofirstfrag action drop

	# test 'nofrag' set
	tc filter add dev h1-et egress protocol all pref 1 handle 1 matchall $tcflags \
		action tunnel_key set src_ip 192.0.2.1 dst_ip 192.0.2.2 id 42 nofrag index 10
	$MZ h1-et -c 1 -p 930 -a 00:aa:bb:cc:dd:ee -b 00:ee:dd:cc:bb:aa -t ip -q
	tc_check_packets "dev $swp1 ingress" 100 1
	check_err $? "packet smaller than MTU was not tunneled"

	$MZ h1-et -c 1 -p 931 -a 00:aa:bb:cc:dd:ee -b 00:ee:dd:cc:bb:aa -t ip -q
	tc_check_packets "dev $swp1 ingress" 100 1
	check_err $? "packet bigger than MTU matched nofrag (nofrag was set)"
	tc_check_packets "dev $swp1 ingress" 101 0
	check_err $? "packet bigger than MTU matched firstfrag (nofrag was set)"
	tc_check_packets "dev $swp1 ingress" 102 0
	check_err $? "packet bigger than MTU matched nofirstfrag (nofrag was set)"

	# test 'nofrag' cleared
	tc actions change action tunnel_key set src_ip 192.0.2.1 dst_ip 192.0.2.2 id 42 index 10
	$MZ h1-et -c 1 -p 931 -a 00:aa:bb:cc:dd:ee -b 00:ee:dd:cc:bb:aa -t ip -q
	tc_check_packets "dev $swp1  ingress" 100 1
	check_err $? "packet bigger than MTU matched nofrag (nofrag was unset)"
	tc_check_packets "dev $swp1  ingress" 101 1
	check_err $? "packet bigger than MTU didn't match firstfrag (nofrag was unset) "
	tc_check_packets "dev $swp1 ingress" 102 1
	check_err $? "packet bigger than MTU didn't match nofirstfrag (nofrag was unset) "

	for i in 100 101 102; do
		tc filter del dev $swp1 ingress protocol ip pref $i handle $i flower
	done
	tc filter del dev h1-et egress pref 1 handle 1 matchall

	log_test "tunnel_key nofrag ($tcflags)"
}

trap cleanup EXIT

setup_prepare
setup_wait

tests_run

tc_offload_check
if [[ $? -ne 0 ]]; then
	log_info "Could not test offloaded functionality"
else
	tcflags="skip_sw"
	tests_run
fi

exit $EXIT_STATUS
+2 −0
Original line number Diff line number Diff line
@@ -38,6 +38,8 @@ skip: A completely optional key, if the corresponding value is "yes"
              this test case will still appear in the results output but
              marked as skipped. This key can be placed anywhere inside the
              test case at the top level.
dependsOn:    Same as 'skip', but the value is executed as a command. The test
              is skipped when the command returns non-zero.
category:     A list of single-word descriptions covering what the command
              under test is testing. Example: filter, actions, u32, gact, etc.
setup:        The list of commands required to ensure the command under test
Loading