1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3#
4# Test devlink-trap control trap functionality over mlxsw. Each registered
5# control packet trap is tested to make sure it is triggered under the right
6# conditions.
7#
8# +---------------------------------+
9# | H1 (vrf)                        |
10# |    + $h1                        |
11# |    | 192.0.2.1/24               |
12# |    | 2001:db8:1::1/64           |
13# |    |                            |
14# |    |  default via 192.0.2.2     |
15# |    |  default via 2001:db8:1::2 |
16# +----|----------------------------+
17#      |
18# +----|----------------------------------------------------------------------+
19# | SW |                                                                      |
20# |    + $rp1                                                                 |
21# |        192.0.2.2/24                                                       |
22# |        2001:db8:1::2/64                                                   |
23# |                                                                           |
24# |        2001:db8:2::2/64                                                   |
25# |        198.51.100.2/24                                                    |
26# |    + $rp2                                                                 |
27# |    |                                                                      |
28# +----|----------------------------------------------------------------------+
29#      |
30# +----|----------------------------+
31# |    |  default via 198.51.100.2  |
32# |    |  default via 2001:db8:2::2 |
33# |    |                            |
34# |    | 2001:db8:2::1/64           |
35# |    | 198.51.100.1/24            |
36# |    + $h2                        |
37# | H2 (vrf)                        |
38# +---------------------------------+
39
40lib_dir=$(dirname $0)/../../../net/forwarding
41
42ALL_TESTS="
43	stp_test
44	lacp_test
45	lldp_test
46	igmp_query_test
47	igmp_v1_report_test
48	igmp_v2_report_test
49	igmp_v3_report_test
50	igmp_v2_leave_test
51	mld_query_test
52	mld_v1_report_test
53	mld_v2_report_test
54	mld_v1_done_test
55	ipv4_dhcp_test
56	ipv6_dhcp_test
57	arp_request_test
58	arp_response_test
59	ipv6_neigh_solicit_test
60	ipv6_neigh_advert_test
61	ipv4_bfd_test
62	ipv6_bfd_test
63	ipv4_ospf_test
64	ipv6_ospf_test
65	ipv4_bgp_test
66	ipv6_bgp_test
67	ipv4_vrrp_test
68	ipv6_vrrp_test
69	ipv4_pim_test
70	ipv6_pim_test
71	uc_loopback_test
72	local_route_test
73	external_route_test
74	ipv6_uc_dip_link_local_scope_test
75	ipv4_router_alert_test
76	ipv6_router_alert_test
77	ipv6_dip_all_nodes_test
78	ipv6_dip_all_routers_test
79	ipv6_router_solicit_test
80	ipv6_router_advert_test
81	ipv6_redirect_test
82	ptp_event_test
83	ptp_general_test
84	flow_action_sample_test
85	flow_action_trap_test
86"
87NUM_NETIFS=4
88source $lib_dir/lib.sh
89source $lib_dir/devlink_lib.sh
90source mlxsw_lib.sh
91
92h1_create()
93{
94	simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64
95
96	ip -4 route add default vrf v$h1 nexthop via 192.0.2.2
97	ip -6 route add default vrf v$h1 nexthop via 2001:db8:1::2
98}
99
100h1_destroy()
101{
102	ip -6 route del default vrf v$h1 nexthop via 2001:db8:1::2
103	ip -4 route del default vrf v$h1 nexthop via 192.0.2.2
104
105	simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64
106}
107
108h2_create()
109{
110	simple_if_init $h2 198.51.100.1/24 2001:db8:2::1/64
111
112	ip -4 route add default vrf v$h2 nexthop via 198.51.100.2
113	ip -6 route add default vrf v$h2 nexthop via 2001:db8:2::2
114}
115
116h2_destroy()
117{
118	ip -6 route del default vrf v$h2 nexthop via 2001:db8:2::2
119	ip -4 route del default vrf v$h2 nexthop via 198.51.100.2
120
121	simple_if_fini $h2 198.51.100.1/24 2001:db8:2::1/64
122}
123
124router_create()
125{
126	ip link set dev $rp1 up
127	ip link set dev $rp2 up
128
129	__addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
130	__addr_add_del $rp2 add 198.51.100.2/24 2001:db8:2::2/64
131}
132
133router_destroy()
134{
135	__addr_add_del $rp2 del 198.51.100.2/24 2001:db8:2::2/64
136	__addr_add_del $rp1 del 192.0.2.2/24 2001:db8:1::2/64
137
138	ip link set dev $rp2 down
139	ip link set dev $rp1 down
140}
141
142setup_prepare()
143{
144	h1=${NETIFS[p1]}
145	rp1=${NETIFS[p2]}
146
147	rp2=${NETIFS[p3]}
148	h2=${NETIFS[p4]}
149
150	vrf_prepare
151	forwarding_enable
152
153	h1_create
154	h2_create
155	router_create
156}
157
158cleanup()
159{
160	pre_cleanup
161
162	router_destroy
163	h2_destroy
164	h1_destroy
165
166	forwarding_restore
167	vrf_cleanup
168}
169
170stp_test()
171{
172	devlink_trap_stats_test "STP" "stp" $MZ $h1 -c 1 -t bpdu -q
173}
174
175lacp_payload_get()
176{
177	local source_mac=$1; shift
178	local p
179
180	p=$(:
181		)"01:80:C2:00:00:02:"$(       : ETH daddr
182		)"$source_mac:"$(             : ETH saddr
183		)"88:09:"$(                   : ETH type
184		)
185	echo $p
186}
187
188lacp_test()
189{
190	local h1mac=$(mac_get $h1)
191
192	devlink_trap_stats_test "LACP" "lacp" $MZ $h1 -c 1 \
193		$(lacp_payload_get $h1mac) -p 100 -q
194}
195
196lldp_payload_get()
197{
198	local source_mac=$1; shift
199	local p
200
201	p=$(:
202		)"01:80:C2:00:00:0E:"$(       : ETH daddr
203		)"$source_mac:"$(             : ETH saddr
204		)"88:CC:"$(                   : ETH type
205		)
206	echo $p
207}
208
209lldp_test()
210{
211	local h1mac=$(mac_get $h1)
212
213	devlink_trap_stats_test "LLDP" "lldp" $MZ $h1 -c 1 \
214		$(lldp_payload_get $h1mac) -p 100 -q
215}
216
217igmp_query_test()
218{
219	# IGMP (IP Protocol 2) Membership Query (Type 0x11)
220	devlink_trap_stats_test "IGMP Membership Query" "igmp_query" \
221		$MZ $h1 -c 1 -a own -b 01:00:5E:00:00:01 \
222		-A 192.0.2.1 -B 224.0.0.1 -t ip proto=2,p=11 -p 100 -q
223}
224
225igmp_v1_report_test()
226{
227	# IGMP (IP Protocol 2) Version 1 Membership Report (Type 0x12)
228	devlink_trap_stats_test "IGMP Version 1 Membership Report" \
229		"igmp_v1_report" $MZ $h1 -c 1 -a own -b 01:00:5E:00:00:01 \
230		-A 192.0.2.1 -B 244.0.0.1 -t ip proto=2,p=12 -p 100 -q
231}
232
233igmp_v2_report_test()
234{
235	# IGMP (IP Protocol 2) Version 2 Membership Report (Type 0x16)
236	devlink_trap_stats_test "IGMP Version 2 Membership Report" \
237		"igmp_v2_report" $MZ $h1 -c 1 -a own -b 01:00:5E:00:00:01 \
238		-A 192.0.2.1 -B 244.0.0.1 -t ip proto=2,p=16 -p 100 -q
239}
240
241igmp_v3_report_test()
242{
243	# IGMP (IP Protocol 2) Version 3 Membership Report (Type 0x22)
244	devlink_trap_stats_test "IGMP Version 3 Membership Report" \
245		"igmp_v3_report" $MZ $h1 -c 1 -a own -b 01:00:5E:00:00:01 \
246		-A 192.0.2.1 -B 244.0.0.1 -t ip proto=2,p=22 -p 100 -q
247}
248
249igmp_v2_leave_test()
250{
251	# IGMP (IP Protocol 2) Version 2 Leave Group (Type 0x17)
252	devlink_trap_stats_test "IGMP Version 2 Leave Group" \
253		"igmp_v2_leave" $MZ $h1 -c 1 -a own -b 01:00:5E:00:00:02 \
254		-A 192.0.2.1 -B 224.0.0.2 -t ip proto=2,p=17 -p 100 -q
255}
256
257mld_payload_get()
258{
259	local type=$1; shift
260	local p
261
262	type=$(printf "%x" $type)
263	p=$(:
264		)"3A:"$(			: Next Header - ICMPv6
265		)"00:"$(			: Hdr Ext Len
266		)"00:00:00:00:00:00:"$(		: Options and Padding
267		)"$type:"$(			: ICMPv6.type
268		)"00:"$(			: ICMPv6.code
269		)"00:"$(			: ICMPv6.checksum
270		)
271	echo $p
272}
273
274mld_query_test()
275{
276	# MLD Multicast Listener Query (Type 130)
277	devlink_trap_stats_test "MLD Multicast Listener Query" "mld_query" \
278		$MZ $h1 -6 -c 1 -A fe80::1 -B ff02::1 \
279		-t ip hop=1,next=0,payload=$(mld_payload_get 130) -p 100 -q
280}
281
282mld_v1_report_test()
283{
284	# MLD Version 1 Multicast Listener Report (Type 131)
285	devlink_trap_stats_test "MLD Version 1 Multicast Listener Report" \
286		"mld_v1_report" $MZ $h1 -6 -c 1 -A fe80::1 -B ff02::16 \
287		-t ip hop=1,next=0,payload=$(mld_payload_get 131) -p 100 -q
288}
289
290mld_v2_report_test()
291{
292	# MLD Version 2 Multicast Listener Report (Type 143)
293	devlink_trap_stats_test "MLD Version 2 Multicast Listener Report" \
294		"mld_v2_report" $MZ $h1 -6 -c 1 -A fe80::1 -B ff02::16 \
295		-t ip hop=1,next=0,payload=$(mld_payload_get 143) -p 100 -q
296}
297
298mld_v1_done_test()
299{
300	# MLD Version 1 Multicast Listener Done (Type 132)
301	devlink_trap_stats_test "MLD Version 1 Multicast Listener Done" \
302		"mld_v1_done" $MZ $h1 -6 -c 1 -A fe80::1 -B ff02::16 \
303		-t ip hop=1,next=0,payload=$(mld_payload_get 132) -p 100 -q
304}
305
306ipv4_dhcp_test()
307{
308	devlink_trap_stats_test "IPv4 DHCP Port 67" "ipv4_dhcp" \
309		$MZ $h1 -c 1 -a own -b bcast -A 0.0.0.0 -B 255.255.255.255 \
310		-t udp sp=68,dp=67 -p 100 -q
311
312	devlink_trap_stats_test "IPv4 DHCP Port 68" "ipv4_dhcp" \
313		$MZ $h1 -c 1 -a own -b $(mac_get $rp1) -A 192.0.2.1 \
314		-B 255.255.255.255 -t udp sp=67,dp=68 -p 100 -q
315}
316
317ipv6_dhcp_test()
318{
319	devlink_trap_stats_test "IPv6 DHCP Port 547" "ipv6_dhcp" \
320		$MZ $h1 -6 -c 1 -A fe80::1 -B ff02::1:2 -t udp sp=546,dp=547 \
321		-p 100 -q
322
323	devlink_trap_stats_test "IPv6 DHCP Port 546" "ipv6_dhcp" \
324		$MZ $h1 -6 -c 1 -A fe80::1 -B ff02::1:2 -t udp sp=547,dp=546 \
325		-p 100 -q
326}
327
328arp_request_test()
329{
330	devlink_trap_stats_test "ARP Request" "arp_request" \
331		$MZ $h1 -c 1 -a own -b bcast -t arp request -p 100 -q
332}
333
334arp_response_test()
335{
336	devlink_trap_stats_test "ARP Response" "arp_response" \
337		$MZ $h1 -c 1 -a own -b $(mac_get $rp1) -t arp reply -p 100 -q
338}
339
340icmpv6_header_get()
341{
342	local type=$1; shift
343	local p
344
345	type=$(printf "%x" $type)
346	p=$(:
347		)"$type:"$(			: ICMPv6.type
348		)"00:"$(			: ICMPv6.code
349		)"00:"$(			: ICMPv6.checksum
350		)
351	echo $p
352}
353
354ipv6_neigh_solicit_test()
355{
356	devlink_trap_stats_test "IPv6 Neighbour Solicitation" \
357		"ipv6_neigh_solicit" $MZ $h1 -6 -c 1 \
358		-A fe80::1 -B ff02::1:ff00:02 \
359		-t ip hop=1,next=58,payload=$(icmpv6_header_get 135) -p 100 -q
360}
361
362ipv6_neigh_advert_test()
363{
364	devlink_trap_stats_test "IPv6 Neighbour Advertisement" \
365		"ipv6_neigh_advert" $MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
366		-A fe80::1 -B 2001:db8:1::2 \
367		-t ip hop=1,next=58,payload=$(icmpv6_header_get 136) -p 100 -q
368}
369
370ipv4_bfd_test()
371{
372	devlink_trap_stats_test "IPv4 BFD Control - Port 3784" "ipv4_bfd" \
373		$MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
374		-A 192.0.2.1 -B 192.0.2.2 -t udp sp=49153,dp=3784 -p 100 -q
375
376	devlink_trap_stats_test "IPv4 BFD Echo - Port 3785" "ipv4_bfd" \
377		$MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
378		-A 192.0.2.1 -B 192.0.2.2 -t udp sp=49153,dp=3785 -p 100 -q
379}
380
381ipv6_bfd_test()
382{
383	devlink_trap_stats_test "IPv6 BFD Control - Port 3784" "ipv6_bfd" \
384		$MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
385		-A 2001:db8:1::1 -B 2001:db8:1::2 \
386		-t udp sp=49153,dp=3784 -p 100 -q
387
388	devlink_trap_stats_test "IPv6 BFD Echo - Port 3785" "ipv6_bfd" \
389		$MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
390		-A 2001:db8:1::1 -B 2001:db8:1::2 \
391		-t udp sp=49153,dp=3785 -p 100 -q
392}
393
394ipv4_ospf_test()
395{
396	devlink_trap_stats_test "IPv4 OSPF - Multicast" "ipv4_ospf" \
397		$MZ $h1 -c 1 -a own -b 01:00:5e:00:00:05 \
398		-A 192.0.2.1 -B 224.0.0.5 -t ip proto=89 -p 100 -q
399
400	devlink_trap_stats_test "IPv4 OSPF - Unicast" "ipv4_ospf" \
401		$MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
402		-A 192.0.2.1 -B 192.0.2.2 -t ip proto=89 -p 100 -q
403}
404
405ipv6_ospf_test()
406{
407	devlink_trap_stats_test "IPv6 OSPF - Multicast" "ipv6_ospf" \
408		$MZ $h1 -6 -c 1 -a own -b 33:33:00:00:00:05 \
409		-A fe80::1 -B ff02::5 -t ip next=89 -p 100 -q
410
411	devlink_trap_stats_test "IPv6 OSPF - Unicast" "ipv6_ospf" \
412		$MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
413		-A 2001:db8:1::1 -B 2001:db8:1::2 -t ip next=89 -p 100 -q
414}
415
416ipv4_bgp_test()
417{
418	devlink_trap_stats_test "IPv4 BGP" "ipv4_bgp" \
419		$MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
420		-A 192.0.2.1 -B 192.0.2.2 -t tcp sp=54321,dp=179,flags=rst \
421		-p 100 -q
422}
423
424ipv6_bgp_test()
425{
426	devlink_trap_stats_test "IPv6 BGP" "ipv6_bgp" \
427		$MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
428		-A 2001:db8:1::1 -B 2001:db8:1::2 \
429		-t tcp sp=54321,dp=179,flags=rst -p 100 -q
430}
431
432ipv4_vrrp_test()
433{
434	devlink_trap_stats_test "IPv4 VRRP" "ipv4_vrrp" \
435		$MZ $h1 -c 1 -a own -b 01:00:5e:00:00:12 \
436		-A 192.0.2.1 -B 224.0.0.18 -t ip proto=112 -p 100 -q
437}
438
439ipv6_vrrp_test()
440{
441	devlink_trap_stats_test "IPv6 VRRP" "ipv6_vrrp" \
442		$MZ $h1 -6 -c 1 -a own -b 33:33:00:00:00:12 \
443		-A fe80::1 -B ff02::12 -t ip next=112 -p 100 -q
444}
445
446ipv4_pim_test()
447{
448	devlink_trap_stats_test "IPv4 PIM - Multicast" "ipv4_pim" \
449		$MZ $h1 -c 1 -a own -b 01:00:5e:00:00:0d \
450		-A 192.0.2.1 -B 224.0.0.13 -t ip proto=103 -p 100 -q
451
452	devlink_trap_stats_test "IPv4 PIM - Unicast" "ipv4_pim" \
453		$MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
454		-A 192.0.2.1 -B 192.0.2.2 -t ip proto=103 -p 100 -q
455}
456
457ipv6_pim_test()
458{
459	devlink_trap_stats_test "IPv6 PIM - Multicast" "ipv6_pim" \
460		$MZ $h1 -6 -c 1 -a own -b 33:33:00:00:00:0d \
461		-A fe80::1 -B ff02::d -t ip next=103 -p 100 -q
462
463	devlink_trap_stats_test "IPv6 PIM - Unicast" "ipv6_pim" \
464		$MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
465		-A fe80::1 -B 2001:db8:1::2 -t ip next=103 -p 100 -q
466}
467
468uc_loopback_test()
469{
470	# Add neighbours to the fake destination IPs, so that the packets are
471	# routed in the device and not trapped due to an unresolved neighbour
472	# exception.
473	ip -4 neigh add 192.0.2.3 lladdr 00:11:22:33:44:55 nud permanent \
474		dev $rp1
475	ip -6 neigh add 2001:db8:1::3 lladdr 00:11:22:33:44:55 nud permanent \
476		dev $rp1
477
478	devlink_trap_stats_test "IPv4 Unicast Loopback" "uc_loopback" \
479		$MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
480		-A 192.0.2.1 -B 192.0.2.3 -t udp sp=54321,dp=12345 -p 100 -q
481
482	devlink_trap_stats_test "IPv6 Unicast Loopback" "uc_loopback" \
483		$MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
484		-A 2001:db8:1::1 -B 2001:db8:1::3 -t udp sp=54321,dp=12345 \
485		-p 100 -q
486
487	ip -6 neigh del 2001:db8:1::3 dev $rp1
488	ip -4 neigh del 192.0.2.3 dev $rp1
489}
490
491local_route_test()
492{
493	# Use a fake source IP to prevent the trap from being triggered twice
494	# when the router sends back a port unreachable message.
495	devlink_trap_stats_test "IPv4 Local Route" "local_route" \
496		$MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
497		-A 192.0.2.3 -B 192.0.2.2 -t udp sp=54321,dp=12345 -p 100 -q
498
499	devlink_trap_stats_test "IPv6 Local Route" "local_route" \
500		$MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
501		-A 2001:db8:1::3 -B 2001:db8:1::2 -t udp sp=54321,sp=12345 \
502		-p 100 -q
503}
504
505external_route_test()
506{
507	# Add a dummy device through which the incoming packets should be
508	# routed.
509	ip link add name dummy10 up type dummy
510	ip address add 203.0.113.1/24 dev dummy10
511	ip -6 address add 2001:db8:10::1/64 dev dummy10
512
513	devlink_trap_stats_test "IPv4 External Route" "external_route" \
514		$MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
515		-A 192.0.2.1 -B 203.0.113.2 -t udp sp=54321,dp=12345 -p 100 -q
516
517	devlink_trap_stats_test "IPv6 External Route" "external_route" \
518		$MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
519		-A 2001:db8:1::1 -B 2001:db8:10::2 -t udp sp=54321,sp=12345 \
520		-p 100 -q
521
522	ip -6 address del 2001:db8:10::1/64 dev dummy10
523	ip address del 203.0.113.1/24 dev dummy10
524	ip link del dev dummy10
525}
526
527ipv6_uc_dip_link_local_scope_test()
528{
529	# Add a dummy link-local prefix route to allow the packet to be routed.
530	ip -6 route add fe80:1::/64 dev $rp2
531
532	devlink_trap_stats_test \
533		"IPv6 Unicast Destination IP With Link-Local Scope" \
534		"ipv6_uc_dip_link_local_scope" \
535		$MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
536		-A fe80::1 -B fe80:1::2 -t udp sp=54321,sp=12345 \
537		-p 100 -q
538
539	ip -6 route del fe80:1::/64 dev $rp2
540}
541
542ipv4_router_alert_get()
543{
544	local p
545
546	# https://en.wikipedia.org/wiki/IPv4#Options
547	p=$(:
548		)"94:"$(			: Option Number
549		)"04:"$(			: Option Length
550		)"00:00:"$(			: Option Data
551		)
552	echo $p
553}
554
555ipv4_router_alert_test()
556{
557	devlink_trap_stats_test "IPv4 Router Alert" "ipv4_router_alert" \
558		$MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
559		-A 192.0.2.1 -B 198.51.100.3 \
560		-t ip option=$(ipv4_router_alert_get) -p 100 -q
561}
562
563ipv6_router_alert_get()
564{
565	local p
566
567	# https://en.wikipedia.org/wiki/IPv6_packet#Hop-by-hop_options_and_destination_options
568	# https://tools.ietf.org/html/rfc2711#section-2.1
569	p=$(:
570		)"11:"$(			: Next Header - UDP
571		)"00:"$(			: Hdr Ext Len
572		)"05:02:00:00:00:00:"$(		: Option Data
573		)
574	echo $p
575}
576
577ipv6_router_alert_test()
578{
579	devlink_trap_stats_test "IPv6 Router Alert" "ipv6_router_alert" \
580		$MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
581		-A 2001:db8:1::1 -B 2001:db8:1::3 \
582		-t ip next=0,payload=$(ipv6_router_alert_get) -p 100 -q
583}
584
585ipv6_dip_all_nodes_test()
586{
587	devlink_trap_stats_test "IPv6 Destination IP \"All Nodes Address\"" \
588		"ipv6_dip_all_nodes" \
589		$MZ $h1 -6 -c 1 -a own -b 33:33:00:00:00:01 \
590		-A 2001:db8:1::1 -B ff02::1 -t udp sp=12345,dp=54321 -p 100 -q
591}
592
593ipv6_dip_all_routers_test()
594{
595	devlink_trap_stats_test "IPv6 Destination IP \"All Routers Address\"" \
596		"ipv6_dip_all_routers" \
597		$MZ $h1 -6 -c 1 -a own -b 33:33:00:00:00:02 \
598		-A 2001:db8:1::1 -B ff02::2 -t udp sp=12345,dp=54321 -p 100 -q
599}
600
601ipv6_router_solicit_test()
602{
603	devlink_trap_stats_test "IPv6 Router Solicitation" \
604		"ipv6_router_solicit" \
605		$MZ $h1 -6 -c 1 -a own -b 33:33:00:00:00:02 \
606		-A fe80::1 -B ff02::2 \
607		-t ip hop=1,next=58,payload=$(icmpv6_header_get 133) -p 100 -q
608}
609
610ipv6_router_advert_test()
611{
612	devlink_trap_stats_test "IPv6 Router Advertisement" \
613		"ipv6_router_advert" \
614		$MZ $h1 -6 -c 1 -a own -b 33:33:00:00:00:01 \
615		-A fe80::1 -B ff02::1 \
616		-t ip hop=1,next=58,payload=$(icmpv6_header_get 134) -p 100 -q
617}
618
619ipv6_redirect_test()
620{
621	devlink_trap_stats_test "IPv6 Redirect Message" \
622		"ipv6_redirect" \
623		$MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
624		-A fe80::1 -B 2001:db8:1::2 \
625		-t ip hop=1,next=58,payload=$(icmpv6_header_get 137) -p 100 -q
626}
627
628ptp_event_test()
629{
630	mlxsw_only_on_spectrum 1 || return
631
632	# PTP Sync (0)
633	devlink_trap_stats_test "PTP Time-Critical Event Message" "ptp_event" \
634		$MZ $h1 -c 1 -a own -b 01:00:5e:00:01:81 \
635		-A 192.0.2.1 -B 224.0.1.129 \
636		-t udp sp=12345,dp=319,payload=10 -p 100 -q
637}
638
639ptp_general_test()
640{
641	mlxsw_only_on_spectrum 1 || return
642
643	# PTP Announce (b)
644	devlink_trap_stats_test "PTP General Message" "ptp_general" \
645		$MZ $h1 -c 1 -a own -b 01:00:5e:00:01:81 \
646		-A 192.0.2.1 -B 224.0.1.129 \
647		-t udp sp=12345,dp=320,payload=1b -p 100 -q
648}
649
650flow_action_sample_test()
651{
652	# Install a filter that samples every incoming packet.
653	tc qdisc add dev $rp1 clsact
654	tc filter add dev $rp1 ingress proto all pref 1 handle 101 matchall \
655		skip_sw action sample rate 1 group 1
656
657	devlink_trap_stats_test "Flow Sampling" "flow_action_sample" \
658		$MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
659		-A 192.0.2.1 -B 198.51.100.1 -t udp sp=12345,dp=54321 -p 100 -q
660
661	tc filter del dev $rp1 ingress proto all pref 1 handle 101 matchall
662	tc qdisc del dev $rp1 clsact
663}
664
665flow_action_trap_test()
666{
667	# Install a filter that traps a specific flow.
668	tc qdisc add dev $rp1 clsact
669	tc filter add dev $rp1 ingress proto ip pref 1 handle 101 flower \
670		skip_sw ip_proto udp src_port 12345 dst_port 54321 action trap
671
672	devlink_trap_stats_test "Flow Trapping (Logging)" "flow_action_trap" \
673		$MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
674		-A 192.0.2.1 -B 198.51.100.1 -t udp sp=12345,dp=54321 -p 100 -q
675
676	tc filter del dev $rp1 ingress proto ip pref 1 handle 101 flower
677	tc qdisc del dev $rp1 clsact
678}
679
680trap cleanup EXIT
681
682setup_prepare
683setup_wait
684
685tests_run
686
687exit $EXIT_STATUS
688