1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3#
4# Test that enough headroom is reserved for the first packet passing through an
5# IPv6 GRE-like netdevice.
6
7setup_prepare()
8{
9	ip link add h1 type veth peer name swp1
10	ip link add h3 type veth peer name swp3
11
12	ip link set dev h1 up
13	ip address add 192.0.2.1/28 dev h1
14
15	ip link add dev vh3 type vrf table 20
16	ip link set dev h3 master vh3
17	ip link set dev vh3 up
18	ip link set dev h3 up
19
20	ip link set dev swp3 up
21	ip address add dev swp3 2001:db8:2::1/64
22	ip address add dev swp3 2001:db8:2::3/64
23
24	ip link set dev swp1 up
25	tc qdisc add dev swp1 clsact
26
27	ip link add name er6 type ip6erspan \
28	   local 2001:db8:2::1 remote 2001:db8:2::2 oseq okey 123
29	ip link set dev er6 up
30
31	ip link add name gt6 type ip6gretap \
32	   local 2001:db8:2::3 remote 2001:db8:2::4
33	ip link set dev gt6 up
34
35	sleep 1
36}
37
38cleanup()
39{
40	ip link del dev gt6
41	ip link del dev er6
42	ip link del dev swp1
43	ip link del dev swp3
44	ip link del dev vh3
45}
46
47test_headroom()
48{
49	local type=$1; shift
50	local tundev=$1; shift
51
52	tc filter add dev swp1 ingress pref 1000 matchall skip_hw \
53		action mirred egress mirror dev $tundev
54	ping -I h1 192.0.2.2 -c 1 -w 2 &> /dev/null
55	tc filter del dev swp1 ingress pref 1000
56
57	# If it doesn't panic, it passes.
58	printf "TEST: %-60s  [PASS]\n" "$type headroom"
59}
60
61trap cleanup EXIT
62
63setup_prepare
64test_headroom ip6gretap gt6
65test_headroom ip6erspan er6
66