Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 #
0004 # Test devlink-trap tunnel drops and exceptions functionality over mlxsw.
0005 # Check all traps to make sure they are triggered under the right
0006 # conditions.
0007 
0008 # +------------------------+
0009 # | H1 (vrf)               |
0010 # |    + $h1               |
0011 # |    | 2001:db8:1::1/64  |
0012 # +----|-------------------+
0013 #      |
0014 # +----|----------------------------------------------------------------------+
0015 # | SW |                                                                      |
0016 # | +--|--------------------------------------------------------------------+ |
0017 # | |  + $swp1                   BR1 (802.1d)                               | |
0018 # | |                                                                       | |
0019 # | |  + vx1 (vxlan)                                                        | |
0020 # | |    local 2001:db8:3::1                                                | |
0021 # | |    id 1000 dstport $VXPORT                                            | |
0022 # | +-----------------------------------------------------------------------+ |
0023 # |                                                                           |
0024 # |    + $rp1                                                                 |
0025 # |    | 2001:db8:3::1/64                                                     |
0026 # +----|----------------------------------------------------------------------+
0027 #      |
0028 # +----|--------------------------------------------------------+
0029 # |    |                                             VRF2       |
0030 # |    + $rp2                                                   |
0031 # |      2001:db8:3::2/64                                       |
0032 # |                                                             |
0033 # +-------------------------------------------------------------+
0034 
0035 lib_dir=$(dirname $0)/../../../net/forwarding
0036 
0037 ALL_TESTS="
0038         decap_error_test
0039         overlay_smac_is_mc_test
0040 "
0041 
0042 NUM_NETIFS=4
0043 source $lib_dir/lib.sh
0044 source $lib_dir/tc_common.sh
0045 source $lib_dir/devlink_lib.sh
0046 
0047 : ${VXPORT:=4789}
0048 export VXPORT
0049 
0050 h1_create()
0051 {
0052         simple_if_init $h1 2001:db8:1::1/64
0053 }
0054 
0055 h1_destroy()
0056 {
0057         simple_if_fini $h1 2001:db8:1::1/64
0058 }
0059 
0060 switch_create()
0061 {
0062         ip link add name br1 type bridge vlan_filtering 0 mcast_snooping 0
0063         # Make sure the bridge uses the MAC address of the local port and not
0064         # that of the VxLAN's device.
0065         ip link set dev br1 address $(mac_get $swp1)
0066         ip link set dev br1 up
0067 
0068         tc qdisc add dev $swp1 clsact
0069         ip link set dev $swp1 master br1
0070         ip link set dev $swp1 up
0071 
0072         ip link add name vx1 type vxlan id 1000 local 2001:db8:3::1 \
0073                 dstport "$VXPORT" nolearning udp6zerocsumrx udp6zerocsumtx \
0074                 tos inherit ttl 100
0075         ip link set dev vx1 master br1
0076         ip link set dev vx1 up
0077 
0078         ip link set dev $rp1 up
0079         ip address add dev $rp1 2001:db8:3::1/64
0080 }
0081 
0082 switch_destroy()
0083 {
0084         ip address del dev $rp1 2001:db8:3::1/64
0085         ip link set dev $rp1 down
0086 
0087         ip link set dev vx1 down
0088         ip link set dev vx1 nomaster
0089         ip link del dev vx1
0090 
0091         ip link set dev $swp1 down
0092         ip link set dev $swp1 nomaster
0093         tc qdisc del dev $swp1 clsact
0094 
0095         ip link set dev br1 down
0096         ip link del dev br1
0097 }
0098 
0099 vrf2_create()
0100 {
0101         simple_if_init $rp2 2001:db8:3::2/64
0102 }
0103 
0104 vrf2_destroy()
0105 {
0106         simple_if_fini $rp2 2001:db8:3::2/64
0107 }
0108 
0109 setup_prepare()
0110 {
0111         h1=${NETIFS[p1]}
0112         swp1=${NETIFS[p2]}
0113 
0114         rp1=${NETIFS[p3]}
0115         rp2=${NETIFS[p4]}
0116 
0117         vrf_prepare
0118         forwarding_enable
0119         h1_create
0120         switch_create
0121         vrf2_create
0122 }
0123 
0124 cleanup()
0125 {
0126         pre_cleanup
0127 
0128         vrf2_destroy
0129         switch_destroy
0130         h1_destroy
0131         forwarding_restore
0132         vrf_cleanup
0133 }
0134 
0135 ecn_payload_get()
0136 {
0137         local dest_mac=$(mac_get $h1)
0138         local saddr="20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:03"
0139         local daddr="20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01"
0140         p=$(:
0141                 )"08:"$(                      : VXLAN flags
0142                 )"00:00:00:"$(                : VXLAN reserved
0143                 )"00:03:e8:"$(                : VXLAN VNI : 1000
0144                 )"00:"$(                      : VXLAN reserved
0145                 )"$dest_mac:"$(               : ETH daddr
0146                 )"00:00:00:00:00:00:"$(       : ETH saddr
0147                 )"86:dd:"$(                   : ETH type
0148                 )"6"$(                        : IP version
0149                 )"0:0"$(                      : Traffic class
0150                 )"0:00:00:"$(                 : Flow label
0151                 )"00:08:"$(                   : Payload length
0152                 )"3a:"$(                      : Next header
0153                 )"04:"$(                      : Hop limit
0154                 )"$saddr:"$(                  : IP saddr
0155                 )"$daddr:"$(                  : IP daddr
0156                 )"80:"$(                      : ICMPv6.type
0157                 )"00:"$(                      : ICMPv6.code
0158                 )"00:"$(                      : ICMPv6.checksum
0159                 )
0160         echo $p
0161 }
0162 
0163 ecn_decap_test()
0164 {
0165         local trap_name="decap_error"
0166         local desc=$1; shift
0167         local ecn_desc=$1; shift
0168         local outer_tos=$1; shift
0169         local mz_pid
0170 
0171         RET=0
0172 
0173         tc filter add dev $swp1 egress protocol ipv6 pref 1 handle 101 \
0174                 flower src_ip 2001:db8:1::3 dst_ip 2001:db8:1::1 action pass
0175 
0176         rp1_mac=$(mac_get $rp1)
0177         payload=$(ecn_payload_get)
0178 
0179         ip vrf exec v$rp2 $MZ -6 $rp2 -c 0 -d 1msec -b $rp1_mac \
0180                 -B 2001:db8:3::1 -t udp \
0181                 sp=12345,dp=$VXPORT,tos=$outer_tos,p=$payload -q &
0182         mz_pid=$!
0183 
0184         devlink_trap_exception_test $trap_name
0185 
0186         tc_check_packets "dev $swp1 egress" 101 0
0187         check_err $? "Packets were not dropped"
0188 
0189         log_test "$desc: Inner ECN is not ECT and outer is $ecn_desc"
0190 
0191         kill $mz_pid && wait $mz_pid &> /dev/null
0192         tc filter del dev $swp1 egress protocol ipv6 pref 1 handle 101 flower
0193 }
0194 
0195 reserved_bits_payload_get()
0196 {
0197         local dest_mac=$(mac_get $h1)
0198         local saddr="20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:03"
0199         local daddr="20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01"
0200         p=$(:
0201                 )"08:"$(                      : VXLAN flags
0202                 )"01:00:00:"$(                : VXLAN reserved
0203                 )"00:03:e8:"$(                : VXLAN VNI : 1000
0204                 )"00:"$(                      : VXLAN reserved
0205                 )"$dest_mac:"$(               : ETH daddr
0206                 )"00:00:00:00:00:00:"$(       : ETH saddr
0207                 )"86:dd:"$(                   : ETH type
0208                 )"6"$(                        : IP version
0209                 )"0:0"$(                      : Traffic class
0210                 )"0:00:00:"$(                 : Flow label
0211                 )"00:08:"$(                   : Payload length
0212                 )"3a:"$(                      : Next header
0213                 )"04:"$(                      : Hop limit
0214                 )"$saddr:"$(                  : IP saddr
0215                 )"$daddr:"$(                  : IP daddr
0216                 )"80:"$(                      : ICMPv6.type
0217                 )"00:"$(                      : ICMPv6.code
0218                 )"00:"$(                      : ICMPv6.checksum
0219                 )
0220         echo $p
0221 }
0222 
0223 short_payload_get()
0224 {
0225         dest_mac=$(mac_get $h1)
0226         p=$(:
0227                 )"08:"$(                      : VXLAN flags
0228                 )"00:00:00:"$(                : VXLAN reserved
0229                 )"00:03:e8:"$(                : VXLAN VNI : 1000
0230                 )"00:"$(                      : VXLAN reserved
0231                 )"$dest_mac:"$(               : ETH daddr
0232                 )"00:00:00:00:00:00:"$(       : ETH saddr
0233                 )
0234         echo $p
0235 }
0236 
0237 corrupted_packet_test()
0238 {
0239         local trap_name="decap_error"
0240         local desc=$1; shift
0241         local payload_get=$1; shift
0242         local mz_pid
0243 
0244         RET=0
0245 
0246         # In case of too short packet, there is no any inner packet,
0247         # so the matching will always succeed
0248         tc filter add dev $swp1 egress protocol ipv6 pref 1 handle 101 \
0249                 flower skip_hw src_ip 2001:db8:3::1 dst_ip 2001:db8:1::1 \
0250                 action pass
0251 
0252         rp1_mac=$(mac_get $rp1)
0253         payload=$($payload_get)
0254         ip vrf exec v$rp2 $MZ -6 $rp2 -c 0 -d 1msec -b $rp1_mac \
0255                 -B 2001:db8:3::1 -t udp sp=12345,dp=$VXPORT,p=$payload -q &
0256         mz_pid=$!
0257 
0258         devlink_trap_exception_test $trap_name
0259 
0260         tc_check_packets "dev $swp1 egress" 101 0
0261         check_err $? "Packets were not dropped"
0262 
0263         log_test "$desc"
0264 
0265         kill $mz_pid && wait $mz_pid &> /dev/null
0266         tc filter del dev $swp1 egress protocol ipv6 pref 1 handle 101 flower
0267 }
0268 
0269 decap_error_test()
0270 {
0271         ecn_decap_test "Decap error" "ECT(1)" 01
0272         ecn_decap_test "Decap error" "ECT(0)" 02
0273         ecn_decap_test "Decap error" "CE" 03
0274 
0275         corrupted_packet_test "Decap error: Reserved bits in use" \
0276                 "reserved_bits_payload_get"
0277         corrupted_packet_test "Decap error: Too short inner packet" \
0278                 "short_payload_get"
0279 }
0280 
0281 mc_smac_payload_get()
0282 {
0283         local dest_mac=$(mac_get $h1)
0284         local source_mac="01:02:03:04:05:06"
0285         local saddr="20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:03"
0286         local daddr="20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01"
0287         p=$(:
0288                 )"08:"$(                      : VXLAN flags
0289                 )"00:00:00:"$(                : VXLAN reserved
0290                 )"00:03:e8:"$(                : VXLAN VNI : 1000
0291                 )"00:"$(                      : VXLAN reserved
0292                 )"$dest_mac:"$(               : ETH daddr
0293                 )"$source_mac:"$(             : ETH saddr
0294                 )"86:dd:"$(                   : ETH type
0295                 )"6"$(                        : IP version
0296                 )"0:0"$(                      : Traffic class
0297                 )"0:00:00:"$(                 : Flow label
0298                 )"00:08:"$(                   : Payload length
0299                 )"3a:"$(                      : Next header
0300                 )"04:"$(                      : Hop limit
0301                 )"$saddr:"$(                  : IP saddr
0302                 )"$daddr:"$(                  : IP daddr
0303                 )"80:"$(                      : ICMPv6.type
0304                 )"00:"$(                      : ICMPv6.code
0305                 )"00:"$(                      : ICMPv6.checksum
0306                 )
0307         echo $p
0308 }
0309 
0310 overlay_smac_is_mc_test()
0311 {
0312         local trap_name="overlay_smac_is_mc"
0313         local mz_pid
0314 
0315         RET=0
0316 
0317         # The matching will be checked on devlink_trap_drop_test()
0318         # and the filter will be removed on devlink_trap_drop_cleanup()
0319         tc filter add dev $swp1 egress protocol ipv6 pref 1 handle 101 \
0320                 flower src_mac 01:02:03:04:05:06 action pass
0321 
0322         rp1_mac=$(mac_get $rp1)
0323         payload=$(mc_smac_payload_get)
0324 
0325         ip vrf exec v$rp2 $MZ -6 $rp2 -c 0 -d 1msec -b $rp1_mac \
0326                 -B 2001:db8:3::1 -t udp sp=12345,dp=$VXPORT,p=$payload -q &
0327         mz_pid=$!
0328 
0329         devlink_trap_drop_test $trap_name $swp1 101
0330 
0331         log_test "Overlay source MAC is multicast"
0332 
0333         devlink_trap_drop_cleanup $mz_pid $swp1 "ipv6" 1 101
0334 }
0335 
0336 trap cleanup EXIT
0337 
0338 setup_prepare
0339 setup_wait
0340 tests_run
0341 
0342 exit $EXIT_STATUS