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