Merge tag 'linux-kselftest-fixes-5.15-rc5' of git://git.kernel.org/pub/scm/linux...
[platform/kernel/linux-rpi.git] / tools / testing / selftests / netfilter / nft_zones_many.sh
1 #!/bin/bash
2
3 # Test insertion speed for packets with identical addresses/ports
4 # that are all placed in distinct conntrack zones.
5
6 sfx=$(mktemp -u "XXXXXXXX")
7 ns="ns-$sfx"
8
9 # Kselftest framework requirement - SKIP code is 4.
10 ksft_skip=4
11
12 zones=20000
13 have_ct_tool=0
14 ret=0
15
16 cleanup()
17 {
18         ip netns del $ns
19 }
20
21 ip netns add $ns
22 if [ $? -ne 0 ];then
23         echo "SKIP: Could not create net namespace $gw"
24         exit $ksft_skip
25 fi
26
27 trap cleanup EXIT
28
29 conntrack -V > /dev/null 2>&1
30 if [ $? -eq 0 ];then
31         have_ct_tool=1
32 fi
33
34 ip -net "$ns" link set lo up
35
36 test_zones() {
37         local max_zones=$1
38
39 ip netns exec $ns sysctl -q net.netfilter.nf_conntrack_udp_timeout=3600
40 ip netns exec $ns nft -f /dev/stdin<<EOF
41 flush ruleset
42 table inet raw {
43         map rndzone {
44                 typeof numgen inc mod $max_zones : ct zone
45         }
46
47         chain output {
48                 type filter hook output priority -64000; policy accept;
49                 udp dport 12345  ct zone set numgen inc mod 65536 map @rndzone
50         }
51 }
52 EOF
53         (
54                 echo "add element inet raw rndzone {"
55         for i in $(seq 1 $max_zones);do
56                 echo -n "$i : $i"
57                 if [ $i -lt $max_zones ]; then
58                         echo ","
59                 else
60                         echo "}"
61                 fi
62         done
63         ) | ip netns exec $ns nft -f /dev/stdin
64
65         local i=0
66         local j=0
67         local outerstart=$(date +%s%3N)
68         local stop=$outerstart
69
70         while [ $i -lt $max_zones ]; do
71                 local start=$(date +%s%3N)
72                 i=$((i + 10000))
73                 j=$((j + 1))
74                 dd if=/dev/zero of=/dev/stdout bs=8k count=10000 2>/dev/null | ip netns exec "$ns" nc -w 1 -q 1 -u -p 12345 127.0.0.1 12345 > /dev/null
75                 if [ $? -ne 0 ] ;then
76                         ret=1
77                         break
78                 fi
79
80                 stop=$(date +%s%3N)
81                 local duration=$((stop-start))
82                 echo "PASS: added 10000 entries in $duration ms (now $i total, loop $j)"
83         done
84
85         if [ $have_ct_tool -eq 1 ]; then
86                 local count=$(ip netns exec "$ns" conntrack -C)
87                 local duration=$((stop-outerstart))
88
89                 if [ $count -eq $max_zones ]; then
90                         echo "PASS: inserted $count entries from packet path in $duration ms total"
91                 else
92                         ip netns exec $ns conntrack -S 1>&2
93                         echo "FAIL: inserted $count entries from packet path in $duration ms total, expected $max_zones entries"
94                         ret=1
95                 fi
96         fi
97
98         if [ $ret -ne 0 ];then
99                 echo "FAIL: insert $max_zones entries from packet path" 1>&2
100         fi
101 }
102
103 test_conntrack_tool() {
104         local max_zones=$1
105
106         ip netns exec $ns conntrack -F >/dev/null 2>/dev/null
107
108         local outerstart=$(date +%s%3N)
109         local start=$(date +%s%3N)
110         local stop=$start
111         local i=0
112         while [ $i -lt $max_zones ]; do
113                 i=$((i + 1))
114                 ip netns exec "$ns" conntrack -I -s 1.1.1.1 -d 2.2.2.2 --protonum 6 \
115                          --timeout 3600 --state ESTABLISHED --sport 12345 --dport 1000 --zone $i >/dev/null 2>&1
116                 if [ $? -ne 0 ];then
117                         ip netns exec "$ns" conntrack -I -s 1.1.1.1 -d 2.2.2.2 --protonum 6 \
118                          --timeout 3600 --state ESTABLISHED --sport 12345 --dport 1000 --zone $i > /dev/null
119                         echo "FAIL: conntrack -I returned an error"
120                         ret=1
121                         break
122                 fi
123
124                 if [ $((i%10000)) -eq 0 ];then
125                         stop=$(date +%s%3N)
126
127                         local duration=$((stop-start))
128                         echo "PASS: added 10000 entries in $duration ms (now $i total)"
129                         start=$stop
130                 fi
131         done
132
133         local count=$(ip netns exec "$ns" conntrack -C)
134         local duration=$((stop-outerstart))
135
136         if [ $count -eq $max_zones ]; then
137                 echo "PASS: inserted $count entries via ctnetlink in $duration ms"
138         else
139                 ip netns exec $ns conntrack -S 1>&2
140                 echo "FAIL: inserted $count entries via ctnetlink in $duration ms, expected $max_zones entries ($duration ms)"
141                 ret=1
142         fi
143 }
144
145 test_zones $zones
146
147 if [ $have_ct_tool -eq 1 ];then
148         test_conntrack_tool $zones
149 else
150         echo "SKIP: Could not run ctnetlink insertion test without conntrack tool"
151         if [ $ret -eq 0 ];then
152                 exit $ksft_skip
153         fi
154 fi
155
156 exit $ret