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