selftests: netfilter: fix transaction test script timeout handling
[platform/kernel/linux-starfive.git] / tools / testing / selftests / netfilter / nft_trans_stress.sh
1 #!/bin/bash
2 #
3 # This test is for stress-testing the nf_tables config plane path vs.
4 # packet path processing: Make sure we never release rules that are
5 # still visible to other cpus.
6 #
7 # set -e
8
9 # Kselftest framework requirement - SKIP code is 4.
10 ksft_skip=4
11
12 testns=testns-$(mktemp -u "XXXXXXXX")
13 tmp=""
14
15 tables="foo bar baz quux"
16 global_ret=0
17 eret=0
18 lret=0
19
20 cleanup() {
21         ip netns pids "$testns" | xargs kill 2>/dev/null
22         ip netns del "$testns"
23
24         rm -f "$tmp"
25 }
26
27 check_result()
28 {
29         local r=$1
30         local OK="PASS"
31
32         if [ $r -ne 0 ] ;then
33                 OK="FAIL"
34                 global_ret=$r
35         fi
36
37         echo "$OK: nft $2 test returned $r"
38
39         eret=0
40 }
41
42 nft --version > /dev/null 2>&1
43 if [ $? -ne 0 ];then
44         echo "SKIP: Could not run test without nft tool"
45         exit $ksft_skip
46 fi
47
48 ip -Version > /dev/null 2>&1
49 if [ $? -ne 0 ];then
50         echo "SKIP: Could not run test without ip tool"
51         exit $ksft_skip
52 fi
53
54 trap cleanup EXIT
55 tmp=$(mktemp)
56
57 for table in $tables; do
58         echo add table inet "$table" >> "$tmp"
59         echo flush table inet "$table" >> "$tmp"
60
61         echo "add chain inet $table INPUT { type filter hook input priority 0; }" >> "$tmp"
62         echo "add chain inet $table OUTPUT { type filter hook output priority 0; }" >> "$tmp"
63         for c in $(seq 1 400); do
64                 chain=$(printf "chain%03u" "$c")
65                 echo "add chain inet $table $chain" >> "$tmp"
66         done
67
68         for c in $(seq 1 400); do
69                 chain=$(printf "chain%03u" "$c")
70                 for BASE in INPUT OUTPUT; do
71                         echo "add rule inet $table $BASE counter jump $chain" >> "$tmp"
72                 done
73                 echo "add rule inet $table $chain counter return" >> "$tmp"
74         done
75 done
76
77 ip netns add "$testns"
78 ip -netns "$testns" link set lo up
79
80 lscpu | grep ^CPU\(s\): | ( read cpu cpunum ;
81 cpunum=$((cpunum-1))
82 for i in $(seq 0 $cpunum);do
83         mask=$(printf 0x%x $((1<<$i)))
84         ip netns exec "$testns" taskset $mask ping -4 127.0.0.1 -fq > /dev/null &
85         ip netns exec "$testns" taskset $mask ping -6 ::1 -fq > /dev/null &
86 done)
87
88 sleep 1
89
90 ip netns exec "$testns" nft -f "$tmp"
91 for i in $(seq 1 10) ; do ip netns exec "$testns" nft -f "$tmp" & done
92
93 for table in $tables;do
94         randsleep=$((RANDOM%2))
95         sleep $randsleep
96         ip netns exec "$testns" nft delete table inet $table
97         lret=$?
98         if [ $lret -ne 0 ]; then
99                 eret=$lret
100         fi
101 done
102
103 check_result $eret "add/delete"
104
105 for i in $(seq 1 10) ; do
106         (echo "flush ruleset"; cat "$tmp") | ip netns exec "$testns" nft -f /dev/stdin
107
108         lret=$?
109         if [ $lret -ne 0 ]; then
110                 eret=$lret
111         fi
112 done
113
114 check_result $eret "reload"
115
116 for i in $(seq 1 10) ; do
117         (echo "flush ruleset"; cat "$tmp"
118          echo "insert rule inet foo INPUT meta nftrace set 1"
119          echo "insert rule inet foo OUTPUT meta nftrace set 1"
120          ) | ip netns exec "$testns" nft -f /dev/stdin
121         lret=$?
122         if [ $lret -ne 0 ]; then
123                 eret=$lret
124         fi
125
126         (echo "flush ruleset"; cat "$tmp"
127          ) | ip netns exec "$testns" nft -f /dev/stdin
128
129         lret=$?
130         if [ $lret -ne 0 ]; then
131                 eret=$lret
132         fi
133 done
134
135 check_result $eret "add/delete with nftrace enabled"
136
137 echo "insert rule inet foo INPUT meta nftrace set 1" >> $tmp
138 echo "insert rule inet foo OUTPUT meta nftrace set 1" >> $tmp
139
140 for i in $(seq 1 10) ; do
141         (echo "flush ruleset"; cat "$tmp") | ip netns exec "$testns" nft -f /dev/stdin
142
143         lret=$?
144         if [ $lret -ne 0 ]; then
145                 eret=1
146         fi
147 done
148
149 check_result $lret "add/delete with nftrace enabled"
150
151 exit $global_ret