hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
 
# Test for resource limit of offloaded flower rules. The test adds a given
# number of flower matches for different IPv6 addresses, then check the offload
# indication for all of the tc flower rules. This file contains functions to set
# up a testing topology and run the test, and is meant to be sourced from a test
# script that calls the testing routine with a given number of rules.
 
TC_FLOWER_NUM_NETIFS=2
 
tc_flower_h1_create()
{
   simple_if_init $h1
   tc qdisc add dev $h1 clsact
}
 
tc_flower_h1_destroy()
{
   tc qdisc del dev $h1 clsact
   simple_if_fini $h1
}
 
tc_flower_h2_create()
{
   simple_if_init $h2
   tc qdisc add dev $h2 clsact
}
 
tc_flower_h2_destroy()
{
   tc qdisc del dev $h2 clsact
   simple_if_fini $h2
}
 
tc_flower_setup_prepare()
{
   h1=${NETIFS[p1]}
   h2=${NETIFS[p2]}
 
   vrf_prepare
 
   tc_flower_h1_create
   tc_flower_h2_create
}
 
tc_flower_cleanup()
{
   pre_cleanup
 
   tc_flower_h2_destroy
   tc_flower_h1_destroy
 
   vrf_cleanup
 
   if [[ -v TC_FLOWER_BATCH_FILE ]]; then
       rm -f $TC_FLOWER_BATCH_FILE
   fi
}
 
tc_flower_addr()
{
   local num=$1; shift
 
   printf "2001:db8:1::%x" $num
}
 
tc_flower_rules_create()
{
   local count=$1; shift
   local should_fail=$1; shift
 
   TC_FLOWER_BATCH_FILE="$(mktemp)"
 
   for ((i = 0; i < count; ++i)); do
       cat >> $TC_FLOWER_BATCH_FILE <<-EOF
           filter add dev $h2 ingress \
               prot ipv6 \
               pref 1000 \
               flower $tcflags dst_ip $(tc_flower_addr $i) \
               action drop
       EOF
   done
 
   tc -b $TC_FLOWER_BATCH_FILE
   check_err_fail $should_fail $? "Rule insertion"
}
 
__tc_flower_test()
{
   local count=$1; shift
   local should_fail=$1; shift
   local last=$((count - 1))
 
   tc_flower_rules_create $count $should_fail
 
   offload_count=$(tc -j -s filter show dev $h2 ingress    |
           jq -r '[ .[] | select(.kind == "flower") |
           .options | .in_hw ]' | jq .[] | wc -l)
   [[ $((offload_count - 1)) -eq $count ]]
   check_err_fail $should_fail $? "Attempt to offload $count rules (actual result $((offload_count - 1)))"
}
 
tc_flower_test()
{
   local count=$1; shift
   local should_fail=$1; shift
 
   # We use lower 16 bits of IPv6 address for match. Also there are only 16
   # bits of rule priority space.
   if ((count > 65536)); then
       check_err 1 "Invalid count of $count. At most 65536 rules supported"
       return
   fi
 
   if ! tc_offload_check $TC_FLOWER_NUM_NETIFS; then
       check_err 1 "Could not test offloaded functionality"
       return
   fi
 
   tcflags="skip_sw"
   __tc_flower_test $count $should_fail
}