Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next
[linux-2.6-microblaze.git] / tools / testing / selftests / drivers / net / mlxsw / devlink_trap_tunnel_vxlan.sh
1 #!/bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 #
4 # Test devlink-trap tunnel drops and exceptions functionality over mlxsw.
5 # Check all traps to make sure they are triggered under the right
6 # conditions.
7
8 # +--------------------+
9 # | H1 (vrf)           |
10 # |    + $h1           |
11 # |    | 192.0.2.1/28  |
12 # +----|---------------+
13 #      |
14 # +----|----------------------------------------------------------------------+
15 # | SW |                                                                      |
16 # | +--|--------------------------------------------------------------------+ |
17 # | |  + $swp1                   BR1 (802.1d)                               | |
18 # | |                                                                       | |
19 # | |  + vx1 (vxlan)                                                        | |
20 # | |    local 192.0.2.17                                                   | |
21 # | |    id 1000 dstport $VXPORT                                            | |
22 # | +-----------------------------------------------------------------------+ |
23 # |                                                                           |
24 # |    + $rp1                                                                 |
25 # |    | 192.0.2.17/28                                                        |
26 # +----|----------------------------------------------------------------------+
27 #      |
28 # +----|--------------------------------------------------------+
29 # |    |                                             VRF2       |
30 # |    + $rp2                                                   |
31 # |      192.0.2.18/28                                          |
32 # |                                                             |
33 # +-------------------------------------------------------------+
34
35 lib_dir=$(dirname $0)/../../../net/forwarding
36
37 ALL_TESTS="
38         decap_error_test
39         overlay_smac_is_mc_test
40 "
41
42 NUM_NETIFS=4
43 source $lib_dir/lib.sh
44 source $lib_dir/tc_common.sh
45 source $lib_dir/devlink_lib.sh
46
47 : ${VXPORT:=4789}
48 export VXPORT
49
50 h1_create()
51 {
52         simple_if_init $h1 192.0.2.1/28
53 }
54
55 h1_destroy()
56 {
57         simple_if_fini $h1 192.0.2.1/28
58 }
59
60 switch_create()
61 {
62         ip link add name br1 type bridge vlan_filtering 0 mcast_snooping 0
63         # Make sure the bridge uses the MAC address of the local port and not
64         # that of the VxLAN's device.
65         ip link set dev br1 address $(mac_get $swp1)
66         ip link set dev br1 up
67
68         tc qdisc add dev $swp1 clsact
69         ip link set dev $swp1 master br1
70         ip link set dev $swp1 up
71
72         ip link add name vx1 type vxlan id 1000 local 192.0.2.17 \
73                 dstport "$VXPORT" nolearning noudpcsum tos inherit ttl 100
74         ip link set dev vx1 master br1
75         ip link set dev vx1 up
76
77         ip address add dev $rp1 192.0.2.17/28
78         ip link set dev $rp1 up
79 }
80
81 switch_destroy()
82 {
83         ip link set dev $rp1 down
84         ip address del dev $rp1 192.0.2.17/28
85
86         ip link set dev vx1 down
87         ip link set dev vx1 nomaster
88         ip link del dev vx1
89
90         ip link set dev $swp1 down
91         ip link set dev $swp1 nomaster
92         tc qdisc del dev $swp1 clsact
93
94         ip link set dev br1 down
95         ip link del dev br1
96 }
97
98 vrf2_create()
99 {
100         simple_if_init $rp2 192.0.2.18/28
101 }
102
103 vrf2_destroy()
104 {
105         simple_if_fini $rp2 192.0.2.18/28
106 }
107
108 setup_prepare()
109 {
110         h1=${NETIFS[p1]}
111         swp1=${NETIFS[p2]}
112
113         rp1=${NETIFS[p3]}
114         rp2=${NETIFS[p4]}
115
116         vrf_prepare
117         forwarding_enable
118         h1_create
119         switch_create
120         vrf2_create
121 }
122
123 cleanup()
124 {
125         pre_cleanup
126
127         vrf2_destroy
128         switch_destroy
129         h1_destroy
130         forwarding_restore
131         vrf_cleanup
132 }
133
134 ecn_payload_get()
135 {
136         dest_mac=$(mac_get $h1)
137         p=$(:
138                 )"08:"$(                      : VXLAN flags
139                 )"00:00:00:"$(                : VXLAN reserved
140                 )"00:03:e8:"$(                : VXLAN VNI : 1000
141                 )"00:"$(                      : VXLAN reserved
142                 )"$dest_mac:"$(               : ETH daddr
143                 )"00:00:00:00:00:00:"$(       : ETH saddr
144                 )"08:00:"$(                   : ETH type
145                 )"45:"$(                      : IP version + IHL
146                 )"00:"$(                      : IP TOS
147                 )"00:14:"$(                   : IP total length
148                 )"00:00:"$(                   : IP identification
149                 )"20:00:"$(                   : IP flags + frag off
150                 )"40:"$(                      : IP TTL
151                 )"00:"$(                      : IP proto
152                 )"D6:E5:"$(                   : IP header csum
153                 )"c0:00:02:03:"$(             : IP saddr: 192.0.2.3
154                 )"c0:00:02:01:"$(             : IP daddr: 192.0.2.1
155                 )
156         echo $p
157 }
158
159 ecn_decap_test()
160 {
161         local trap_name="decap_error"
162         local group_name="tunnel_drops"
163         local desc=$1; shift
164         local ecn_desc=$1; shift
165         local outer_tos=$1; shift
166         local mz_pid
167
168         RET=0
169
170         tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
171                 flower src_ip 192.0.2.3 dst_ip 192.0.2.1 action pass
172
173         rp1_mac=$(mac_get $rp1)
174         payload=$(ecn_payload_get)
175
176         ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -b $rp1_mac -B 192.0.2.17 \
177                 -t udp sp=12345,dp=$VXPORT,tos=$outer_tos,p=$payload -q &
178         mz_pid=$!
179
180         devlink_trap_exception_test $trap_name $group_name
181
182         tc_check_packets "dev $swp1 egress" 101 0
183         check_err $? "Packets were not dropped"
184
185         log_test "$desc: Inner ECN is not ECT and outer is $ecn_desc"
186
187         kill $mz_pid && wait $mz_pid &> /dev/null
188         tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
189 }
190
191 reserved_bits_payload_get()
192 {
193         dest_mac=$(mac_get $h1)
194         p=$(:
195                 )"08:"$(                      : VXLAN flags
196                 )"01:00:00:"$(                : VXLAN reserved
197                 )"00:03:e8:"$(                : VXLAN VNI : 1000
198                 )"00:"$(                      : VXLAN reserved
199                 )"$dest_mac:"$(               : ETH daddr
200                 )"00:00:00:00:00:00:"$(       : ETH saddr
201                 )"08:00:"$(                   : ETH type
202                 )"45:"$(                      : IP version + IHL
203                 )"00:"$(                      : IP TOS
204                 )"00:14:"$(                   : IP total length
205                 )"00:00:"$(                   : IP identification
206                 )"20:00:"$(                   : IP flags + frag off
207                 )"40:"$(                      : IP TTL
208                 )"00:"$(                      : IP proto
209                 )"00:00:"$(                   : IP header csum
210                 )"c0:00:02:03:"$(             : IP saddr: 192.0.2.3
211                 )"c0:00:02:01:"$(             : IP daddr: 192.0.2.1
212                 )
213         echo $p
214 }
215
216 short_payload_get()
217 {
218         dest_mac=$(mac_get $h1)
219         p=$(:
220                 )"08:"$(                      : VXLAN flags
221                 )"01:00:00:"$(                : VXLAN reserved
222                 )"00:03:e8:"$(                : VXLAN VNI : 1000
223                 )"00:"$(                      : VXLAN reserved
224                 )
225         echo $p
226 }
227
228 corrupted_packet_test()
229 {
230         local trap_name="decap_error"
231         local group_name="tunnel_drops"
232         local desc=$1; shift
233         local payload_get=$1; shift
234         local mz_pid
235
236         RET=0
237
238         # In case of too short packet, there is no any inner packet,
239         # so the matching will always succeed
240         tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
241                 flower skip_hw src_ip 192.0.2.3 dst_ip 192.0.2.1 action pass
242
243         rp1_mac=$(mac_get $rp1)
244         payload=$($payload_get)
245         ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -b $rp1_mac \
246                 -B 192.0.2.17 -t udp sp=12345,dp=$VXPORT,p=$payload -q &
247         mz_pid=$!
248
249         devlink_trap_exception_test $trap_name $group_name
250
251         tc_check_packets "dev $swp1 egress" 101 0
252         check_err $? "Packets were not dropped"
253
254         log_test "$desc"
255
256         kill $mz_pid && wait $mz_pid &> /dev/null
257         tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
258 }
259
260 decap_error_test()
261 {
262         ecn_decap_test "Decap error" "ECT(1)" 01
263         ecn_decap_test "Decap error" "ECT(0)" 02
264         ecn_decap_test "Decap error" "CE" 03
265
266         corrupted_packet_test "Decap error: Reserved bits in use" \
267                 "reserved_bits_payload_get"
268         corrupted_packet_test "Decap error: No L2 header" "short_payload_get"
269 }
270
271 mc_smac_payload_get()
272 {
273         dest_mac=$(mac_get $h1)
274         source_mac=01:02:03:04:05:06
275         p=$(:
276                 )"08:"$(                      : VXLAN flags
277                 )"00:00:00:"$(                : VXLAN reserved
278                 )"00:03:e8:"$(                : VXLAN VNI : 1000
279                 )"00:"$(                      : VXLAN reserved
280                 )"$dest_mac:"$(               : ETH daddr
281                 )"$source_mac:"$(             : ETH saddr
282                 )"08:00:"$(                   : ETH type
283                 )"45:"$(                      : IP version + IHL
284                 )"00:"$(                      : IP TOS
285                 )"00:14:"$(                   : IP total length
286                 )"00:00:"$(                   : IP identification
287                 )"20:00:"$(                   : IP flags + frag off
288                 )"40:"$(                      : IP TTL
289                 )"00:"$(                      : IP proto
290                 )"00:00:"$(                   : IP header csum
291                 )"c0:00:02:03:"$(             : IP saddr: 192.0.2.3
292                 )"c0:00:02:01:"$(             : IP daddr: 192.0.2.1
293                 )
294         echo $p
295 }
296
297 overlay_smac_is_mc_test()
298 {
299         local trap_name="overlay_smac_is_mc"
300         local group_name="tunnel_drops"
301         local mz_pid
302
303         RET=0
304
305         # The matching will be checked on devlink_trap_drop_test()
306         # and the filter will be removed on devlink_trap_drop_cleanup()
307         tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
308                 flower src_mac 01:02:03:04:05:06 action pass
309
310         rp1_mac=$(mac_get $rp1)
311         payload=$(mc_smac_payload_get)
312
313         ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -b $rp1_mac \
314                 -B 192.0.2.17 -t udp sp=12345,dp=$VXPORT,p=$payload -q &
315         mz_pid=$!
316
317         devlink_trap_drop_test $trap_name $group_name $swp1 101
318
319         log_test "Overlay source MAC is multicast"
320
321         devlink_trap_drop_cleanup $mz_pid $swp1 "ip" 1 101
322 }
323
324 trap cleanup EXIT
325
326 setup_prepare
327 setup_wait
328 tests_run
329
330 exit $EXIT_STATUS