1611973c1SStefano Brivio#!/bin/sh
2611973c1SStefano Brivio# SPDX-License-Identifier: GPL-2.0
3611973c1SStefano Brivio#
4611973c1SStefano Brivio# nft_concat_range.sh - Tests for sets with concatenation of ranged fields
5611973c1SStefano Brivio#
6611973c1SStefano Brivio# Copyright (c) 2019 Red Hat GmbH
7611973c1SStefano Brivio#
8611973c1SStefano Brivio# Author: Stefano Brivio <sbrivio@redhat.com>
9611973c1SStefano Brivio#
10611973c1SStefano Brivio# shellcheck disable=SC2154,SC2034,SC2016,SC2030,SC2031
11611973c1SStefano Brivio# ^ Configuration and templates sourced with eval, counters reused in subshells
12611973c1SStefano Brivio
13611973c1SStefano BrivioKSELFTEST_SKIP=4
14611973c1SStefano Brivio
15611973c1SStefano Brivio# Available test groups:
160954df70SStefano Brivio# - reported_issues: check for issues that were reported in the past
17611973c1SStefano Brivio# - correctness: check that packets match given entries, and only those
18611973c1SStefano Brivio# - concurrency: attempt races between insertion, deletion and lookup
19611973c1SStefano Brivio# - timeout: check that packets match entries until they expire
20611973c1SStefano Brivio# - performance: estimate matching rate, compare with rbtree and hash baselines
210954df70SStefano BrivioTESTS="reported_issues correctness concurrency timeout"
22611973c1SStefano Brivio[ "${quicktest}" != "1" ] && TESTS="${TESTS} performance"
23611973c1SStefano Brivio
24611973c1SStefano Brivio# Set types, defined by TYPE_ variables below
25611973c1SStefano BrivioTYPES="net_port port_net net6_port port_proto net6_port_mac net6_port_mac_proto
260de53b0fSStefano Brivio       net_port_net net_mac mac_net net_mac_icmp net6_mac_icmp
270de53b0fSStefano Brivio       net6_port_net6_port net_port_mac_proto_net"
28611973c1SStefano Brivio
290954df70SStefano Brivio# Reported bugs, also described by TYPE_ variables below
30eda0cf12SFlorian WestphalBUGS="flush_remove_add reload"
310954df70SStefano Brivio
32611973c1SStefano Brivio# List of possible paths to pktgen script from kernel tree for performance tests
33611973c1SStefano BrivioPKTGEN_SCRIPT_PATHS="
345d79d8afSJie2x Zhou	../../../../samples/pktgen/pktgen_bench_xmit_mode_netif_receive.sh
35611973c1SStefano Brivio	pktgen/pktgen_bench_xmit_mode_netif_receive.sh"
36611973c1SStefano Brivio
37611973c1SStefano Brivio# Definition of set types:
38611973c1SStefano Brivio# display	display text for test report
39611973c1SStefano Brivio# type_spec	nftables set type specifier
40611973c1SStefano Brivio# chain_spec	nftables type specifier for rules mapping to set
41611973c1SStefano Brivio# dst		call sequence of format_*() functions for destination fields
42611973c1SStefano Brivio# src		call sequence of format_*() functions for source fields
43611973c1SStefano Brivio# start		initial integer used to generate addresses and ports
44611973c1SStefano Brivio# count		count of entries to generate and match
45611973c1SStefano Brivio# src_delta	number summed to destination generator for source fields
46611973c1SStefano Brivio# tools		list of tools for correctness and timeout tests, any can be used
47611973c1SStefano Brivio# proto		L4 protocol of test packets
48611973c1SStefano Brivio#
49611973c1SStefano Brivio# race_repeat	race attempts per thread, 0 disables concurrency test for type
50611973c1SStefano Brivio# flood_tools	list of tools for concurrency tests, any can be used
51611973c1SStefano Brivio# flood_proto	L4 protocol of test packets for concurrency tests
52611973c1SStefano Brivio# flood_spec	nftables type specifier for concurrency tests
53611973c1SStefano Brivio#
54611973c1SStefano Brivio# perf_duration	duration of single pktgen injection test
55611973c1SStefano Brivio# perf_spec	nftables type specifier for performance tests
56611973c1SStefano Brivio# perf_dst	format_*() functions for destination fields in performance test
57611973c1SStefano Brivio# perf_src	format_*() functions for source fields in performance test
58611973c1SStefano Brivio# perf_entries	number of set entries for performance test
59611973c1SStefano Brivio# perf_proto	L3 protocol of test packets
60611973c1SStefano BrivioTYPE_net_port="
61611973c1SStefano Briviodisplay		net,port
62611973c1SStefano Briviotype_spec	ipv4_addr . inet_service
63611973c1SStefano Briviochain_spec	ip daddr . udp dport
64611973c1SStefano Briviodst		addr4 port
65611973c1SStefano Briviosrc
66611973c1SStefano Briviostart		1
67611973c1SStefano Briviocount		5
68611973c1SStefano Briviosrc_delta	2000
69611973c1SStefano Briviotools		sendip nc bash
70611973c1SStefano Brivioproto		udp
71611973c1SStefano Brivio
72611973c1SStefano Briviorace_repeat	3
73611973c1SStefano Brivioflood_tools	iperf3 iperf netperf
74611973c1SStefano Brivioflood_proto	udp
75611973c1SStefano Brivioflood_spec	ip daddr . udp dport
76611973c1SStefano Brivio
77611973c1SStefano Brivioperf_duration	5
78611973c1SStefano Brivioperf_spec	ip daddr . udp dport
79611973c1SStefano Brivioperf_dst	addr4 port
80611973c1SStefano Brivioperf_src
81611973c1SStefano Brivioperf_entries	1000
82611973c1SStefano Brivioperf_proto	ipv4
83611973c1SStefano Brivio"
84611973c1SStefano Brivio
85611973c1SStefano BrivioTYPE_port_net="
86611973c1SStefano Briviodisplay		port,net
87611973c1SStefano Briviotype_spec	inet_service . ipv4_addr
88611973c1SStefano Briviochain_spec	udp dport . ip daddr
89611973c1SStefano Briviodst		port addr4
90611973c1SStefano Briviosrc
91611973c1SStefano Briviostart		1
92611973c1SStefano Briviocount		5
93611973c1SStefano Briviosrc_delta	2000
94*25b327d4SFlorian Westphaltools		sendip socat nc bash
95611973c1SStefano Brivioproto		udp
96611973c1SStefano Brivio
97611973c1SStefano Briviorace_repeat	3
98611973c1SStefano Brivioflood_tools	iperf3 iperf netperf
99611973c1SStefano Brivioflood_proto	udp
100611973c1SStefano Brivioflood_spec	udp dport . ip daddr
101611973c1SStefano Brivio
102611973c1SStefano Brivioperf_duration	5
103611973c1SStefano Brivioperf_spec	udp dport . ip daddr
104611973c1SStefano Brivioperf_dst	port addr4
105611973c1SStefano Brivioperf_src
106611973c1SStefano Brivioperf_entries	100
107611973c1SStefano Brivioperf_proto	ipv4
108611973c1SStefano Brivio"
109611973c1SStefano Brivio
110611973c1SStefano BrivioTYPE_net6_port="
111611973c1SStefano Briviodisplay		net6,port
112611973c1SStefano Briviotype_spec	ipv6_addr . inet_service
113611973c1SStefano Briviochain_spec	ip6 daddr . udp dport
114611973c1SStefano Briviodst		addr6 port
115611973c1SStefano Briviosrc
116611973c1SStefano Briviostart		10
117611973c1SStefano Briviocount		5
118611973c1SStefano Briviosrc_delta	2000
119*25b327d4SFlorian Westphaltools		sendip socat nc bash
120611973c1SStefano Brivioproto		udp6
121611973c1SStefano Brivio
122611973c1SStefano Briviorace_repeat	3
123611973c1SStefano Brivioflood_tools	iperf3 iperf netperf
124611973c1SStefano Brivioflood_proto	tcp6
125611973c1SStefano Brivioflood_spec	ip6 daddr . udp dport
126611973c1SStefano Brivio
127611973c1SStefano Brivioperf_duration	5
128611973c1SStefano Brivioperf_spec	ip6 daddr . udp dport
129611973c1SStefano Brivioperf_dst	addr6 port
130611973c1SStefano Brivioperf_src
131611973c1SStefano Brivioperf_entries	1000
132611973c1SStefano Brivioperf_proto	ipv6
133611973c1SStefano Brivio"
134611973c1SStefano Brivio
135611973c1SStefano BrivioTYPE_port_proto="
136611973c1SStefano Briviodisplay		port,proto
137611973c1SStefano Briviotype_spec	inet_service . inet_proto
138611973c1SStefano Briviochain_spec	udp dport . meta l4proto
139611973c1SStefano Briviodst		port proto
140611973c1SStefano Briviosrc
141611973c1SStefano Briviostart		1
142611973c1SStefano Briviocount		5
143611973c1SStefano Briviosrc_delta	2000
144*25b327d4SFlorian Westphaltools		sendip socat nc bash
145611973c1SStefano Brivioproto		udp
146611973c1SStefano Brivio
147611973c1SStefano Briviorace_repeat	0
148611973c1SStefano Brivio
149611973c1SStefano Brivioperf_duration	5
150611973c1SStefano Brivioperf_spec	udp dport . meta l4proto
151611973c1SStefano Brivioperf_dst	port proto
152611973c1SStefano Brivioperf_src
153611973c1SStefano Brivioperf_entries	30000
154611973c1SStefano Brivioperf_proto	ipv4
155611973c1SStefano Brivio"
156611973c1SStefano Brivio
157611973c1SStefano BrivioTYPE_net6_port_mac="
158611973c1SStefano Briviodisplay		net6,port,mac
159611973c1SStefano Briviotype_spec	ipv6_addr . inet_service . ether_addr
160611973c1SStefano Briviochain_spec	ip6 daddr . udp dport . ether saddr
161611973c1SStefano Briviodst		addr6 port
162611973c1SStefano Briviosrc		mac
163611973c1SStefano Briviostart		10
164611973c1SStefano Briviocount		5
165611973c1SStefano Briviosrc_delta	2000
166*25b327d4SFlorian Westphaltools		sendip socat nc bash
167611973c1SStefano Brivioproto		udp6
168611973c1SStefano Brivio
169611973c1SStefano Briviorace_repeat	0
170611973c1SStefano Brivio
171611973c1SStefano Brivioperf_duration	5
172611973c1SStefano Brivioperf_spec	ip6 daddr . udp dport . ether daddr
173611973c1SStefano Brivioperf_dst	addr6 port mac
174611973c1SStefano Brivioperf_src
175611973c1SStefano Brivioperf_entries	10
176611973c1SStefano Brivioperf_proto	ipv6
177611973c1SStefano Brivio"
178611973c1SStefano Brivio
179611973c1SStefano BrivioTYPE_net6_port_mac_proto="
180611973c1SStefano Briviodisplay		net6,port,mac,proto
181611973c1SStefano Briviotype_spec	ipv6_addr . inet_service . ether_addr . inet_proto
182611973c1SStefano Briviochain_spec	ip6 daddr . udp dport . ether saddr . meta l4proto
183611973c1SStefano Briviodst		addr6 port
184611973c1SStefano Briviosrc		mac proto
185611973c1SStefano Briviostart		10
186611973c1SStefano Briviocount		5
187611973c1SStefano Briviosrc_delta	2000
188*25b327d4SFlorian Westphaltools		sendip socat nc bash
189611973c1SStefano Brivioproto		udp6
190611973c1SStefano Brivio
191611973c1SStefano Briviorace_repeat	0
192611973c1SStefano Brivio
193611973c1SStefano Brivioperf_duration	5
194611973c1SStefano Brivioperf_spec	ip6 daddr . udp dport . ether daddr . meta l4proto
195611973c1SStefano Brivioperf_dst	addr6 port mac proto
196611973c1SStefano Brivioperf_src
197611973c1SStefano Brivioperf_entries	1000
198611973c1SStefano Brivioperf_proto	ipv6
199611973c1SStefano Brivio"
200611973c1SStefano Brivio
201611973c1SStefano BrivioTYPE_net_port_net="
202611973c1SStefano Briviodisplay		net,port,net
203611973c1SStefano Briviotype_spec	ipv4_addr . inet_service . ipv4_addr
204611973c1SStefano Briviochain_spec	ip daddr . udp dport . ip saddr
205611973c1SStefano Briviodst		addr4 port
206611973c1SStefano Briviosrc		addr4
207611973c1SStefano Briviostart		1
208611973c1SStefano Briviocount		5
209611973c1SStefano Briviosrc_delta	2000
210*25b327d4SFlorian Westphaltools		sendip socat nc bash
211611973c1SStefano Brivioproto		udp
212611973c1SStefano Brivio
213611973c1SStefano Briviorace_repeat	3
214611973c1SStefano Brivioflood_tools	iperf3 iperf netperf
215611973c1SStefano Brivioflood_proto	tcp
216611973c1SStefano Brivioflood_spec	ip daddr . udp dport . ip saddr
217611973c1SStefano Brivio
218611973c1SStefano Brivioperf_duration	0
219611973c1SStefano Brivio"
220611973c1SStefano Brivio
221611973c1SStefano BrivioTYPE_net6_port_net6_port="
222611973c1SStefano Briviodisplay		net6,port,net6,port
223611973c1SStefano Briviotype_spec	ipv6_addr . inet_service . ipv6_addr . inet_service
224611973c1SStefano Briviochain_spec	ip6 daddr . udp dport . ip6 saddr . udp sport
225611973c1SStefano Briviodst		addr6 port
226611973c1SStefano Briviosrc		addr6 port
227611973c1SStefano Briviostart		10
228611973c1SStefano Briviocount		5
229611973c1SStefano Briviosrc_delta	2000
230*25b327d4SFlorian Westphaltools		sendip socat nc
231611973c1SStefano Brivioproto		udp6
232611973c1SStefano Brivio
233611973c1SStefano Briviorace_repeat	3
234611973c1SStefano Brivioflood_tools	iperf3 iperf netperf
235611973c1SStefano Brivioflood_proto	tcp6
236611973c1SStefano Brivioflood_spec	ip6 daddr . tcp dport . ip6 saddr . tcp sport
237611973c1SStefano Brivio
238611973c1SStefano Brivioperf_duration	0
239611973c1SStefano Brivio"
240611973c1SStefano Brivio
241611973c1SStefano BrivioTYPE_net_port_mac_proto_net="
242611973c1SStefano Briviodisplay		net,port,mac,proto,net
243611973c1SStefano Briviotype_spec	ipv4_addr . inet_service . ether_addr . inet_proto . ipv4_addr
244611973c1SStefano Briviochain_spec	ip daddr . udp dport . ether saddr . meta l4proto . ip saddr
245611973c1SStefano Briviodst		addr4 port
246611973c1SStefano Briviosrc		mac proto addr4
247611973c1SStefano Briviostart		1
248611973c1SStefano Briviocount		5
249611973c1SStefano Briviosrc_delta	2000
250*25b327d4SFlorian Westphaltools		sendip socat nc bash
251611973c1SStefano Brivioproto		udp
252611973c1SStefano Brivio
253611973c1SStefano Briviorace_repeat	0
254611973c1SStefano Brivio
255611973c1SStefano Brivioperf_duration	0
256611973c1SStefano Brivio"
257611973c1SStefano Brivio
258611973c1SStefano BrivioTYPE_net_mac="
259611973c1SStefano Briviodisplay		net,mac
260611973c1SStefano Briviotype_spec	ipv4_addr . ether_addr
261611973c1SStefano Briviochain_spec	ip daddr . ether saddr
262611973c1SStefano Briviodst		addr4
263611973c1SStefano Briviosrc		mac
264611973c1SStefano Briviostart		1
265611973c1SStefano Briviocount		5
266611973c1SStefano Briviosrc_delta	2000
267*25b327d4SFlorian Westphaltools		sendip socat nc bash
268611973c1SStefano Brivioproto		udp
269611973c1SStefano Brivio
270611973c1SStefano Briviorace_repeat	0
271611973c1SStefano Brivio
272611973c1SStefano Brivioperf_duration	5
273611973c1SStefano Brivioperf_spec	ip daddr . ether daddr
274611973c1SStefano Brivioperf_dst	addr4 mac
275611973c1SStefano Brivioperf_src
276611973c1SStefano Brivioperf_entries	1000
277611973c1SStefano Brivioperf_proto	ipv4
278611973c1SStefano Brivio"
279611973c1SStefano Brivio
2800de53b0fSStefano BrivioTYPE_mac_net="
2810de53b0fSStefano Briviodisplay		mac,net
2820de53b0fSStefano Briviotype_spec	ether_addr . ipv4_addr
2830de53b0fSStefano Briviochain_spec	ether saddr . ip saddr
2840de53b0fSStefano Briviodst
2850de53b0fSStefano Briviosrc		mac addr4
2860de53b0fSStefano Briviostart		1
2870de53b0fSStefano Briviocount		5
2880de53b0fSStefano Briviosrc_delta	2000
289*25b327d4SFlorian Westphaltools		sendip socat nc bash
2900de53b0fSStefano Brivioproto		udp
2910de53b0fSStefano Brivio
2920de53b0fSStefano Briviorace_repeat	0
2930de53b0fSStefano Brivio
2940de53b0fSStefano Brivioperf_duration	0
2950de53b0fSStefano Brivio"
2960de53b0fSStefano Brivio
297611973c1SStefano BrivioTYPE_net_mac_icmp="
298611973c1SStefano Briviodisplay		net,mac - ICMP
299611973c1SStefano Briviotype_spec	ipv4_addr . ether_addr
300611973c1SStefano Briviochain_spec	ip daddr . ether saddr
301611973c1SStefano Briviodst		addr4
302611973c1SStefano Briviosrc		mac
303611973c1SStefano Briviostart		1
304611973c1SStefano Briviocount		5
305611973c1SStefano Briviosrc_delta	2000
306611973c1SStefano Briviotools		ping
307611973c1SStefano Brivioproto		icmp
308611973c1SStefano Brivio
309611973c1SStefano Briviorace_repeat	0
310611973c1SStefano Brivio
311611973c1SStefano Brivioperf_duration	0
312611973c1SStefano Brivio"
313611973c1SStefano Brivio
314611973c1SStefano BrivioTYPE_net6_mac_icmp="
315611973c1SStefano Briviodisplay		net6,mac - ICMPv6
316611973c1SStefano Briviotype_spec	ipv6_addr . ether_addr
317611973c1SStefano Briviochain_spec	ip6 daddr . ether saddr
318611973c1SStefano Briviodst		addr6
319611973c1SStefano Briviosrc		mac
320611973c1SStefano Briviostart		10
321611973c1SStefano Briviocount		50
322611973c1SStefano Briviosrc_delta	2000
323611973c1SStefano Briviotools		ping
324611973c1SStefano Brivioproto		icmp6
325611973c1SStefano Brivio
326611973c1SStefano Briviorace_repeat	0
327611973c1SStefano Brivio
328611973c1SStefano Brivioperf_duration	0
329611973c1SStefano Brivio"
330611973c1SStefano Brivio
331611973c1SStefano BrivioTYPE_net_port_proto_net="
332611973c1SStefano Briviodisplay		net,port,proto,net
333611973c1SStefano Briviotype_spec	ipv4_addr . inet_service . inet_proto . ipv4_addr
334611973c1SStefano Briviochain_spec	ip daddr . udp dport . meta l4proto . ip saddr
335611973c1SStefano Briviodst		addr4 port proto
336611973c1SStefano Briviosrc		addr4
337611973c1SStefano Briviostart		1
338611973c1SStefano Briviocount		5
339611973c1SStefano Briviosrc_delta	2000
340*25b327d4SFlorian Westphaltools		sendip socat nc
341611973c1SStefano Brivioproto		udp
342611973c1SStefano Brivio
343611973c1SStefano Briviorace_repeat	3
344611973c1SStefano Brivioflood_tools	iperf3 iperf netperf
345611973c1SStefano Brivioflood_proto	tcp
346611973c1SStefano Brivioflood_spec	ip daddr . tcp dport . meta l4proto . ip saddr
347611973c1SStefano Brivio
348611973c1SStefano Brivioperf_duration	0
349611973c1SStefano Brivio"
350611973c1SStefano Brivio
3510954df70SStefano Brivio# Definition of tests for bugs reported in the past:
3520954df70SStefano Brivio# display	display text for test report
3530954df70SStefano BrivioTYPE_flush_remove_add="
3540954df70SStefano Briviodisplay		Add two elements, flush, re-add
3550954df70SStefano Brivio"
3560954df70SStefano Brivio
357eda0cf12SFlorian WestphalTYPE_reload="
358eda0cf12SFlorian Westphaldisplay		net,mac with reload
359eda0cf12SFlorian Westphaltype_spec	ipv4_addr . ether_addr
360eda0cf12SFlorian Westphalchain_spec	ip daddr . ether saddr
361eda0cf12SFlorian Westphaldst		addr4
362eda0cf12SFlorian Westphalsrc		mac
363eda0cf12SFlorian Westphalstart		1
364eda0cf12SFlorian Westphalcount		1
365eda0cf12SFlorian Westphalsrc_delta	2000
366*25b327d4SFlorian Westphaltools		sendip socat nc bash
367eda0cf12SFlorian Westphalproto		udp
368eda0cf12SFlorian Westphal
369eda0cf12SFlorian Westphalrace_repeat	0
370eda0cf12SFlorian Westphal
371eda0cf12SFlorian Westphalperf_duration	0
372eda0cf12SFlorian Westphal"
373eda0cf12SFlorian Westphal
374611973c1SStefano Brivio# Set template for all tests, types and rules are filled in depending on test
375611973c1SStefano Brivioset_template='
376611973c1SStefano Brivioflush ruleset
377611973c1SStefano Brivio
378611973c1SStefano Briviotable inet filter {
379611973c1SStefano Brivio	counter test {
380611973c1SStefano Brivio		packets 0 bytes 0
381611973c1SStefano Brivio	}
382611973c1SStefano Brivio
383611973c1SStefano Brivio	set test {
384611973c1SStefano Brivio		type ${type_spec}
385611973c1SStefano Brivio		flags interval,timeout
386611973c1SStefano Brivio	}
387611973c1SStefano Brivio
388611973c1SStefano Brivio	chain input {
389611973c1SStefano Brivio		type filter hook prerouting priority 0; policy accept;
390611973c1SStefano Brivio		${chain_spec} @test counter name \"test\"
391611973c1SStefano Brivio	}
392611973c1SStefano Brivio}
393611973c1SStefano Brivio
394611973c1SStefano Briviotable netdev perf {
395611973c1SStefano Brivio	counter test {
396611973c1SStefano Brivio		packets 0 bytes 0
397611973c1SStefano Brivio	}
398611973c1SStefano Brivio
399611973c1SStefano Brivio	counter match {
400611973c1SStefano Brivio		packets 0 bytes 0
401611973c1SStefano Brivio	}
402611973c1SStefano Brivio
403611973c1SStefano Brivio	set test {
404611973c1SStefano Brivio		type ${type_spec}
405611973c1SStefano Brivio		flags interval
406611973c1SStefano Brivio	}
407611973c1SStefano Brivio
408611973c1SStefano Brivio	set norange {
409611973c1SStefano Brivio		type ${type_spec}
410611973c1SStefano Brivio	}
411611973c1SStefano Brivio
412611973c1SStefano Brivio	set noconcat {
413611973c1SStefano Brivio		type ${type_spec%% *}
414611973c1SStefano Brivio		flags interval
415611973c1SStefano Brivio	}
416611973c1SStefano Brivio
417611973c1SStefano Brivio	chain test {
418611973c1SStefano Brivio		type filter hook ingress device veth_a priority 0;
419611973c1SStefano Brivio	}
420611973c1SStefano Brivio}
421611973c1SStefano Brivio'
422611973c1SStefano Brivio
423611973c1SStefano Brivioerr_buf=
424611973c1SStefano Brivioinfo_buf=
425611973c1SStefano Brivio
426611973c1SStefano Brivio# Append string to error buffer
427611973c1SStefano Brivioerr() {
428611973c1SStefano Brivio	err_buf="${err_buf}${1}
429611973c1SStefano Brivio"
430611973c1SStefano Brivio}
431611973c1SStefano Brivio
432611973c1SStefano Brivio# Append string to information buffer
433611973c1SStefano Brivioinfo() {
434611973c1SStefano Brivio	info_buf="${info_buf}${1}
435611973c1SStefano Brivio"
436611973c1SStefano Brivio}
437611973c1SStefano Brivio
438611973c1SStefano Brivio# Flush error buffer to stdout
439611973c1SStefano Brivioerr_flush() {
440611973c1SStefano Brivio	printf "%s" "${err_buf}"
441611973c1SStefano Brivio	err_buf=
442611973c1SStefano Brivio}
443611973c1SStefano Brivio
444611973c1SStefano Brivio# Flush information buffer to stdout
445611973c1SStefano Brivioinfo_flush() {
446611973c1SStefano Brivio	printf "%s" "${info_buf}"
447611973c1SStefano Brivio	info_buf=
448611973c1SStefano Brivio}
449611973c1SStefano Brivio
450611973c1SStefano Brivio# Setup veth pair: this namespace receives traffic, B generates it
451611973c1SStefano Briviosetup_veth() {
452611973c1SStefano Brivio	ip netns add B
453611973c1SStefano Brivio	ip link add veth_a type veth peer name veth_b || return 1
454611973c1SStefano Brivio
455611973c1SStefano Brivio	ip link set veth_a up
456611973c1SStefano Brivio	ip link set veth_b netns B
457611973c1SStefano Brivio
458611973c1SStefano Brivio	ip -n B link set veth_b up
459611973c1SStefano Brivio
460611973c1SStefano Brivio	ip addr add dev veth_a 10.0.0.1
461611973c1SStefano Brivio	ip route add default dev veth_a
462611973c1SStefano Brivio
463611973c1SStefano Brivio	ip -6 addr add fe80::1/64 dev veth_a nodad
464611973c1SStefano Brivio	ip -6 addr add 2001:db8::1/64 dev veth_a nodad
465611973c1SStefano Brivio	ip -6 route add default dev veth_a
466611973c1SStefano Brivio
467611973c1SStefano Brivio	ip -n B route add default dev veth_b
468611973c1SStefano Brivio
469611973c1SStefano Brivio	ip -6 -n B addr add fe80::2/64 dev veth_b nodad
470611973c1SStefano Brivio	ip -6 -n B addr add 2001:db8::2/64 dev veth_b nodad
471611973c1SStefano Brivio	ip -6 -n B route add default dev veth_b
472611973c1SStefano Brivio
473611973c1SStefano Brivio	B() {
474611973c1SStefano Brivio		ip netns exec B "$@" >/dev/null 2>&1
475611973c1SStefano Brivio	}
476611973c1SStefano Brivio
477611973c1SStefano Brivio	sleep 2
478611973c1SStefano Brivio}
479611973c1SStefano Brivio
480611973c1SStefano Brivio# Fill in set template and initialise set
481611973c1SStefano Briviosetup_set() {
482611973c1SStefano Brivio	eval "echo \"${set_template}\"" | nft -f -
483611973c1SStefano Brivio}
484611973c1SStefano Brivio
485611973c1SStefano Brivio# Check that at least one of the needed tools is available
486611973c1SStefano Briviocheck_tools() {
4870954df70SStefano Brivio	[ -z "${tools}" ] && return 0
4880954df70SStefano Brivio
489611973c1SStefano Brivio	__tools=
490611973c1SStefano Brivio	for tool in ${tools}; do
491611973c1SStefano Brivio		if [ "${tool}" = "nc" ] && [ "${proto}" = "udp6" ] && \
492611973c1SStefano Brivio		   ! nc -u -w0 1.1.1.1 1 2>/dev/null; then
493611973c1SStefano Brivio			# Some GNU netcat builds might not support IPv6
494611973c1SStefano Brivio			__tools="${__tools} netcat-openbsd"
495611973c1SStefano Brivio			continue
496611973c1SStefano Brivio		fi
497611973c1SStefano Brivio		__tools="${__tools} ${tool}"
498611973c1SStefano Brivio
499611973c1SStefano Brivio		command -v "${tool}" >/dev/null && return 0
500611973c1SStefano Brivio	done
501611973c1SStefano Brivio	err "need one of:${__tools}, skipping" && return 1
502611973c1SStefano Brivio}
503611973c1SStefano Brivio
504611973c1SStefano Brivio# Set up function to send ICMP packets
505611973c1SStefano Briviosetup_send_icmp() {
506611973c1SStefano Brivio	send_icmp() {
507611973c1SStefano Brivio		B ping -c1 -W1 "${dst_addr4}" >/dev/null 2>&1
508611973c1SStefano Brivio	}
509611973c1SStefano Brivio}
510611973c1SStefano Brivio
511611973c1SStefano Brivio# Set up function to send ICMPv6 packets
512611973c1SStefano Briviosetup_send_icmp6() {
513611973c1SStefano Brivio	if command -v ping6 >/dev/null; then
514611973c1SStefano Brivio		send_icmp6() {
515611973c1SStefano Brivio			ip -6 addr add "${dst_addr6}" dev veth_a nodad \
516611973c1SStefano Brivio				2>/dev/null
517611973c1SStefano Brivio			B ping6 -q -c1 -W1 "${dst_addr6}"
518611973c1SStefano Brivio		}
519611973c1SStefano Brivio	else
520611973c1SStefano Brivio		send_icmp6() {
521611973c1SStefano Brivio			ip -6 addr add "${dst_addr6}" dev veth_a nodad \
522611973c1SStefano Brivio				2>/dev/null
523611973c1SStefano Brivio			B ping -q -6 -c1 -W1 "${dst_addr6}"
524611973c1SStefano Brivio		}
525611973c1SStefano Brivio	fi
526611973c1SStefano Brivio}
527611973c1SStefano Brivio
528611973c1SStefano Brivio# Set up function to send single UDP packets on IPv4
529611973c1SStefano Briviosetup_send_udp() {
530611973c1SStefano Brivio	if command -v sendip >/dev/null; then
531611973c1SStefano Brivio		send_udp() {
532611973c1SStefano Brivio			[ -n "${src_port}" ] && src_port="-us ${src_port}"
533611973c1SStefano Brivio			[ -n "${dst_port}" ] && dst_port="-ud ${dst_port}"
534611973c1SStefano Brivio			[ -n "${src_addr4}" ] && src_addr4="-is ${src_addr4}"
535611973c1SStefano Brivio
536611973c1SStefano Brivio			# shellcheck disable=SC2086 # sendip needs split options
537611973c1SStefano Brivio			B sendip -p ipv4 -p udp ${src_addr4} ${src_port} \
538611973c1SStefano Brivio						${dst_port} "${dst_addr4}"
539611973c1SStefano Brivio
540611973c1SStefano Brivio			src_port=
541611973c1SStefano Brivio			dst_port=
542611973c1SStefano Brivio			src_addr4=
543611973c1SStefano Brivio		}
544*25b327d4SFlorian Westphal	elif command -v socat -v >/dev/null; then
545*25b327d4SFlorian Westphal		send_udp() {
546*25b327d4SFlorian Westphal			if [ -n "${src_addr4}" ]; then
547*25b327d4SFlorian Westphal				B ip addr add "${src_addr4}" dev veth_b
548*25b327d4SFlorian Westphal				__socatbind=",bind=${src_addr4}"
549*25b327d4SFlorian Westphal				if [ -n "${src_port}" ];then
550*25b327d4SFlorian Westphal					__socatbind="${__socatbind}:${src_port}"
551*25b327d4SFlorian Westphal				fi
552*25b327d4SFlorian Westphal			fi
553*25b327d4SFlorian Westphal
554*25b327d4SFlorian Westphal			ip addr add "${dst_addr4}" dev veth_a 2>/dev/null
555*25b327d4SFlorian Westphal			[ -z "${dst_port}" ] && dst_port=12345
556*25b327d4SFlorian Westphal
557*25b327d4SFlorian Westphal			echo "test4" | B socat -t 0.01 STDIN UDP4-DATAGRAM:${dst_addr4}:${dst_port}"${__socatbind}"
558*25b327d4SFlorian Westphal
559*25b327d4SFlorian Westphal			src_addr4=
560*25b327d4SFlorian Westphal			src_port=
561*25b327d4SFlorian Westphal		}
562611973c1SStefano Brivio	elif command -v nc >/dev/null; then
563611973c1SStefano Brivio		if nc -u -w0 1.1.1.1 1 2>/dev/null; then
564611973c1SStefano Brivio			# OpenBSD netcat
565611973c1SStefano Brivio			nc_opt="-w0"
566611973c1SStefano Brivio		else
567611973c1SStefano Brivio			# GNU netcat
568611973c1SStefano Brivio			nc_opt="-q0"
569611973c1SStefano Brivio		fi
570611973c1SStefano Brivio
571611973c1SStefano Brivio		send_udp() {
572611973c1SStefano Brivio			if [ -n "${src_addr4}" ]; then
573611973c1SStefano Brivio				B ip addr add "${src_addr4}" dev veth_b
574611973c1SStefano Brivio				__src_addr4="-s ${src_addr4}"
575611973c1SStefano Brivio			fi
576611973c1SStefano Brivio			ip addr add "${dst_addr4}" dev veth_a 2>/dev/null
577611973c1SStefano Brivio			[ -n "${src_port}" ] && src_port="-p ${src_port}"
578611973c1SStefano Brivio
579611973c1SStefano Brivio			echo "" | B nc -u "${nc_opt}" "${__src_addr4}" \
580611973c1SStefano Brivio				  "${src_port}" "${dst_addr4}" "${dst_port}"
581611973c1SStefano Brivio
582611973c1SStefano Brivio			src_addr4=
583611973c1SStefano Brivio			src_port=
584611973c1SStefano Brivio		}
585611973c1SStefano Brivio	elif [ -z "$(bash -c 'type -p')" ]; then
586611973c1SStefano Brivio		send_udp() {
587611973c1SStefano Brivio			ip addr add "${dst_addr4}" dev veth_a 2>/dev/null
588611973c1SStefano Brivio			if [ -n "${src_addr4}" ]; then
589611973c1SStefano Brivio				B ip addr add "${src_addr4}/16" dev veth_b
590611973c1SStefano Brivio				B ip route add default dev veth_b
591611973c1SStefano Brivio			fi
592611973c1SStefano Brivio
593611973c1SStefano Brivio			B bash -c "echo > /dev/udp/${dst_addr4}/${dst_port}"
594611973c1SStefano Brivio
595611973c1SStefano Brivio			if [ -n "${src_addr4}" ]; then
596611973c1SStefano Brivio				B ip addr del "${src_addr4}/16" dev veth_b
597611973c1SStefano Brivio			fi
598611973c1SStefano Brivio			src_addr4=
599611973c1SStefano Brivio		}
600611973c1SStefano Brivio	else
601611973c1SStefano Brivio		return 1
602611973c1SStefano Brivio	fi
603611973c1SStefano Brivio}
604611973c1SStefano Brivio
605611973c1SStefano Brivio# Set up function to send single UDP packets on IPv6
606611973c1SStefano Briviosetup_send_udp6() {
607611973c1SStefano Brivio	if command -v sendip >/dev/null; then
608611973c1SStefano Brivio		send_udp6() {
609611973c1SStefano Brivio			[ -n "${src_port}" ] && src_port="-us ${src_port}"
610611973c1SStefano Brivio			[ -n "${dst_port}" ] && dst_port="-ud ${dst_port}"
611611973c1SStefano Brivio			if [ -n "${src_addr6}" ]; then
612611973c1SStefano Brivio				src_addr6="-6s ${src_addr6}"
613611973c1SStefano Brivio			else
614611973c1SStefano Brivio				src_addr6="-6s 2001:db8::2"
615611973c1SStefano Brivio			fi
616611973c1SStefano Brivio			ip -6 addr add "${dst_addr6}" dev veth_a nodad \
617611973c1SStefano Brivio				2>/dev/null
618611973c1SStefano Brivio
619611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
620611973c1SStefano Brivio			B sendip -p ipv6 -p udp ${src_addr6} ${src_port} \
621611973c1SStefano Brivio						${dst_port} "${dst_addr6}"
622611973c1SStefano Brivio
623611973c1SStefano Brivio			src_port=
624611973c1SStefano Brivio			dst_port=
625611973c1SStefano Brivio			src_addr6=
626611973c1SStefano Brivio		}
627*25b327d4SFlorian Westphal	elif command -v socat -v >/dev/null; then
628*25b327d4SFlorian Westphal		send_udp6() {
629*25b327d4SFlorian Westphal			ip -6 addr add "${dst_addr6}" dev veth_a nodad \
630*25b327d4SFlorian Westphal				2>/dev/null
631*25b327d4SFlorian Westphal
632*25b327d4SFlorian Westphal			__socatbind6=
633*25b327d4SFlorian Westphal
634*25b327d4SFlorian Westphal			if [ -n "${src_addr6}" ]; then
635*25b327d4SFlorian Westphal				if [ -n "${src_addr6} != "${src_addr6_added} ]; then
636*25b327d4SFlorian Westphal					B ip addr add "${src_addr6}" dev veth_b nodad
637*25b327d4SFlorian Westphal
638*25b327d4SFlorian Westphal					src_addr6_added=${src_addr6}
639*25b327d4SFlorian Westphal				fi
640*25b327d4SFlorian Westphal
641*25b327d4SFlorian Westphal				__socatbind6=",bind=[${src_addr6}]"
642*25b327d4SFlorian Westphal
643*25b327d4SFlorian Westphal				if [ -n "${src_port}" ] ;then
644*25b327d4SFlorian Westphal					__socatbind6="${__socatbind6}:${src_port}"
645*25b327d4SFlorian Westphal				fi
646*25b327d4SFlorian Westphal			fi
647*25b327d4SFlorian Westphal
648*25b327d4SFlorian Westphal			echo "test6" | B socat -t 0.01 STDIN UDP6-DATAGRAM:[${dst_addr6}]:${dst_port}"${__socatbind6}"
649*25b327d4SFlorian Westphal		}
650611973c1SStefano Brivio	elif command -v nc >/dev/null && nc -u -w0 1.1.1.1 1 2>/dev/null; then
651611973c1SStefano Brivio		# GNU netcat might not work with IPv6, try next tool
652611973c1SStefano Brivio		send_udp6() {
653611973c1SStefano Brivio			ip -6 addr add "${dst_addr6}" dev veth_a nodad \
654611973c1SStefano Brivio				2>/dev/null
655611973c1SStefano Brivio			if [ -n "${src_addr6}" ]; then
656611973c1SStefano Brivio				B ip addr add "${src_addr6}" dev veth_b nodad
657611973c1SStefano Brivio			else
658611973c1SStefano Brivio				src_addr6="2001:db8::2"
659611973c1SStefano Brivio			fi
660611973c1SStefano Brivio			[ -n "${src_port}" ] && src_port="-p ${src_port}"
661611973c1SStefano Brivio
662611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
663611973c1SStefano Brivio			echo "" | B nc -u w0 "-s${src_addr6}" ${src_port} \
664611973c1SStefano Brivio					       ${dst_addr6} ${dst_port}
665611973c1SStefano Brivio
666611973c1SStefano Brivio			src_addr6=
667611973c1SStefano Brivio			src_port=
668611973c1SStefano Brivio		}
669611973c1SStefano Brivio	elif [ -z "$(bash -c 'type -p')" ]; then
670611973c1SStefano Brivio		send_udp6() {
671611973c1SStefano Brivio			ip -6 addr add "${dst_addr6}" dev veth_a nodad \
672611973c1SStefano Brivio				2>/dev/null
673611973c1SStefano Brivio			B ip addr add "${src_addr6}" dev veth_b nodad
674611973c1SStefano Brivio			B bash -c "echo > /dev/udp/${dst_addr6}/${dst_port}"
675611973c1SStefano Brivio			ip -6 addr del "${dst_addr6}" dev veth_a 2>/dev/null
676611973c1SStefano Brivio		}
677611973c1SStefano Brivio	else
678611973c1SStefano Brivio		return 1
679611973c1SStefano Brivio	fi
680611973c1SStefano Brivio}
681611973c1SStefano Brivio
682611973c1SStefano Brivio# Set up function to send TCP traffic on IPv4
683611973c1SStefano Briviosetup_flood_tcp() {
684611973c1SStefano Brivio	if command -v iperf3 >/dev/null; then
685611973c1SStefano Brivio		flood_tcp() {
686611973c1SStefano Brivio			[ -n "${dst_port}" ] && dst_port="-p ${dst_port}"
687611973c1SStefano Brivio			if [ -n "${src_addr4}" ]; then
688611973c1SStefano Brivio				B ip addr add "${src_addr4}/16" dev veth_b
689611973c1SStefano Brivio				src_addr4="-B ${src_addr4}"
690611973c1SStefano Brivio			else
691611973c1SStefano Brivio				B ip addr add dev veth_b 10.0.0.2
692611973c1SStefano Brivio				src_addr4="-B 10.0.0.2"
693611973c1SStefano Brivio			fi
694611973c1SStefano Brivio			if [ -n "${src_port}" ]; then
695611973c1SStefano Brivio				src_port="--cport ${src_port}"
696611973c1SStefano Brivio			fi
697611973c1SStefano Brivio			B ip route add default dev veth_b 2>/dev/null
698611973c1SStefano Brivio			ip addr add "${dst_addr4}" dev veth_a 2>/dev/null
699611973c1SStefano Brivio
700611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
701611973c1SStefano Brivio			iperf3 -s -DB "${dst_addr4}" ${dst_port} >/dev/null 2>&1
702611973c1SStefano Brivio			sleep 2
703611973c1SStefano Brivio
704611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
705611973c1SStefano Brivio			B iperf3 -c "${dst_addr4}" ${dst_port} ${src_port} \
706611973c1SStefano Brivio				${src_addr4} -l16 -t 1000
707611973c1SStefano Brivio
708611973c1SStefano Brivio			src_addr4=
709611973c1SStefano Brivio			src_port=
710611973c1SStefano Brivio			dst_port=
711611973c1SStefano Brivio		}
712611973c1SStefano Brivio	elif command -v iperf >/dev/null; then
713611973c1SStefano Brivio		flood_tcp() {
714611973c1SStefano Brivio			[ -n "${dst_port}" ] && dst_port="-p ${dst_port}"
715611973c1SStefano Brivio			if [ -n "${src_addr4}" ]; then
716611973c1SStefano Brivio				B ip addr add "${src_addr4}/16" dev veth_b
717611973c1SStefano Brivio				src_addr4="-B ${src_addr4}"
718611973c1SStefano Brivio			else
719611973c1SStefano Brivio				B ip addr add dev veth_b 10.0.0.2 2>/dev/null
720611973c1SStefano Brivio				src_addr4="-B 10.0.0.2"
721611973c1SStefano Brivio			fi
722611973c1SStefano Brivio			if [ -n "${src_port}" ]; then
723611973c1SStefano Brivio				src_addr4="${src_addr4}:${src_port}"
724611973c1SStefano Brivio			fi
725611973c1SStefano Brivio			B ip route add default dev veth_b
726611973c1SStefano Brivio			ip addr add "${dst_addr4}" dev veth_a 2>/dev/null
727611973c1SStefano Brivio
728611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
729611973c1SStefano Brivio			iperf -s -DB "${dst_addr4}" ${dst_port} >/dev/null 2>&1
730611973c1SStefano Brivio			sleep 2
731611973c1SStefano Brivio
732611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
733611973c1SStefano Brivio			B iperf -c "${dst_addr4}" ${dst_port} ${src_addr4} \
734611973c1SStefano Brivio				-l20 -t 1000
735611973c1SStefano Brivio
736611973c1SStefano Brivio			src_addr4=
737611973c1SStefano Brivio			src_port=
738611973c1SStefano Brivio			dst_port=
739611973c1SStefano Brivio		}
740611973c1SStefano Brivio	elif command -v netperf >/dev/null; then
741611973c1SStefano Brivio		flood_tcp() {
742611973c1SStefano Brivio			[ -n "${dst_port}" ] && dst_port="-p ${dst_port}"
743611973c1SStefano Brivio			if [ -n "${src_addr4}" ]; then
744611973c1SStefano Brivio				B ip addr add "${src_addr4}/16" dev veth_b
745611973c1SStefano Brivio			else
746611973c1SStefano Brivio				B ip addr add dev veth_b 10.0.0.2
747611973c1SStefano Brivio				src_addr4="10.0.0.2"
748611973c1SStefano Brivio			fi
749611973c1SStefano Brivio			if [ -n "${src_port}" ]; then
750611973c1SStefano Brivio				dst_port="${dst_port},${src_port}"
751611973c1SStefano Brivio			fi
752611973c1SStefano Brivio			B ip route add default dev veth_b
753611973c1SStefano Brivio			ip addr add "${dst_addr4}" dev veth_a 2>/dev/null
754611973c1SStefano Brivio
755611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
756611973c1SStefano Brivio			netserver -4 ${dst_port} -L "${dst_addr4}" \
757611973c1SStefano Brivio				>/dev/null 2>&1
758611973c1SStefano Brivio			sleep 2
759611973c1SStefano Brivio
760611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
761611973c1SStefano Brivio			B netperf -4 -H "${dst_addr4}" ${dst_port} \
762611973c1SStefano Brivio				-L "${src_addr4}" -l 1000 -t TCP_STREAM
763611973c1SStefano Brivio
764611973c1SStefano Brivio			src_addr4=
765611973c1SStefano Brivio			src_port=
766611973c1SStefano Brivio			dst_port=
767611973c1SStefano Brivio		}
768611973c1SStefano Brivio	else
769611973c1SStefano Brivio		return 1
770611973c1SStefano Brivio	fi
771611973c1SStefano Brivio}
772611973c1SStefano Brivio
773611973c1SStefano Brivio# Set up function to send TCP traffic on IPv6
774611973c1SStefano Briviosetup_flood_tcp6() {
775611973c1SStefano Brivio	if command -v iperf3 >/dev/null; then
776611973c1SStefano Brivio		flood_tcp6() {
777611973c1SStefano Brivio			[ -n "${dst_port}" ] && dst_port="-p ${dst_port}"
778611973c1SStefano Brivio			if [ -n "${src_addr6}" ]; then
779611973c1SStefano Brivio				B ip addr add "${src_addr6}" dev veth_b nodad
780611973c1SStefano Brivio				src_addr6="-B ${src_addr6}"
781611973c1SStefano Brivio			else
782611973c1SStefano Brivio				src_addr6="-B 2001:db8::2"
783611973c1SStefano Brivio			fi
784611973c1SStefano Brivio			if [ -n "${src_port}" ]; then
785611973c1SStefano Brivio				src_port="--cport ${src_port}"
786611973c1SStefano Brivio			fi
787611973c1SStefano Brivio			B ip route add default dev veth_b
788611973c1SStefano Brivio			ip -6 addr add "${dst_addr6}" dev veth_a nodad \
789611973c1SStefano Brivio				2>/dev/null
790611973c1SStefano Brivio
791611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
792611973c1SStefano Brivio			iperf3 -s -DB "${dst_addr6}" ${dst_port} >/dev/null 2>&1
793611973c1SStefano Brivio			sleep 2
794611973c1SStefano Brivio
795611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
796611973c1SStefano Brivio			B iperf3 -c "${dst_addr6}" ${dst_port} \
797611973c1SStefano Brivio				${src_port} ${src_addr6} -l16 -t 1000
798611973c1SStefano Brivio
799611973c1SStefano Brivio			src_addr6=
800611973c1SStefano Brivio			src_port=
801611973c1SStefano Brivio			dst_port=
802611973c1SStefano Brivio		}
803611973c1SStefano Brivio	elif command -v iperf >/dev/null; then
804611973c1SStefano Brivio		flood_tcp6() {
805611973c1SStefano Brivio			[ -n "${dst_port}" ] && dst_port="-p ${dst_port}"
806611973c1SStefano Brivio			if [ -n "${src_addr6}" ]; then
807611973c1SStefano Brivio				B ip addr add "${src_addr6}" dev veth_b nodad
808611973c1SStefano Brivio				src_addr6="-B ${src_addr6}"
809611973c1SStefano Brivio			else
810611973c1SStefano Brivio				src_addr6="-B 2001:db8::2"
811611973c1SStefano Brivio			fi
812611973c1SStefano Brivio			if [ -n "${src_port}" ]; then
813611973c1SStefano Brivio				src_addr6="${src_addr6}:${src_port}"
814611973c1SStefano Brivio			fi
815611973c1SStefano Brivio			B ip route add default dev veth_b
816611973c1SStefano Brivio			ip -6 addr add "${dst_addr6}" dev veth_a nodad \
817611973c1SStefano Brivio				2>/dev/null
818611973c1SStefano Brivio
819611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
820611973c1SStefano Brivio			iperf -s -VDB "${dst_addr6}" ${dst_port} >/dev/null 2>&1
821611973c1SStefano Brivio			sleep 2
822611973c1SStefano Brivio
823611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
824611973c1SStefano Brivio			B iperf -c "${dst_addr6}" -V ${dst_port} \
825611973c1SStefano Brivio				${src_addr6} -l1 -t 1000
826611973c1SStefano Brivio
827611973c1SStefano Brivio			src_addr6=
828611973c1SStefano Brivio			src_port=
829611973c1SStefano Brivio			dst_port=
830611973c1SStefano Brivio		}
831611973c1SStefano Brivio	elif command -v netperf >/dev/null; then
832611973c1SStefano Brivio		flood_tcp6() {
833611973c1SStefano Brivio			[ -n "${dst_port}" ] && dst_port="-p ${dst_port}"
834611973c1SStefano Brivio			if [ -n "${src_addr6}" ]; then
835611973c1SStefano Brivio				B ip addr add "${src_addr6}" dev veth_b nodad
836611973c1SStefano Brivio			else
837611973c1SStefano Brivio				src_addr6="2001:db8::2"
838611973c1SStefano Brivio			fi
839611973c1SStefano Brivio			if [ -n "${src_port}" ]; then
840611973c1SStefano Brivio				dst_port="${dst_port},${src_port}"
841611973c1SStefano Brivio			fi
842611973c1SStefano Brivio			B ip route add default dev veth_b
843611973c1SStefano Brivio			ip -6 addr add "${dst_addr6}" dev veth_a nodad \
844611973c1SStefano Brivio				2>/dev/null
845611973c1SStefano Brivio
846611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
847611973c1SStefano Brivio			netserver -6 ${dst_port} -L "${dst_addr6}" \
848611973c1SStefano Brivio				>/dev/null 2>&1
849611973c1SStefano Brivio			sleep 2
850611973c1SStefano Brivio
851611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
852611973c1SStefano Brivio			B netperf -6 -H "${dst_addr6}" ${dst_port} \
853611973c1SStefano Brivio				-L "${src_addr6}" -l 1000 -t TCP_STREAM
854611973c1SStefano Brivio
855611973c1SStefano Brivio			src_addr6=
856611973c1SStefano Brivio			src_port=
857611973c1SStefano Brivio			dst_port=
858611973c1SStefano Brivio		}
859611973c1SStefano Brivio	else
860611973c1SStefano Brivio		return 1
861611973c1SStefano Brivio	fi
862611973c1SStefano Brivio}
863611973c1SStefano Brivio
864611973c1SStefano Brivio# Set up function to send UDP traffic on IPv4
865611973c1SStefano Briviosetup_flood_udp() {
866611973c1SStefano Brivio	if command -v iperf3 >/dev/null; then
867611973c1SStefano Brivio		flood_udp() {
868611973c1SStefano Brivio			[ -n "${dst_port}" ] && dst_port="-p ${dst_port}"
869611973c1SStefano Brivio			if [ -n "${src_addr4}" ]; then
870611973c1SStefano Brivio				B ip addr add "${src_addr4}/16" dev veth_b
871611973c1SStefano Brivio				src_addr4="-B ${src_addr4}"
872611973c1SStefano Brivio			else
873611973c1SStefano Brivio				B ip addr add dev veth_b 10.0.0.2 2>/dev/null
874611973c1SStefano Brivio				src_addr4="-B 10.0.0.2"
875611973c1SStefano Brivio			fi
876611973c1SStefano Brivio			if [ -n "${src_port}" ]; then
877611973c1SStefano Brivio				src_port="--cport ${src_port}"
878611973c1SStefano Brivio			fi
879611973c1SStefano Brivio			B ip route add default dev veth_b
880611973c1SStefano Brivio			ip addr add "${dst_addr4}" dev veth_a 2>/dev/null
881611973c1SStefano Brivio
882611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
883611973c1SStefano Brivio			iperf3 -s -DB "${dst_addr4}" ${dst_port}
884611973c1SStefano Brivio			sleep 2
885611973c1SStefano Brivio
886611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
887611973c1SStefano Brivio			B iperf3 -u -c "${dst_addr4}" -Z -b 100M -l16 -t1000 \
888611973c1SStefano Brivio				${dst_port} ${src_port} ${src_addr4}
889611973c1SStefano Brivio
890611973c1SStefano Brivio			src_addr4=
891611973c1SStefano Brivio			src_port=
892611973c1SStefano Brivio			dst_port=
893611973c1SStefano Brivio		}
894611973c1SStefano Brivio	elif command -v iperf >/dev/null; then
895611973c1SStefano Brivio		flood_udp() {
896611973c1SStefano Brivio			[ -n "${dst_port}" ] && dst_port="-p ${dst_port}"
897611973c1SStefano Brivio			if [ -n "${src_addr4}" ]; then
898611973c1SStefano Brivio				B ip addr add "${src_addr4}/16" dev veth_b
899611973c1SStefano Brivio				src_addr4="-B ${src_addr4}"
900611973c1SStefano Brivio			else
901611973c1SStefano Brivio				B ip addr add dev veth_b 10.0.0.2
902611973c1SStefano Brivio				src_addr4="-B 10.0.0.2"
903611973c1SStefano Brivio			fi
904611973c1SStefano Brivio			if [ -n "${src_port}" ]; then
905611973c1SStefano Brivio				src_addr4="${src_addr4}:${src_port}"
906611973c1SStefano Brivio			fi
907611973c1SStefano Brivio			B ip route add default dev veth_b
908611973c1SStefano Brivio			ip addr add "${dst_addr4}" dev veth_a 2>/dev/null
909611973c1SStefano Brivio
910611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
911611973c1SStefano Brivio			iperf -u -sDB "${dst_addr4}" ${dst_port} >/dev/null 2>&1
912611973c1SStefano Brivio			sleep 2
913611973c1SStefano Brivio
914611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
915611973c1SStefano Brivio			B iperf -u -c "${dst_addr4}" -b 100M -l1 -t1000 \
916611973c1SStefano Brivio				${dst_port} ${src_addr4}
917611973c1SStefano Brivio
918611973c1SStefano Brivio			src_addr4=
919611973c1SStefano Brivio			src_port=
920611973c1SStefano Brivio			dst_port=
921611973c1SStefano Brivio		}
922611973c1SStefano Brivio	elif command -v netperf >/dev/null; then
923611973c1SStefano Brivio		flood_udp() {
924611973c1SStefano Brivio			[ -n "${dst_port}" ] && dst_port="-p ${dst_port}"
925611973c1SStefano Brivio			if [ -n "${src_addr4}" ]; then
926611973c1SStefano Brivio				B ip addr add "${src_addr4}/16" dev veth_b
927611973c1SStefano Brivio			else
928611973c1SStefano Brivio				B ip addr add dev veth_b 10.0.0.2
929611973c1SStefano Brivio				src_addr4="10.0.0.2"
930611973c1SStefano Brivio			fi
931611973c1SStefano Brivio			if [ -n "${src_port}" ]; then
932611973c1SStefano Brivio				dst_port="${dst_port},${src_port}"
933611973c1SStefano Brivio			fi
934611973c1SStefano Brivio			B ip route add default dev veth_b
935611973c1SStefano Brivio			ip addr add "${dst_addr4}" dev veth_a 2>/dev/null
936611973c1SStefano Brivio
937611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
938611973c1SStefano Brivio			netserver -4 ${dst_port} -L "${dst_addr4}" \
939611973c1SStefano Brivio				>/dev/null 2>&1
940611973c1SStefano Brivio			sleep 2
941611973c1SStefano Brivio
942611973c1SStefano Brivio			# shellcheck disable=SC2086 # this needs split options
943611973c1SStefano Brivio			B netperf -4 -H "${dst_addr4}" ${dst_port} \
944611973c1SStefano Brivio				-L "${src_addr4}" -l 1000 -t UDP_STREAM
945611973c1SStefano Brivio
946611973c1SStefano Brivio			src_addr4=
947611973c1SStefano Brivio			src_port=
948611973c1SStefano Brivio			dst_port=
949611973c1SStefano Brivio		}
950611973c1SStefano Brivio	else
951611973c1SStefano Brivio		return 1
952611973c1SStefano Brivio	fi
953611973c1SStefano Brivio}
954611973c1SStefano Brivio
955611973c1SStefano Brivio# Find pktgen script and set up function to start pktgen injection
956611973c1SStefano Briviosetup_perf() {
957611973c1SStefano Brivio	for pktgen_script_path in ${PKTGEN_SCRIPT_PATHS} __notfound; do
958611973c1SStefano Brivio		command -v "${pktgen_script_path}" >/dev/null && break
959611973c1SStefano Brivio	done
960611973c1SStefano Brivio	[ "${pktgen_script_path}" = "__notfound" ] && return 1
961611973c1SStefano Brivio
962611973c1SStefano Brivio	perf_ipv4() {
963611973c1SStefano Brivio		${pktgen_script_path} -s80 \
964611973c1SStefano Brivio			-i veth_a -d "${dst_addr4}" -p "${dst_port}" \
965611973c1SStefano Brivio			-m "${dst_mac}" \
966611973c1SStefano Brivio			-t $(($(nproc) / 5 + 1)) -b10000 -n0 2>/dev/null &
967611973c1SStefano Brivio		perf_pid=$!
968611973c1SStefano Brivio	}
969611973c1SStefano Brivio	perf_ipv6() {
970611973c1SStefano Brivio		IP6=6 ${pktgen_script_path} -s100 \
971611973c1SStefano Brivio			-i veth_a -d "${dst_addr6}" -p "${dst_port}" \
972611973c1SStefano Brivio			-m "${dst_mac}" \
973611973c1SStefano Brivio			-t $(($(nproc) / 5 + 1)) -b10000 -n0 2>/dev/null &
974611973c1SStefano Brivio		perf_pid=$!
975611973c1SStefano Brivio	}
976611973c1SStefano Brivio}
977611973c1SStefano Brivio
978611973c1SStefano Brivio# Clean up before each test
979611973c1SStefano Briviocleanup() {
980611973c1SStefano Brivio	nft reset counter inet filter test	>/dev/null 2>&1
981611973c1SStefano Brivio	nft flush ruleset			>/dev/null 2>&1
982611973c1SStefano Brivio	ip link del dummy0			2>/dev/null
983611973c1SStefano Brivio	ip route del default			2>/dev/null
984611973c1SStefano Brivio	ip -6 route del default			2>/dev/null
985611973c1SStefano Brivio	ip netns del B				2>/dev/null
986611973c1SStefano Brivio	ip link del veth_a			2>/dev/null
987611973c1SStefano Brivio	timeout=
988611973c1SStefano Brivio	killall iperf3				2>/dev/null
989611973c1SStefano Brivio	killall iperf				2>/dev/null
990611973c1SStefano Brivio	killall netperf				2>/dev/null
991611973c1SStefano Brivio	killall netserver			2>/dev/null
992611973c1SStefano Brivio	rm -f ${tmp}
993611973c1SStefano Brivio	sleep 2
994611973c1SStefano Brivio}
995611973c1SStefano Brivio
996611973c1SStefano Brivio# Entry point for setup functions
997611973c1SStefano Briviosetup() {
998611973c1SStefano Brivio	if [ "$(id -u)" -ne 0 ]; then
999611973c1SStefano Brivio		echo "  need to run as root"
1000611973c1SStefano Brivio		exit ${KSELFTEST_SKIP}
1001611973c1SStefano Brivio	fi
1002611973c1SStefano Brivio
1003611973c1SStefano Brivio	cleanup
1004611973c1SStefano Brivio	check_tools || return 1
1005611973c1SStefano Brivio	for arg do
1006611973c1SStefano Brivio		if ! eval setup_"${arg}"; then
1007611973c1SStefano Brivio			err "  ${arg} not supported"
1008611973c1SStefano Brivio			return 1
1009611973c1SStefano Brivio		fi
1010611973c1SStefano Brivio	done
1011611973c1SStefano Brivio}
1012611973c1SStefano Brivio
1013611973c1SStefano Brivio# Format integer into IPv4 address, summing 10.0.0.5 (arbitrary) to it
1014611973c1SStefano Brivioformat_addr4() {
1015611973c1SStefano Brivio	a=$((${1} + 16777216 * 10 + 5))
1016611973c1SStefano Brivio	printf "%i.%i.%i.%i"						\
1017611973c1SStefano Brivio	       "$((a / 16777216))" "$((a % 16777216 / 65536))"	\
1018611973c1SStefano Brivio	       "$((a % 65536 / 256))" "$((a % 256))"
1019611973c1SStefano Brivio}
1020611973c1SStefano Brivio
1021611973c1SStefano Brivio# Format integer into IPv6 address, summing 2001:db8:: to it
1022611973c1SStefano Brivioformat_addr6() {
1023611973c1SStefano Brivio	printf "2001:db8::%04x:%04x" "$((${1} / 65536))" "$((${1} % 65536))"
1024611973c1SStefano Brivio}
1025611973c1SStefano Brivio
1026611973c1SStefano Brivio# Format integer into EUI-48 address, summing 00:01:00:00:00:00 to it
1027611973c1SStefano Brivioformat_mac() {
1028611973c1SStefano Brivio	printf "00:01:%02x:%02x:%02x:%02x" \
1029611973c1SStefano Brivio	       "$((${1} / 16777216))" "$((${1} % 16777216 / 65536))"	\
1030611973c1SStefano Brivio	       "$((${1} % 65536 / 256))" "$((${1} % 256))"
1031611973c1SStefano Brivio}
1032611973c1SStefano Brivio
1033611973c1SStefano Brivio# Format integer into port, avoid 0 port
1034611973c1SStefano Brivioformat_port() {
1035611973c1SStefano Brivio	printf "%i" "$((${1} % 65534 + 1))"
1036611973c1SStefano Brivio}
1037611973c1SStefano Brivio
1038611973c1SStefano Brivio# Drop suffixed '6' from L4 protocol, if any
1039611973c1SStefano Brivioformat_proto() {
1040611973c1SStefano Brivio	printf "%s" "${proto}" | tr -d 6
1041611973c1SStefano Brivio}
1042611973c1SStefano Brivio
1043611973c1SStefano Brivio# Format destination and source fields into nft concatenated type
1044611973c1SStefano Brivioformat() {
1045611973c1SStefano Brivio	__start=
1046611973c1SStefano Brivio	__end=
1047611973c1SStefano Brivio	__expr="{ "
1048611973c1SStefano Brivio
1049611973c1SStefano Brivio	for f in ${dst}; do
1050611973c1SStefano Brivio		[ "${__expr}" != "{ " ] && __expr="${__expr} . "
1051611973c1SStefano Brivio
1052611973c1SStefano Brivio		__start="$(eval format_"${f}" "${start}")"
1053611973c1SStefano Brivio		__end="$(eval format_"${f}" "${end}")"
1054611973c1SStefano Brivio
1055611973c1SStefano Brivio		if [ "${f}" = "proto" ]; then
1056611973c1SStefano Brivio			__expr="${__expr}${__start}"
1057611973c1SStefano Brivio		else
1058611973c1SStefano Brivio			__expr="${__expr}${__start}-${__end}"
1059611973c1SStefano Brivio		fi
1060611973c1SStefano Brivio	done
1061611973c1SStefano Brivio	for f in ${src}; do
10620de53b0fSStefano Brivio		[ "${__expr}" != "{ " ] && __expr="${__expr} . "
10630de53b0fSStefano Brivio
1064611973c1SStefano Brivio		__start="$(eval format_"${f}" "${srcstart}")"
1065611973c1SStefano Brivio		__end="$(eval format_"${f}" "${srcend}")"
1066611973c1SStefano Brivio
1067611973c1SStefano Brivio		if [ "${f}" = "proto" ]; then
1068611973c1SStefano Brivio			__expr="${__expr}${__start}"
1069611973c1SStefano Brivio		else
1070611973c1SStefano Brivio			__expr="${__expr}${__start}-${__end}"
1071611973c1SStefano Brivio		fi
1072611973c1SStefano Brivio	done
1073611973c1SStefano Brivio
1074611973c1SStefano Brivio	if [ -n "${timeout}" ]; then
1075611973c1SStefano Brivio		echo "${__expr} timeout ${timeout}s }"
1076611973c1SStefano Brivio	else
1077611973c1SStefano Brivio		echo "${__expr} }"
1078611973c1SStefano Brivio	fi
1079611973c1SStefano Brivio}
1080611973c1SStefano Brivio
1081611973c1SStefano Brivio# Format destination and source fields into nft type, start element only
1082611973c1SStefano Brivioformat_norange() {
1083611973c1SStefano Brivio	__expr="{ "
1084611973c1SStefano Brivio
1085611973c1SStefano Brivio	for f in ${dst}; do
1086611973c1SStefano Brivio		[ "${__expr}" != "{ " ] && __expr="${__expr} . "
1087611973c1SStefano Brivio
1088611973c1SStefano Brivio		__expr="${__expr}$(eval format_"${f}" "${start}")"
1089611973c1SStefano Brivio	done
1090611973c1SStefano Brivio	for f in ${src}; do
1091611973c1SStefano Brivio		__expr="${__expr} . $(eval format_"${f}" "${start}")"
1092611973c1SStefano Brivio	done
1093611973c1SStefano Brivio
1094611973c1SStefano Brivio	echo "${__expr} }"
1095611973c1SStefano Brivio}
1096611973c1SStefano Brivio
1097611973c1SStefano Brivio# Format first destination field into nft type
1098611973c1SStefano Brivioformat_noconcat() {
1099611973c1SStefano Brivio	for f in ${dst}; do
1100611973c1SStefano Brivio		__start="$(eval format_"${f}" "${start}")"
1101611973c1SStefano Brivio		__end="$(eval format_"${f}" "${end}")"
1102611973c1SStefano Brivio
1103611973c1SStefano Brivio		if [ "${f}" = "proto" ]; then
1104611973c1SStefano Brivio			echo "{ ${__start} }"
1105611973c1SStefano Brivio		else
1106611973c1SStefano Brivio			echo "{ ${__start}-${__end} }"
1107611973c1SStefano Brivio		fi
1108611973c1SStefano Brivio		return
1109611973c1SStefano Brivio	done
1110611973c1SStefano Brivio}
1111611973c1SStefano Brivio
1112611973c1SStefano Brivio# Add single entry to 'test' set in 'inet filter' table
1113611973c1SStefano Brivioadd() {
1114611973c1SStefano Brivio	if ! nft add element inet filter test "${1}"; then
1115611973c1SStefano Brivio		err "Failed to add ${1} given ruleset:"
1116d0820556SStefano Brivio		err "$(nft -a list ruleset)"
1117611973c1SStefano Brivio		return 1
1118611973c1SStefano Brivio	fi
1119611973c1SStefano Brivio}
1120611973c1SStefano Brivio
1121611973c1SStefano Brivio# Format and output entries for sets in 'netdev perf' table
1122611973c1SStefano Brivioadd_perf() {
1123611973c1SStefano Brivio	if [ "${1}" = "test" ]; then
1124611973c1SStefano Brivio		echo "add element netdev perf test $(format)"
1125611973c1SStefano Brivio	elif [ "${1}" = "norange" ]; then
1126611973c1SStefano Brivio		echo "add element netdev perf norange $(format_norange)"
1127611973c1SStefano Brivio	elif [ "${1}" = "noconcat" ]; then
1128611973c1SStefano Brivio		echo "add element netdev perf noconcat $(format_noconcat)"
1129611973c1SStefano Brivio	fi
1130611973c1SStefano Brivio}
1131611973c1SStefano Brivio
1132611973c1SStefano Brivio# Add single entry to 'norange' set in 'netdev perf' table
1133611973c1SStefano Brivioadd_perf_norange() {
1134611973c1SStefano Brivio	if ! nft add element netdev perf norange "${1}"; then
1135611973c1SStefano Brivio		err "Failed to add ${1} given ruleset:"
1136d0820556SStefano Brivio		err "$(nft -a list ruleset)"
1137611973c1SStefano Brivio		return 1
1138611973c1SStefano Brivio	fi
1139611973c1SStefano Brivio}
1140611973c1SStefano Brivio
1141611973c1SStefano Brivio# Add single entry to 'noconcat' set in 'netdev perf' table
1142611973c1SStefano Brivioadd_perf_noconcat() {
1143611973c1SStefano Brivio	if ! nft add element netdev perf noconcat "${1}"; then
1144611973c1SStefano Brivio		err "Failed to add ${1} given ruleset:"
1145d0820556SStefano Brivio		err "$(nft -a list ruleset)"
1146611973c1SStefano Brivio		return 1
1147611973c1SStefano Brivio	fi
1148611973c1SStefano Brivio}
1149611973c1SStefano Brivio
1150611973c1SStefano Brivio# Delete single entry from set
1151611973c1SStefano Briviodel() {
1152611973c1SStefano Brivio	if ! nft delete element inet filter test "${1}"; then
1153611973c1SStefano Brivio		err "Failed to delete ${1} given ruleset:"
1154d0820556SStefano Brivio		err "$(nft -a list ruleset)"
1155611973c1SStefano Brivio		return 1
1156611973c1SStefano Brivio	fi
1157611973c1SStefano Brivio}
1158611973c1SStefano Brivio
1159611973c1SStefano Brivio# Return packet count from 'test' counter in 'inet filter' table
1160611973c1SStefano Briviocount_packets() {
1161611973c1SStefano Brivio	found=0
1162611973c1SStefano Brivio	for token in $(nft list counter inet filter test); do
1163611973c1SStefano Brivio		[ ${found} -eq 1 ] && echo "${token}" && return
1164611973c1SStefano Brivio		[ "${token}" = "packets" ] && found=1
1165611973c1SStefano Brivio	done
1166611973c1SStefano Brivio}
1167611973c1SStefano Brivio
1168611973c1SStefano Brivio# Return packet count from 'test' counter in 'netdev perf' table
1169611973c1SStefano Briviocount_perf_packets() {
1170611973c1SStefano Brivio	found=0
1171611973c1SStefano Brivio	for token in $(nft list counter netdev perf test); do
1172611973c1SStefano Brivio		[ ${found} -eq 1 ] && echo "${token}" && return
1173611973c1SStefano Brivio		[ "${token}" = "packets" ] && found=1
1174611973c1SStefano Brivio	done
1175611973c1SStefano Brivio}
1176611973c1SStefano Brivio
1177611973c1SStefano Brivio# Set MAC addresses, send traffic according to specifier
1178611973c1SStefano Brivioflood() {
1179611973c1SStefano Brivio	ip link set veth_a address "$(format_mac "${1}")"
1180611973c1SStefano Brivio	ip -n B link set veth_b address "$(format_mac "${2}")"
1181611973c1SStefano Brivio
1182611973c1SStefano Brivio	for f in ${dst}; do
1183611973c1SStefano Brivio		eval dst_"$f"=\$\(format_\$f "${1}"\)
1184611973c1SStefano Brivio	done
1185611973c1SStefano Brivio	for f in ${src}; do
1186611973c1SStefano Brivio		eval src_"$f"=\$\(format_\$f "${2}"\)
1187611973c1SStefano Brivio	done
1188611973c1SStefano Brivio	eval flood_\$proto
1189611973c1SStefano Brivio}
1190611973c1SStefano Brivio
1191611973c1SStefano Brivio# Set MAC addresses, start pktgen injection
1192611973c1SStefano Brivioperf() {
1193611973c1SStefano Brivio	dst_mac="$(format_mac "${1}")"
1194611973c1SStefano Brivio	ip link set veth_a address "${dst_mac}"
1195611973c1SStefano Brivio
1196611973c1SStefano Brivio	for f in ${dst}; do
1197611973c1SStefano Brivio		eval dst_"$f"=\$\(format_\$f "${1}"\)
1198611973c1SStefano Brivio	done
1199611973c1SStefano Brivio	for f in ${src}; do
1200611973c1SStefano Brivio		eval src_"$f"=\$\(format_\$f "${2}"\)
1201611973c1SStefano Brivio	done
1202611973c1SStefano Brivio	eval perf_\$perf_proto
1203611973c1SStefano Brivio}
1204611973c1SStefano Brivio
1205611973c1SStefano Brivio# Set MAC addresses, send single packet, check that it matches, reset counter
1206611973c1SStefano Briviosend_match() {
1207611973c1SStefano Brivio	ip link set veth_a address "$(format_mac "${1}")"
1208611973c1SStefano Brivio	ip -n B link set veth_b address "$(format_mac "${2}")"
1209611973c1SStefano Brivio
1210611973c1SStefano Brivio	for f in ${dst}; do
1211611973c1SStefano Brivio		eval dst_"$f"=\$\(format_\$f "${1}"\)
1212611973c1SStefano Brivio	done
1213611973c1SStefano Brivio	for f in ${src}; do
1214611973c1SStefano Brivio		eval src_"$f"=\$\(format_\$f "${2}"\)
1215611973c1SStefano Brivio	done
1216611973c1SStefano Brivio	eval send_\$proto
1217611973c1SStefano Brivio	if [ "$(count_packets)" != "1" ]; then
1218611973c1SStefano Brivio		err "${proto} packet to:"
1219611973c1SStefano Brivio		err "  $(for f in ${dst}; do
1220611973c1SStefano Brivio			 eval format_\$f "${1}"; printf ' '; done)"
1221611973c1SStefano Brivio		err "from:"
1222611973c1SStefano Brivio		err "  $(for f in ${src}; do
1223611973c1SStefano Brivio			 eval format_\$f "${2}"; printf ' '; done)"
1224611973c1SStefano Brivio		err "should have matched ruleset:"
1225d0820556SStefano Brivio		err "$(nft -a list ruleset)"
1226611973c1SStefano Brivio		return 1
1227611973c1SStefano Brivio	fi
1228611973c1SStefano Brivio	nft reset counter inet filter test >/dev/null
1229611973c1SStefano Brivio}
1230611973c1SStefano Brivio
1231611973c1SStefano Brivio# Set MAC addresses, send single packet, check that it doesn't match
1232611973c1SStefano Briviosend_nomatch() {
1233611973c1SStefano Brivio	ip link set veth_a address "$(format_mac "${1}")"
1234611973c1SStefano Brivio	ip -n B link set veth_b address "$(format_mac "${2}")"
1235611973c1SStefano Brivio
1236611973c1SStefano Brivio	for f in ${dst}; do
1237611973c1SStefano Brivio		eval dst_"$f"=\$\(format_\$f "${1}"\)
1238611973c1SStefano Brivio	done
1239611973c1SStefano Brivio	for f in ${src}; do
1240611973c1SStefano Brivio		eval src_"$f"=\$\(format_\$f "${2}"\)
1241611973c1SStefano Brivio	done
1242611973c1SStefano Brivio	eval send_\$proto
1243611973c1SStefano Brivio	if [ "$(count_packets)" != "0" ]; then
1244611973c1SStefano Brivio		err "${proto} packet to:"
1245611973c1SStefano Brivio		err "  $(for f in ${dst}; do
1246611973c1SStefano Brivio			 eval format_\$f "${1}"; printf ' '; done)"
1247611973c1SStefano Brivio		err "from:"
1248611973c1SStefano Brivio		err "  $(for f in ${src}; do
1249611973c1SStefano Brivio			 eval format_\$f "${2}"; printf ' '; done)"
1250611973c1SStefano Brivio		err "should not have matched ruleset:"
1251d0820556SStefano Brivio		err "$(nft -a list ruleset)"
1252611973c1SStefano Brivio		return 1
1253611973c1SStefano Brivio	fi
1254611973c1SStefano Brivio}
1255611973c1SStefano Brivio
1256611973c1SStefano Brivio# Correctness test template:
1257611973c1SStefano Brivio# - add ranged element, check that packets match it
1258611973c1SStefano Brivio# - check that packets outside range don't match it
1259611973c1SStefano Brivio# - remove some elements, check that packets don't match anymore
1260611973c1SStefano Briviotest_correctness() {
1261611973c1SStefano Brivio	setup veth send_"${proto}" set || return ${KSELFTEST_SKIP}
1262611973c1SStefano Brivio
1263611973c1SStefano Brivio	range_size=1
1264611973c1SStefano Brivio	for i in $(seq "${start}" $((start + count))); do
1265611973c1SStefano Brivio		end=$((start + range_size))
1266611973c1SStefano Brivio
1267611973c1SStefano Brivio		# Avoid negative or zero-sized port ranges
1268611973c1SStefano Brivio		if [ $((end / 65534)) -gt $((start / 65534)) ]; then
1269611973c1SStefano Brivio			start=${end}
1270611973c1SStefano Brivio			end=$((end + 1))
1271611973c1SStefano Brivio		fi
1272611973c1SStefano Brivio		srcstart=$((start + src_delta))
1273611973c1SStefano Brivio		srcend=$((end + src_delta))
1274611973c1SStefano Brivio
1275611973c1SStefano Brivio		add "$(format)" || return 1
1276611973c1SStefano Brivio		for j in $(seq ${start} $((range_size / 2 + 1)) ${end}); do
1277611973c1SStefano Brivio			send_match "${j}" $((j + src_delta)) || return 1
1278611973c1SStefano Brivio		done
1279611973c1SStefano Brivio		send_nomatch $((end + 1)) $((end + 1 + src_delta)) || return 1
1280611973c1SStefano Brivio
1281611973c1SStefano Brivio		# Delete elements now and then
1282611973c1SStefano Brivio		if [ $((i % 3)) -eq 0 ]; then
1283611973c1SStefano Brivio			del "$(format)" || return 1
1284611973c1SStefano Brivio			for j in $(seq ${start} \
1285611973c1SStefano Brivio				   $((range_size / 2 + 1)) ${end}); do
1286611973c1SStefano Brivio				send_nomatch "${j}" $((j + src_delta)) \
1287611973c1SStefano Brivio					|| return 1
1288611973c1SStefano Brivio			done
1289611973c1SStefano Brivio		fi
1290611973c1SStefano Brivio
1291611973c1SStefano Brivio		range_size=$((range_size + 1))
1292611973c1SStefano Brivio		start=$((end + range_size))
1293611973c1SStefano Brivio	done
1294611973c1SStefano Brivio}
1295611973c1SStefano Brivio
1296611973c1SStefano Brivio# Concurrency test template:
1297611973c1SStefano Brivio# - add all the elements
1298611973c1SStefano Brivio# - start a thread for each physical thread that:
1299611973c1SStefano Brivio#   - adds all the elements
1300611973c1SStefano Brivio#   - flushes the set
1301611973c1SStefano Brivio#   - adds all the elements
1302611973c1SStefano Brivio#   - flushes the entire ruleset
1303611973c1SStefano Brivio#   - adds the set back
1304611973c1SStefano Brivio#   - adds all the elements
1305611973c1SStefano Brivio#   - delete all the elements
1306611973c1SStefano Briviotest_concurrency() {
1307611973c1SStefano Brivio	proto=${flood_proto}
1308611973c1SStefano Brivio	tools=${flood_tools}
1309611973c1SStefano Brivio	chain_spec=${flood_spec}
1310611973c1SStefano Brivio	setup veth flood_"${proto}" set || return ${KSELFTEST_SKIP}
1311611973c1SStefano Brivio
1312611973c1SStefano Brivio	range_size=1
1313611973c1SStefano Brivio	cstart=${start}
1314611973c1SStefano Brivio	flood_pids=
1315611973c1SStefano Brivio	for i in $(seq ${start} $((start + count))); do
1316611973c1SStefano Brivio		end=$((start + range_size))
1317611973c1SStefano Brivio		srcstart=$((start + src_delta))
1318611973c1SStefano Brivio		srcend=$((end + src_delta))
1319611973c1SStefano Brivio
1320611973c1SStefano Brivio		add "$(format)" || return 1
1321611973c1SStefano Brivio
1322611973c1SStefano Brivio		flood "${i}" $((i + src_delta)) & flood_pids="${flood_pids} $!"
1323611973c1SStefano Brivio
1324611973c1SStefano Brivio		range_size=$((range_size + 1))
1325611973c1SStefano Brivio		start=$((end + range_size))
1326611973c1SStefano Brivio	done
1327611973c1SStefano Brivio
1328611973c1SStefano Brivio	sleep 10
1329611973c1SStefano Brivio
1330611973c1SStefano Brivio	pids=
1331611973c1SStefano Brivio	for c in $(seq 1 "$(nproc)"); do (
1332611973c1SStefano Brivio		for r in $(seq 1 "${race_repeat}"); do
1333611973c1SStefano Brivio			range_size=1
1334611973c1SStefano Brivio
1335611973c1SStefano Brivio			# $start needs to be local to this subshell
1336611973c1SStefano Brivio			# shellcheck disable=SC2030
1337611973c1SStefano Brivio			start=${cstart}
1338611973c1SStefano Brivio			for i in $(seq ${start} $((start + count))); do
1339611973c1SStefano Brivio				end=$((start + range_size))
1340611973c1SStefano Brivio				srcstart=$((start + src_delta))
1341611973c1SStefano Brivio				srcend=$((end + src_delta))
1342611973c1SStefano Brivio
1343611973c1SStefano Brivio				add "$(format)" 2>/dev/null
1344611973c1SStefano Brivio
1345611973c1SStefano Brivio				range_size=$((range_size + 1))
1346611973c1SStefano Brivio				start=$((end + range_size))
1347611973c1SStefano Brivio			done
1348611973c1SStefano Brivio
1349611973c1SStefano Brivio			nft flush inet filter test 2>/dev/null
1350611973c1SStefano Brivio
1351611973c1SStefano Brivio			range_size=1
1352611973c1SStefano Brivio			start=${cstart}
1353611973c1SStefano Brivio			for i in $(seq ${start} $((start + count))); do
1354611973c1SStefano Brivio				end=$((start + range_size))
1355611973c1SStefano Brivio				srcstart=$((start + src_delta))
1356611973c1SStefano Brivio				srcend=$((end + src_delta))
1357611973c1SStefano Brivio
1358611973c1SStefano Brivio				add "$(format)" 2>/dev/null
1359611973c1SStefano Brivio
1360611973c1SStefano Brivio				range_size=$((range_size + 1))
1361611973c1SStefano Brivio				start=$((end + range_size))
1362611973c1SStefano Brivio			done
1363611973c1SStefano Brivio
1364611973c1SStefano Brivio			nft flush ruleset
1365611973c1SStefano Brivio			setup set 2>/dev/null
1366611973c1SStefano Brivio
1367611973c1SStefano Brivio			range_size=1
1368611973c1SStefano Brivio			start=${cstart}
1369611973c1SStefano Brivio			for i in $(seq ${start} $((start + count))); do
1370611973c1SStefano Brivio				end=$((start + range_size))
1371611973c1SStefano Brivio				srcstart=$((start + src_delta))
1372611973c1SStefano Brivio				srcend=$((end + src_delta))
1373611973c1SStefano Brivio
1374611973c1SStefano Brivio				add "$(format)" 2>/dev/null
1375611973c1SStefano Brivio
1376611973c1SStefano Brivio				range_size=$((range_size + 1))
1377611973c1SStefano Brivio				start=$((end + range_size))
1378611973c1SStefano Brivio			done
1379611973c1SStefano Brivio
1380611973c1SStefano Brivio			range_size=1
1381611973c1SStefano Brivio			start=${cstart}
1382611973c1SStefano Brivio			for i in $(seq ${start} $((start + count))); do
1383611973c1SStefano Brivio				end=$((start + range_size))
1384611973c1SStefano Brivio				srcstart=$((start + src_delta))
1385611973c1SStefano Brivio				srcend=$((end + src_delta))
1386611973c1SStefano Brivio
1387611973c1SStefano Brivio				del "$(format)" 2>/dev/null
1388611973c1SStefano Brivio
1389611973c1SStefano Brivio				range_size=$((range_size + 1))
1390611973c1SStefano Brivio				start=$((end + range_size))
1391611973c1SStefano Brivio			done
1392611973c1SStefano Brivio		done
1393611973c1SStefano Brivio	) & pids="${pids} $!"
1394611973c1SStefano Brivio	done
1395611973c1SStefano Brivio
1396611973c1SStefano Brivio	# shellcheck disable=SC2046,SC2086 # word splitting wanted here
1397611973c1SStefano Brivio	wait $(for pid in ${pids}; do echo ${pid}; done)
1398611973c1SStefano Brivio	# shellcheck disable=SC2046,SC2086
1399611973c1SStefano Brivio	kill $(for pid in ${flood_pids}; do echo ${pid}; done) 2>/dev/null
1400611973c1SStefano Brivio	# shellcheck disable=SC2046,SC2086
1401611973c1SStefano Brivio	wait $(for pid in ${flood_pids}; do echo ${pid}; done) 2>/dev/null
1402611973c1SStefano Brivio
1403611973c1SStefano Brivio	return 0
1404611973c1SStefano Brivio}
1405611973c1SStefano Brivio
1406611973c1SStefano Brivio# Timeout test template:
1407611973c1SStefano Brivio# - add all the elements with 3s timeout while checking that packets match
1408611973c1SStefano Brivio# - wait 3s after the last insertion, check that packets don't match any entry
1409611973c1SStefano Briviotest_timeout() {
1410611973c1SStefano Brivio	setup veth send_"${proto}" set || return ${KSELFTEST_SKIP}
1411611973c1SStefano Brivio
1412611973c1SStefano Brivio	timeout=3
1413611973c1SStefano Brivio	range_size=1
1414611973c1SStefano Brivio	for i in $(seq "${start}" $((start + count))); do
1415611973c1SStefano Brivio		end=$((start + range_size))
1416611973c1SStefano Brivio		srcstart=$((start + src_delta))
1417611973c1SStefano Brivio		srcend=$((end + src_delta))
1418611973c1SStefano Brivio
1419611973c1SStefano Brivio		add "$(format)" || return 1
1420611973c1SStefano Brivio
1421611973c1SStefano Brivio		for j in $(seq ${start} $((range_size / 2 + 1)) ${end}); do
1422611973c1SStefano Brivio			send_match "${j}" $((j + src_delta)) || return 1
1423611973c1SStefano Brivio		done
1424611973c1SStefano Brivio
1425611973c1SStefano Brivio		range_size=$((range_size + 1))
1426611973c1SStefano Brivio		start=$((end + range_size))
1427611973c1SStefano Brivio	done
1428611973c1SStefano Brivio	sleep 3
1429611973c1SStefano Brivio	for i in $(seq ${start} $((start + count))); do
1430611973c1SStefano Brivio		end=$((start + range_size))
1431611973c1SStefano Brivio		srcstart=$((start + src_delta))
1432611973c1SStefano Brivio		srcend=$((end + src_delta))
1433611973c1SStefano Brivio
1434611973c1SStefano Brivio		for j in $(seq ${start} $((range_size / 2 + 1)) ${end}); do
1435611973c1SStefano Brivio			send_nomatch "${j}" $((j + src_delta)) || return 1
1436611973c1SStefano Brivio		done
1437611973c1SStefano Brivio
1438611973c1SStefano Brivio		range_size=$((range_size + 1))
1439611973c1SStefano Brivio		start=$((end + range_size))
1440611973c1SStefano Brivio	done
1441611973c1SStefano Brivio}
1442611973c1SStefano Brivio
1443611973c1SStefano Brivio# Performance test template:
1444611973c1SStefano Brivio# - add concatenated ranged entries
1445611973c1SStefano Brivio# - add non-ranged concatenated entries (for hash set matching rate baseline)
1446611973c1SStefano Brivio# - add ranged entries with first field only (for rbhash baseline)
1447611973c1SStefano Brivio# - start pktgen injection directly on device rx path of this namespace
1448611973c1SStefano Brivio# - measure drop only rate, hash and rbtree baselines, then matching rate
1449611973c1SStefano Briviotest_performance() {
1450611973c1SStefano Brivio	chain_spec=${perf_spec}
1451611973c1SStefano Brivio	dst="${perf_dst}"
1452611973c1SStefano Brivio	src="${perf_src}"
1453611973c1SStefano Brivio	setup veth perf set || return ${KSELFTEST_SKIP}
1454611973c1SStefano Brivio
1455611973c1SStefano Brivio	first=${start}
1456611973c1SStefano Brivio	range_size=1
1457611973c1SStefano Brivio	for set in test norange noconcat; do
1458611973c1SStefano Brivio		start=${first}
1459611973c1SStefano Brivio		for i in $(seq ${start} $((start + perf_entries))); do
1460611973c1SStefano Brivio			end=$((start + range_size))
1461611973c1SStefano Brivio			srcstart=$((start + src_delta))
1462611973c1SStefano Brivio			srcend=$((end + src_delta))
1463611973c1SStefano Brivio
1464611973c1SStefano Brivio			if [ $((end / 65534)) -gt $((start / 65534)) ]; then
1465611973c1SStefano Brivio				start=${end}
1466611973c1SStefano Brivio				end=$((end + 1))
1467611973c1SStefano Brivio			elif [ ${start} -eq ${end} ]; then
1468611973c1SStefano Brivio				end=$((start + 1))
1469611973c1SStefano Brivio			fi
1470611973c1SStefano Brivio
1471611973c1SStefano Brivio			add_perf ${set}
1472611973c1SStefano Brivio
1473611973c1SStefano Brivio			start=$((end + range_size))
1474611973c1SStefano Brivio		done > "${tmp}"
1475611973c1SStefano Brivio		nft -f "${tmp}"
1476611973c1SStefano Brivio	done
1477611973c1SStefano Brivio
1478611973c1SStefano Brivio	perf $((end - 1)) ${srcstart}
1479611973c1SStefano Brivio
1480611973c1SStefano Brivio	sleep 2
1481611973c1SStefano Brivio
1482611973c1SStefano Brivio	nft add rule netdev perf test counter name \"test\" drop
1483611973c1SStefano Brivio	nft reset counter netdev perf test >/dev/null 2>&1
1484611973c1SStefano Brivio	sleep "${perf_duration}"
1485611973c1SStefano Brivio	pps="$(printf %10s $(($(count_perf_packets) / perf_duration)))"
1486611973c1SStefano Brivio	info "    baseline (drop from netdev hook):            ${pps}pps"
1487611973c1SStefano Brivio	handle="$(nft -a list chain netdev perf test | grep counter)"
1488611973c1SStefano Brivio	handle="${handle##* }"
1489611973c1SStefano Brivio	nft delete rule netdev perf test handle "${handle}"
1490611973c1SStefano Brivio
1491611973c1SStefano Brivio	nft add rule "netdev perf test ${chain_spec} @norange \
1492611973c1SStefano Brivio		counter name \"test\" drop"
1493611973c1SStefano Brivio	nft reset counter netdev perf test >/dev/null 2>&1
1494611973c1SStefano Brivio	sleep "${perf_duration}"
1495611973c1SStefano Brivio	pps="$(printf %10s $(($(count_perf_packets) / perf_duration)))"
1496611973c1SStefano Brivio	info "    baseline hash (non-ranged entries):          ${pps}pps"
1497611973c1SStefano Brivio	handle="$(nft -a list chain netdev perf test | grep counter)"
1498611973c1SStefano Brivio	handle="${handle##* }"
1499611973c1SStefano Brivio	nft delete rule netdev perf test handle "${handle}"
1500611973c1SStefano Brivio
1501611973c1SStefano Brivio	nft add rule "netdev perf test ${chain_spec%%. *} @noconcat \
1502611973c1SStefano Brivio		counter name \"test\" drop"
1503611973c1SStefano Brivio	nft reset counter netdev perf test >/dev/null 2>&1
1504611973c1SStefano Brivio	sleep "${perf_duration}"
1505611973c1SStefano Brivio	pps="$(printf %10s $(($(count_perf_packets) / perf_duration)))"
1506611973c1SStefano Brivio	info "    baseline rbtree (match on first field only): ${pps}pps"
1507611973c1SStefano Brivio	handle="$(nft -a list chain netdev perf test | grep counter)"
1508611973c1SStefano Brivio	handle="${handle##* }"
1509611973c1SStefano Brivio	nft delete rule netdev perf test handle "${handle}"
1510611973c1SStefano Brivio
1511611973c1SStefano Brivio	nft add rule "netdev perf test ${chain_spec} @test \
1512611973c1SStefano Brivio		counter name \"test\" drop"
1513611973c1SStefano Brivio	nft reset counter netdev perf test >/dev/null 2>&1
1514611973c1SStefano Brivio	sleep "${perf_duration}"
1515611973c1SStefano Brivio	pps="$(printf %10s $(($(count_perf_packets) / perf_duration)))"
1516611973c1SStefano Brivio	p5="$(printf %5s "${perf_entries}")"
1517611973c1SStefano Brivio	info "    set with ${p5} full, ranged entries:         ${pps}pps"
1518611973c1SStefano Brivio	kill "${perf_pid}"
1519611973c1SStefano Brivio}
1520611973c1SStefano Brivio
15210954df70SStefano Briviotest_bug_flush_remove_add() {
15220954df70SStefano Brivio	set_cmd='{ set s { type ipv4_addr . inet_service; flags interval; }; }'
15230954df70SStefano Brivio	elem1='{ 10.0.0.1 . 22-25, 10.0.0.1 . 10-20 }'
15240954df70SStefano Brivio	elem2='{ 10.0.0.1 . 10-20, 10.0.0.1 . 22-25 }'
15250954df70SStefano Brivio	for i in `seq 1 100`; do
15260954df70SStefano Brivio		nft add table t ${set_cmd}	|| return ${KSELFTEST_SKIP}
15270954df70SStefano Brivio		nft add element t s ${elem1}	2>/dev/null || return 1
15280954df70SStefano Brivio		nft flush set t s		2>/dev/null || return 1
15290954df70SStefano Brivio		nft add element t s ${elem2}	2>/dev/null || return 1
15300954df70SStefano Brivio	done
15310954df70SStefano Brivio	nft flush ruleset
15320954df70SStefano Brivio}
15330954df70SStefano Brivio
1534eda0cf12SFlorian Westphal# - add ranged element, check that packets match it
1535eda0cf12SFlorian Westphal# - reload the set, check packets still match
1536eda0cf12SFlorian Westphaltest_bug_reload() {
1537eda0cf12SFlorian Westphal	setup veth send_"${proto}" set || return ${KSELFTEST_SKIP}
1538eda0cf12SFlorian Westphal	rstart=${start}
1539eda0cf12SFlorian Westphal
1540eda0cf12SFlorian Westphal	range_size=1
1541eda0cf12SFlorian Westphal	for i in $(seq "${start}" $((start + count))); do
1542eda0cf12SFlorian Westphal		end=$((start + range_size))
1543eda0cf12SFlorian Westphal
1544eda0cf12SFlorian Westphal		# Avoid negative or zero-sized port ranges
1545eda0cf12SFlorian Westphal		if [ $((end / 65534)) -gt $((start / 65534)) ]; then
1546eda0cf12SFlorian Westphal			start=${end}
1547eda0cf12SFlorian Westphal			end=$((end + 1))
1548eda0cf12SFlorian Westphal		fi
1549eda0cf12SFlorian Westphal		srcstart=$((start + src_delta))
1550eda0cf12SFlorian Westphal		srcend=$((end + src_delta))
1551eda0cf12SFlorian Westphal
1552eda0cf12SFlorian Westphal		add "$(format)" || return 1
1553eda0cf12SFlorian Westphal		range_size=$((range_size + 1))
1554eda0cf12SFlorian Westphal		start=$((end + range_size))
1555eda0cf12SFlorian Westphal	done
1556eda0cf12SFlorian Westphal
1557eda0cf12SFlorian Westphal	# check kernel does allocate pcpu sctrach map
1558eda0cf12SFlorian Westphal	# for reload with no elemet add/delete
1559eda0cf12SFlorian Westphal	( echo flush set inet filter test ;
1560eda0cf12SFlorian Westphal	  nft list set inet filter test ) | nft -f -
1561eda0cf12SFlorian Westphal
1562eda0cf12SFlorian Westphal	start=${rstart}
1563eda0cf12SFlorian Westphal	range_size=1
1564eda0cf12SFlorian Westphal
1565eda0cf12SFlorian Westphal	for i in $(seq "${start}" $((start + count))); do
1566eda0cf12SFlorian Westphal		end=$((start + range_size))
1567eda0cf12SFlorian Westphal
1568eda0cf12SFlorian Westphal		# Avoid negative or zero-sized port ranges
1569eda0cf12SFlorian Westphal		if [ $((end / 65534)) -gt $((start / 65534)) ]; then
1570eda0cf12SFlorian Westphal			start=${end}
1571eda0cf12SFlorian Westphal			end=$((end + 1))
1572eda0cf12SFlorian Westphal		fi
1573eda0cf12SFlorian Westphal		srcstart=$((start + src_delta))
1574eda0cf12SFlorian Westphal		srcend=$((end + src_delta))
1575eda0cf12SFlorian Westphal
1576eda0cf12SFlorian Westphal		for j in $(seq ${start} $((range_size / 2 + 1)) ${end}); do
1577eda0cf12SFlorian Westphal			send_match "${j}" $((j + src_delta)) || return 1
1578eda0cf12SFlorian Westphal		done
1579eda0cf12SFlorian Westphal
1580eda0cf12SFlorian Westphal		range_size=$((range_size + 1))
1581eda0cf12SFlorian Westphal		start=$((end + range_size))
1582eda0cf12SFlorian Westphal	done
1583eda0cf12SFlorian Westphal
1584eda0cf12SFlorian Westphal	nft flush ruleset
1585eda0cf12SFlorian Westphal}
1586eda0cf12SFlorian Westphal
15870954df70SStefano Briviotest_reported_issues() {
15880954df70SStefano Brivio	eval test_bug_"${subtest}"
15890954df70SStefano Brivio}
15900954df70SStefano Brivio
1591611973c1SStefano Brivio# Run everything in a separate network namespace
1592611973c1SStefano Brivio[ "${1}" != "run" ] && { unshare -n "${0}" run; exit $?; }
1593611973c1SStefano Briviotmp="$(mktemp)"
1594611973c1SStefano Briviotrap cleanup EXIT
1595611973c1SStefano Brivio
1596611973c1SStefano Brivio# Entry point for test runs
1597611973c1SStefano Briviopassed=0
1598611973c1SStefano Briviofor name in ${TESTS}; do
15990954df70SStefano Brivio	printf "TEST: %s\n" "$(echo ${name} | tr '_' ' ')"
16000954df70SStefano Brivio	if [ "${name}" = "reported_issues" ]; then
16010954df70SStefano Brivio		SUBTESTS="${BUGS}"
16020954df70SStefano Brivio	else
16030954df70SStefano Brivio		SUBTESTS="${TYPES}"
16040954df70SStefano Brivio	fi
16050954df70SStefano Brivio
16060954df70SStefano Brivio	for subtest in ${SUBTESTS}; do
16070954df70SStefano Brivio		eval desc=\$TYPE_"${subtest}"
1608611973c1SStefano Brivio		IFS='
1609611973c1SStefano Brivio'
1610611973c1SStefano Brivio		for __line in ${desc}; do
1611611973c1SStefano Brivio			# shellcheck disable=SC2086
1612611973c1SStefano Brivio			eval ${__line%%	*}=\"${__line##*	}\";
1613611973c1SStefano Brivio		done
1614611973c1SStefano Brivio		IFS='
1615611973c1SStefano Brivio'
1616611973c1SStefano Brivio
1617611973c1SStefano Brivio		if [ "${name}" = "concurrency" ] && \
1618611973c1SStefano Brivio		   [ "${race_repeat}" = "0" ]; then
1619611973c1SStefano Brivio			continue
1620611973c1SStefano Brivio		fi
1621611973c1SStefano Brivio		if [ "${name}" = "performance" ] && \
1622611973c1SStefano Brivio		   [ "${perf_duration}" = "0" ]; then
1623611973c1SStefano Brivio			continue
1624611973c1SStefano Brivio		fi
1625611973c1SStefano Brivio
1626611973c1SStefano Brivio		printf "  %-60s  " "${display}"
1627611973c1SStefano Brivio		eval test_"${name}"
1628611973c1SStefano Brivio		ret=$?
1629611973c1SStefano Brivio
1630611973c1SStefano Brivio		if [ $ret -eq 0 ]; then
1631611973c1SStefano Brivio			printf "[ OK ]\n"
1632611973c1SStefano Brivio			info_flush
1633611973c1SStefano Brivio			passed=$((passed + 1))
1634611973c1SStefano Brivio		elif [ $ret -eq 1 ]; then
1635611973c1SStefano Brivio			printf "[FAIL]\n"
1636611973c1SStefano Brivio			err_flush
1637611973c1SStefano Brivio			exit 1
1638611973c1SStefano Brivio		elif [ $ret -eq ${KSELFTEST_SKIP} ]; then
1639611973c1SStefano Brivio			printf "[SKIP]\n"
1640611973c1SStefano Brivio			err_flush
1641611973c1SStefano Brivio		fi
1642611973c1SStefano Brivio	done
1643611973c1SStefano Briviodone
1644611973c1SStefano Brivio
16452e71ec1aSHangbin Liu[ ${passed} -eq 0 ] && exit ${KSELFTEST_SKIP} || exit 0
1646