Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 #
0004 # Test devlink-trap control trap functionality over mlxsw. Each registered
0005 # control packet trap is tested to make sure it is triggered under the right
0006 # conditions.
0007 #
0008 # +---------------------------------+
0009 # | H1 (vrf)                        |
0010 # |    + $h1                        |
0011 # |    | 192.0.2.1/24               |
0012 # |    | 2001:db8:1::1/64           |
0013 # |    |                            |
0014 # |    |  default via 192.0.2.2     |
0015 # |    |  default via 2001:db8:1::2 |
0016 # +----|----------------------------+
0017 #      |
0018 # +----|----------------------------------------------------------------------+
0019 # | SW |                                                                      |
0020 # |    + $rp1                                                                 |
0021 # |        192.0.2.2/24                                                       |
0022 # |        2001:db8:1::2/64                                                   |
0023 # |                                                                           |
0024 # |        2001:db8:2::2/64                                                   |
0025 # |        198.51.100.2/24                                                    |
0026 # |    + $rp2                                                                 |
0027 # |    |                                                                      |
0028 # +----|----------------------------------------------------------------------+
0029 #      |
0030 # +----|----------------------------+
0031 # |    |  default via 198.51.100.2  |
0032 # |    |  default via 2001:db8:2::2 |
0033 # |    |                            |
0034 # |    | 2001:db8:2::1/64           |
0035 # |    | 198.51.100.1/24            |
0036 # |    + $h2                        |
0037 # | H2 (vrf)                        |
0038 # +---------------------------------+
0039 
0040 lib_dir=$(dirname $0)/../../../net/forwarding
0041 
0042 ALL_TESTS="
0043         stp_test
0044         lacp_test
0045         lldp_test
0046         igmp_query_test
0047         igmp_v1_report_test
0048         igmp_v2_report_test
0049         igmp_v3_report_test
0050         igmp_v2_leave_test
0051         mld_query_test
0052         mld_v1_report_test
0053         mld_v2_report_test
0054         mld_v1_done_test
0055         ipv4_dhcp_test
0056         ipv6_dhcp_test
0057         arp_request_test
0058         arp_response_test
0059         ipv6_neigh_solicit_test
0060         ipv6_neigh_advert_test
0061         ipv4_bfd_test
0062         ipv6_bfd_test
0063         ipv4_ospf_test
0064         ipv6_ospf_test
0065         ipv4_bgp_test
0066         ipv6_bgp_test
0067         ipv4_vrrp_test
0068         ipv6_vrrp_test
0069         ipv4_pim_test
0070         ipv6_pim_test
0071         uc_loopback_test
0072         local_route_test
0073         external_route_test
0074         ipv6_uc_dip_link_local_scope_test
0075         ipv4_router_alert_test
0076         ipv6_router_alert_test
0077         ipv6_dip_all_nodes_test
0078         ipv6_dip_all_routers_test
0079         ipv6_router_solicit_test
0080         ipv6_router_advert_test
0081         ipv6_redirect_test
0082         ptp_event_test
0083         ptp_general_test
0084         flow_action_sample_test
0085         flow_action_trap_test
0086 "
0087 NUM_NETIFS=4
0088 source $lib_dir/lib.sh
0089 source $lib_dir/devlink_lib.sh
0090 source mlxsw_lib.sh
0091 
0092 h1_create()
0093 {
0094         simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64
0095 
0096         ip -4 route add default vrf v$h1 nexthop via 192.0.2.2
0097         ip -6 route add default vrf v$h1 nexthop via 2001:db8:1::2
0098 }
0099 
0100 h1_destroy()
0101 {
0102         ip -6 route del default vrf v$h1 nexthop via 2001:db8:1::2
0103         ip -4 route del default vrf v$h1 nexthop via 192.0.2.2
0104 
0105         simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64
0106 }
0107 
0108 h2_create()
0109 {
0110         simple_if_init $h2 198.51.100.1/24 2001:db8:2::1/64
0111 
0112         ip -4 route add default vrf v$h2 nexthop via 198.51.100.2
0113         ip -6 route add default vrf v$h2 nexthop via 2001:db8:2::2
0114 }
0115 
0116 h2_destroy()
0117 {
0118         ip -6 route del default vrf v$h2 nexthop via 2001:db8:2::2
0119         ip -4 route del default vrf v$h2 nexthop via 198.51.100.2
0120 
0121         simple_if_fini $h2 198.51.100.1/24 2001:db8:2::1/64
0122 }
0123 
0124 router_create()
0125 {
0126         ip link set dev $rp1 up
0127         ip link set dev $rp2 up
0128 
0129         __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
0130         __addr_add_del $rp2 add 198.51.100.2/24 2001:db8:2::2/64
0131 }
0132 
0133 router_destroy()
0134 {
0135         __addr_add_del $rp2 del 198.51.100.2/24 2001:db8:2::2/64
0136         __addr_add_del $rp1 del 192.0.2.2/24 2001:db8:1::2/64
0137 
0138         ip link set dev $rp2 down
0139         ip link set dev $rp1 down
0140 }
0141 
0142 setup_prepare()
0143 {
0144         h1=${NETIFS[p1]}
0145         rp1=${NETIFS[p2]}
0146 
0147         rp2=${NETIFS[p3]}
0148         h2=${NETIFS[p4]}
0149 
0150         vrf_prepare
0151         forwarding_enable
0152 
0153         h1_create
0154         h2_create
0155         router_create
0156 }
0157 
0158 cleanup()
0159 {
0160         pre_cleanup
0161 
0162         router_destroy
0163         h2_destroy
0164         h1_destroy
0165 
0166         forwarding_restore
0167         vrf_cleanup
0168 }
0169 
0170 stp_test()
0171 {
0172         devlink_trap_stats_test "STP" "stp" $MZ $h1 -c 1 -t bpdu -q
0173 }
0174 
0175 lacp_payload_get()
0176 {
0177         local source_mac=$1; shift
0178         local p
0179 
0180         p=$(:
0181                 )"01:80:C2:00:00:02:"$(       : ETH daddr
0182                 )"$source_mac:"$(             : ETH saddr
0183                 )"88:09:"$(                   : ETH type
0184                 )
0185         echo $p
0186 }
0187 
0188 lacp_test()
0189 {
0190         local h1mac=$(mac_get $h1)
0191 
0192         devlink_trap_stats_test "LACP" "lacp" $MZ $h1 -c 1 \
0193                 $(lacp_payload_get $h1mac) -p 100 -q
0194 }
0195 
0196 lldp_payload_get()
0197 {
0198         local source_mac=$1; shift
0199         local p
0200 
0201         p=$(:
0202                 )"01:80:C2:00:00:0E:"$(       : ETH daddr
0203                 )"$source_mac:"$(             : ETH saddr
0204                 )"88:CC:"$(                   : ETH type
0205                 )
0206         echo $p
0207 }
0208 
0209 lldp_test()
0210 {
0211         local h1mac=$(mac_get $h1)
0212 
0213         devlink_trap_stats_test "LLDP" "lldp" $MZ $h1 -c 1 \
0214                 $(lldp_payload_get $h1mac) -p 100 -q
0215 }
0216 
0217 igmp_query_test()
0218 {
0219         # IGMP (IP Protocol 2) Membership Query (Type 0x11)
0220         devlink_trap_stats_test "IGMP Membership Query" "igmp_query" \
0221                 $MZ $h1 -c 1 -a own -b 01:00:5E:00:00:01 \
0222                 -A 192.0.2.1 -B 224.0.0.1 -t ip proto=2,p=11 -p 100 -q
0223 }
0224 
0225 igmp_v1_report_test()
0226 {
0227         # IGMP (IP Protocol 2) Version 1 Membership Report (Type 0x12)
0228         devlink_trap_stats_test "IGMP Version 1 Membership Report" \
0229                 "igmp_v1_report" $MZ $h1 -c 1 -a own -b 01:00:5E:00:00:01 \
0230                 -A 192.0.2.1 -B 244.0.0.1 -t ip proto=2,p=12 -p 100 -q
0231 }
0232 
0233 igmp_v2_report_test()
0234 {
0235         # IGMP (IP Protocol 2) Version 2 Membership Report (Type 0x16)
0236         devlink_trap_stats_test "IGMP Version 2 Membership Report" \
0237                 "igmp_v2_report" $MZ $h1 -c 1 -a own -b 01:00:5E:00:00:01 \
0238                 -A 192.0.2.1 -B 244.0.0.1 -t ip proto=2,p=16 -p 100 -q
0239 }
0240 
0241 igmp_v3_report_test()
0242 {
0243         # IGMP (IP Protocol 2) Version 3 Membership Report (Type 0x22)
0244         devlink_trap_stats_test "IGMP Version 3 Membership Report" \
0245                 "igmp_v3_report" $MZ $h1 -c 1 -a own -b 01:00:5E:00:00:01 \
0246                 -A 192.0.2.1 -B 244.0.0.1 -t ip proto=2,p=22 -p 100 -q
0247 }
0248 
0249 igmp_v2_leave_test()
0250 {
0251         # IGMP (IP Protocol 2) Version 2 Leave Group (Type 0x17)
0252         devlink_trap_stats_test "IGMP Version 2 Leave Group" \
0253                 "igmp_v2_leave" $MZ $h1 -c 1 -a own -b 01:00:5E:00:00:02 \
0254                 -A 192.0.2.1 -B 224.0.0.2 -t ip proto=2,p=17 -p 100 -q
0255 }
0256 
0257 mld_payload_get()
0258 {
0259         local type=$1; shift
0260         local p
0261 
0262         type=$(printf "%x" $type)
0263         p=$(:
0264                 )"3A:"$(                        : Next Header - ICMPv6
0265                 )"00:"$(                        : Hdr Ext Len
0266                 )"00:00:00:00:00:00:"$(         : Options and Padding
0267                 )"$type:"$(                     : ICMPv6.type
0268                 )"00:"$(                        : ICMPv6.code
0269                 )"00:"$(                        : ICMPv6.checksum
0270                 )
0271         echo $p
0272 }
0273 
0274 mld_query_test()
0275 {
0276         # MLD Multicast Listener Query (Type 130)
0277         devlink_trap_stats_test "MLD Multicast Listener Query" "mld_query" \
0278                 $MZ $h1 -6 -c 1 -A fe80::1 -B ff02::1 \
0279                 -t ip hop=1,next=0,payload=$(mld_payload_get 130) -p 100 -q
0280 }
0281 
0282 mld_v1_report_test()
0283 {
0284         # MLD Version 1 Multicast Listener Report (Type 131)
0285         devlink_trap_stats_test "MLD Version 1 Multicast Listener Report" \
0286                 "mld_v1_report" $MZ $h1 -6 -c 1 -A fe80::1 -B ff02::16 \
0287                 -t ip hop=1,next=0,payload=$(mld_payload_get 131) -p 100 -q
0288 }
0289 
0290 mld_v2_report_test()
0291 {
0292         # MLD Version 2 Multicast Listener Report (Type 143)
0293         devlink_trap_stats_test "MLD Version 2 Multicast Listener Report" \
0294                 "mld_v2_report" $MZ $h1 -6 -c 1 -A fe80::1 -B ff02::16 \
0295                 -t ip hop=1,next=0,payload=$(mld_payload_get 143) -p 100 -q
0296 }
0297 
0298 mld_v1_done_test()
0299 {
0300         # MLD Version 1 Multicast Listener Done (Type 132)
0301         devlink_trap_stats_test "MLD Version 1 Multicast Listener Done" \
0302                 "mld_v1_done" $MZ $h1 -6 -c 1 -A fe80::1 -B ff02::16 \
0303                 -t ip hop=1,next=0,payload=$(mld_payload_get 132) -p 100 -q
0304 }
0305 
0306 ipv4_dhcp_test()
0307 {
0308         devlink_trap_stats_test "IPv4 DHCP Port 67" "ipv4_dhcp" \
0309                 $MZ $h1 -c 1 -a own -b bcast -A 0.0.0.0 -B 255.255.255.255 \
0310                 -t udp sp=68,dp=67 -p 100 -q
0311 
0312         devlink_trap_stats_test "IPv4 DHCP Port 68" "ipv4_dhcp" \
0313                 $MZ $h1 -c 1 -a own -b $(mac_get $rp1) -A 192.0.2.1 \
0314                 -B 255.255.255.255 -t udp sp=67,dp=68 -p 100 -q
0315 }
0316 
0317 ipv6_dhcp_test()
0318 {
0319         devlink_trap_stats_test "IPv6 DHCP Port 547" "ipv6_dhcp" \
0320                 $MZ $h1 -6 -c 1 -A fe80::1 -B ff02::1:2 -t udp sp=546,dp=547 \
0321                 -p 100 -q
0322 
0323         devlink_trap_stats_test "IPv6 DHCP Port 546" "ipv6_dhcp" \
0324                 $MZ $h1 -6 -c 1 -A fe80::1 -B ff02::1:2 -t udp sp=547,dp=546 \
0325                 -p 100 -q
0326 }
0327 
0328 arp_request_test()
0329 {
0330         devlink_trap_stats_test "ARP Request" "arp_request" \
0331                 $MZ $h1 -c 1 -a own -b bcast -t arp request -p 100 -q
0332 }
0333 
0334 arp_response_test()
0335 {
0336         devlink_trap_stats_test "ARP Response" "arp_response" \
0337                 $MZ $h1 -c 1 -a own -b $(mac_get $rp1) -t arp reply -p 100 -q
0338 }
0339 
0340 icmpv6_header_get()
0341 {
0342         local type=$1; shift
0343         local p
0344 
0345         type=$(printf "%x" $type)
0346         p=$(:
0347                 )"$type:"$(                     : ICMPv6.type
0348                 )"00:"$(                        : ICMPv6.code
0349                 )"00:"$(                        : ICMPv6.checksum
0350                 )
0351         echo $p
0352 }
0353 
0354 ipv6_neigh_solicit_test()
0355 {
0356         devlink_trap_stats_test "IPv6 Neighbour Solicitation" \
0357                 "ipv6_neigh_solicit" $MZ $h1 -6 -c 1 \
0358                 -A fe80::1 -B ff02::1:ff00:02 \
0359                 -t ip hop=1,next=58,payload=$(icmpv6_header_get 135) -p 100 -q
0360 }
0361 
0362 ipv6_neigh_advert_test()
0363 {
0364         devlink_trap_stats_test "IPv6 Neighbour Advertisement" \
0365                 "ipv6_neigh_advert" $MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
0366                 -A fe80::1 -B 2001:db8:1::2 \
0367                 -t ip hop=1,next=58,payload=$(icmpv6_header_get 136) -p 100 -q
0368 }
0369 
0370 ipv4_bfd_test()
0371 {
0372         devlink_trap_stats_test "IPv4 BFD Control - Port 3784" "ipv4_bfd" \
0373                 $MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
0374                 -A 192.0.2.1 -B 192.0.2.2 -t udp sp=49153,dp=3784 -p 100 -q
0375 
0376         devlink_trap_stats_test "IPv4 BFD Echo - Port 3785" "ipv4_bfd" \
0377                 $MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
0378                 -A 192.0.2.1 -B 192.0.2.2 -t udp sp=49153,dp=3785 -p 100 -q
0379 }
0380 
0381 ipv6_bfd_test()
0382 {
0383         devlink_trap_stats_test "IPv6 BFD Control - Port 3784" "ipv6_bfd" \
0384                 $MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
0385                 -A 2001:db8:1::1 -B 2001:db8:1::2 \
0386                 -t udp sp=49153,dp=3784 -p 100 -q
0387 
0388         devlink_trap_stats_test "IPv6 BFD Echo - Port 3785" "ipv6_bfd" \
0389                 $MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
0390                 -A 2001:db8:1::1 -B 2001:db8:1::2 \
0391                 -t udp sp=49153,dp=3785 -p 100 -q
0392 }
0393 
0394 ipv4_ospf_test()
0395 {
0396         devlink_trap_stats_test "IPv4 OSPF - Multicast" "ipv4_ospf" \
0397                 $MZ $h1 -c 1 -a own -b 01:00:5e:00:00:05 \
0398                 -A 192.0.2.1 -B 224.0.0.5 -t ip proto=89 -p 100 -q
0399 
0400         devlink_trap_stats_test "IPv4 OSPF - Unicast" "ipv4_ospf" \
0401                 $MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
0402                 -A 192.0.2.1 -B 192.0.2.2 -t ip proto=89 -p 100 -q
0403 }
0404 
0405 ipv6_ospf_test()
0406 {
0407         devlink_trap_stats_test "IPv6 OSPF - Multicast" "ipv6_ospf" \
0408                 $MZ $h1 -6 -c 1 -a own -b 33:33:00:00:00:05 \
0409                 -A fe80::1 -B ff02::5 -t ip next=89 -p 100 -q
0410 
0411         devlink_trap_stats_test "IPv6 OSPF - Unicast" "ipv6_ospf" \
0412                 $MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
0413                 -A 2001:db8:1::1 -B 2001:db8:1::2 -t ip next=89 -p 100 -q
0414 }
0415 
0416 ipv4_bgp_test()
0417 {
0418         devlink_trap_stats_test "IPv4 BGP" "ipv4_bgp" \
0419                 $MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
0420                 -A 192.0.2.1 -B 192.0.2.2 -t tcp sp=54321,dp=179,flags=rst \
0421                 -p 100 -q
0422 }
0423 
0424 ipv6_bgp_test()
0425 {
0426         devlink_trap_stats_test "IPv6 BGP" "ipv6_bgp" \
0427                 $MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
0428                 -A 2001:db8:1::1 -B 2001:db8:1::2 \
0429                 -t tcp sp=54321,dp=179,flags=rst -p 100 -q
0430 }
0431 
0432 ipv4_vrrp_test()
0433 {
0434         devlink_trap_stats_test "IPv4 VRRP" "ipv4_vrrp" \
0435                 $MZ $h1 -c 1 -a own -b 01:00:5e:00:00:12 \
0436                 -A 192.0.2.1 -B 224.0.0.18 -t ip proto=112 -p 100 -q
0437 }
0438 
0439 ipv6_vrrp_test()
0440 {
0441         devlink_trap_stats_test "IPv6 VRRP" "ipv6_vrrp" \
0442                 $MZ $h1 -6 -c 1 -a own -b 33:33:00:00:00:12 \
0443                 -A fe80::1 -B ff02::12 -t ip next=112 -p 100 -q
0444 }
0445 
0446 ipv4_pim_test()
0447 {
0448         devlink_trap_stats_test "IPv4 PIM - Multicast" "ipv4_pim" \
0449                 $MZ $h1 -c 1 -a own -b 01:00:5e:00:00:0d \
0450                 -A 192.0.2.1 -B 224.0.0.13 -t ip proto=103 -p 100 -q
0451 
0452         devlink_trap_stats_test "IPv4 PIM - Unicast" "ipv4_pim" \
0453                 $MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
0454                 -A 192.0.2.1 -B 192.0.2.2 -t ip proto=103 -p 100 -q
0455 }
0456 
0457 ipv6_pim_test()
0458 {
0459         devlink_trap_stats_test "IPv6 PIM - Multicast" "ipv6_pim" \
0460                 $MZ $h1 -6 -c 1 -a own -b 33:33:00:00:00:0d \
0461                 -A fe80::1 -B ff02::d -t ip next=103 -p 100 -q
0462 
0463         devlink_trap_stats_test "IPv6 PIM - Unicast" "ipv6_pim" \
0464                 $MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
0465                 -A fe80::1 -B 2001:db8:1::2 -t ip next=103 -p 100 -q
0466 }
0467 
0468 uc_loopback_test()
0469 {
0470         # Add neighbours to the fake destination IPs, so that the packets are
0471         # routed in the device and not trapped due to an unresolved neighbour
0472         # exception.
0473         ip -4 neigh add 192.0.2.3 lladdr 00:11:22:33:44:55 nud permanent \
0474                 dev $rp1
0475         ip -6 neigh add 2001:db8:1::3 lladdr 00:11:22:33:44:55 nud permanent \
0476                 dev $rp1
0477 
0478         devlink_trap_stats_test "IPv4 Unicast Loopback" "uc_loopback" \
0479                 $MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
0480                 -A 192.0.2.1 -B 192.0.2.3 -t udp sp=54321,dp=12345 -p 100 -q
0481 
0482         devlink_trap_stats_test "IPv6 Unicast Loopback" "uc_loopback" \
0483                 $MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
0484                 -A 2001:db8:1::1 -B 2001:db8:1::3 -t udp sp=54321,dp=12345 \
0485                 -p 100 -q
0486 
0487         ip -6 neigh del 2001:db8:1::3 dev $rp1
0488         ip -4 neigh del 192.0.2.3 dev $rp1
0489 }
0490 
0491 local_route_test()
0492 {
0493         # Use a fake source IP to prevent the trap from being triggered twice
0494         # when the router sends back a port unreachable message.
0495         devlink_trap_stats_test "IPv4 Local Route" "local_route" \
0496                 $MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
0497                 -A 192.0.2.3 -B 192.0.2.2 -t udp sp=54321,dp=12345 -p 100 -q
0498 
0499         devlink_trap_stats_test "IPv6 Local Route" "local_route" \
0500                 $MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
0501                 -A 2001:db8:1::3 -B 2001:db8:1::2 -t udp sp=54321,sp=12345 \
0502                 -p 100 -q
0503 }
0504 
0505 external_route_test()
0506 {
0507         # Add a dummy device through which the incoming packets should be
0508         # routed.
0509         ip link add name dummy10 up type dummy
0510         ip address add 203.0.113.1/24 dev dummy10
0511         ip -6 address add 2001:db8:10::1/64 dev dummy10
0512 
0513         devlink_trap_stats_test "IPv4 External Route" "external_route" \
0514                 $MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
0515                 -A 192.0.2.1 -B 203.0.113.2 -t udp sp=54321,dp=12345 -p 100 -q
0516 
0517         devlink_trap_stats_test "IPv6 External Route" "external_route" \
0518                 $MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
0519                 -A 2001:db8:1::1 -B 2001:db8:10::2 -t udp sp=54321,sp=12345 \
0520                 -p 100 -q
0521 
0522         ip -6 address del 2001:db8:10::1/64 dev dummy10
0523         ip address del 203.0.113.1/24 dev dummy10
0524         ip link del dev dummy10
0525 }
0526 
0527 ipv6_uc_dip_link_local_scope_test()
0528 {
0529         # Add a dummy link-local prefix route to allow the packet to be routed.
0530         ip -6 route add fe80:1::/64 dev $rp2
0531 
0532         devlink_trap_stats_test \
0533                 "IPv6 Unicast Destination IP With Link-Local Scope" \
0534                 "ipv6_uc_dip_link_local_scope" \
0535                 $MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
0536                 -A fe80::1 -B fe80:1::2 -t udp sp=54321,sp=12345 \
0537                 -p 100 -q
0538 
0539         ip -6 route del fe80:1::/64 dev $rp2
0540 }
0541 
0542 ipv4_router_alert_get()
0543 {
0544         local p
0545 
0546         # https://en.wikipedia.org/wiki/IPv4#Options
0547         p=$(:
0548                 )"94:"$(                        : Option Number
0549                 )"04:"$(                        : Option Length
0550                 )"00:00:"$(                     : Option Data
0551                 )
0552         echo $p
0553 }
0554 
0555 ipv4_router_alert_test()
0556 {
0557         devlink_trap_stats_test "IPv4 Router Alert" "ipv4_router_alert" \
0558                 $MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
0559                 -A 192.0.2.1 -B 198.51.100.3 \
0560                 -t ip option=$(ipv4_router_alert_get) -p 100 -q
0561 }
0562 
0563 ipv6_router_alert_get()
0564 {
0565         local p
0566 
0567         # https://en.wikipedia.org/wiki/IPv6_packet#Hop-by-hop_options_and_destination_options
0568         # https://tools.ietf.org/html/rfc2711#section-2.1
0569         p=$(:
0570                 )"11:"$(                        : Next Header - UDP
0571                 )"00:"$(                        : Hdr Ext Len
0572                 )"05:02:00:00:00:00:"$(         : Option Data
0573                 )
0574         echo $p
0575 }
0576 
0577 ipv6_router_alert_test()
0578 {
0579         devlink_trap_stats_test "IPv6 Router Alert" "ipv6_router_alert" \
0580                 $MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
0581                 -A 2001:db8:1::1 -B 2001:db8:1::3 \
0582                 -t ip next=0,payload=$(ipv6_router_alert_get) -p 100 -q
0583 }
0584 
0585 ipv6_dip_all_nodes_test()
0586 {
0587         devlink_trap_stats_test "IPv6 Destination IP \"All Nodes Address\"" \
0588                 "ipv6_dip_all_nodes" \
0589                 $MZ $h1 -6 -c 1 -a own -b 33:33:00:00:00:01 \
0590                 -A 2001:db8:1::1 -B ff02::1 -t udp sp=12345,dp=54321 -p 100 -q
0591 }
0592 
0593 ipv6_dip_all_routers_test()
0594 {
0595         devlink_trap_stats_test "IPv6 Destination IP \"All Routers Address\"" \
0596                 "ipv6_dip_all_routers" \
0597                 $MZ $h1 -6 -c 1 -a own -b 33:33:00:00:00:02 \
0598                 -A 2001:db8:1::1 -B ff02::2 -t udp sp=12345,dp=54321 -p 100 -q
0599 }
0600 
0601 ipv6_router_solicit_test()
0602 {
0603         devlink_trap_stats_test "IPv6 Router Solicitation" \
0604                 "ipv6_router_solicit" \
0605                 $MZ $h1 -6 -c 1 -a own -b 33:33:00:00:00:02 \
0606                 -A fe80::1 -B ff02::2 \
0607                 -t ip hop=1,next=58,payload=$(icmpv6_header_get 133) -p 100 -q
0608 }
0609 
0610 ipv6_router_advert_test()
0611 {
0612         devlink_trap_stats_test "IPv6 Router Advertisement" \
0613                 "ipv6_router_advert" \
0614                 $MZ $h1 -6 -c 1 -a own -b 33:33:00:00:00:01 \
0615                 -A fe80::1 -B ff02::1 \
0616                 -t ip hop=1,next=58,payload=$(icmpv6_header_get 134) -p 100 -q
0617 }
0618 
0619 ipv6_redirect_test()
0620 {
0621         devlink_trap_stats_test "IPv6 Redirect Message" \
0622                 "ipv6_redirect" \
0623                 $MZ $h1 -6 -c 1 -a own -b $(mac_get $rp1) \
0624                 -A fe80::1 -B 2001:db8:1::2 \
0625                 -t ip hop=1,next=58,payload=$(icmpv6_header_get 137) -p 100 -q
0626 }
0627 
0628 ptp_event_test()
0629 {
0630         mlxsw_only_on_spectrum 1 || return
0631 
0632         # PTP Sync (0)
0633         devlink_trap_stats_test "PTP Time-Critical Event Message" "ptp_event" \
0634                 $MZ $h1 -c 1 -a own -b 01:00:5e:00:01:81 \
0635                 -A 192.0.2.1 -B 224.0.1.129 \
0636                 -t udp sp=12345,dp=319,payload=10 -p 100 -q
0637 }
0638 
0639 ptp_general_test()
0640 {
0641         mlxsw_only_on_spectrum 1 || return
0642 
0643         # PTP Announce (b)
0644         devlink_trap_stats_test "PTP General Message" "ptp_general" \
0645                 $MZ $h1 -c 1 -a own -b 01:00:5e:00:01:81 \
0646                 -A 192.0.2.1 -B 224.0.1.129 \
0647                 -t udp sp=12345,dp=320,payload=1b -p 100 -q
0648 }
0649 
0650 flow_action_sample_test()
0651 {
0652         # Install a filter that samples every incoming packet.
0653         tc qdisc add dev $rp1 clsact
0654         tc filter add dev $rp1 ingress proto all pref 1 handle 101 matchall \
0655                 skip_sw action sample rate 1 group 1
0656 
0657         devlink_trap_stats_test "Flow Sampling" "flow_action_sample" \
0658                 $MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
0659                 -A 192.0.2.1 -B 198.51.100.1 -t udp sp=12345,dp=54321 -p 100 -q
0660 
0661         tc filter del dev $rp1 ingress proto all pref 1 handle 101 matchall
0662         tc qdisc del dev $rp1 clsact
0663 }
0664 
0665 flow_action_trap_test()
0666 {
0667         # Install a filter that traps a specific flow.
0668         tc qdisc add dev $rp1 clsact
0669         tc filter add dev $rp1 ingress proto ip pref 1 handle 101 flower \
0670                 skip_sw ip_proto udp src_port 12345 dst_port 54321 action trap
0671 
0672         devlink_trap_stats_test "Flow Trapping (Logging)" "flow_action_trap" \
0673                 $MZ $h1 -c 1 -a own -b $(mac_get $rp1) \
0674                 -A 192.0.2.1 -B 198.51.100.1 -t udp sp=12345,dp=54321 -p 100 -q
0675 
0676         tc filter del dev $rp1 ingress proto ip pref 1 handle 101 flower
0677         tc qdisc del dev $rp1 clsact
0678 }
0679 
0680 trap cleanup EXIT
0681 
0682 setup_prepare
0683 setup_wait
0684 
0685 tests_run
0686 
0687 exit $EXIT_STATUS