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 # |    | 192.0.2.1/28  |
0012 # +----|---------------+
0013 #      |
0014 # +----|----------------------------------------------------------------------+
0015 # | SW |                                                                      |
0016 # | +--|--------------------------------------------------------------------+ |
0017 # | |  + $swp1                   BR1 (802.1d)                               | |
0018 # | |                                                                       | |
0019 # | |  + vx1 (vxlan)                                                        | |
0020 # | |    local 192.0.2.17                                                   | |
0021 # | |    id 1000 dstport $VXPORT                                            | |
0022 # | +-----------------------------------------------------------------------+ |
0023 # |                                                                           |
0024 # |    + $rp1                                                                 |
0025 # |    | 192.0.2.17/28                                                        |
0026 # +----|----------------------------------------------------------------------+
0027 #      |
0028 # +----|--------------------------------------------------------+
0029 # |    |                                             VRF2       |
0030 # |    + $rp2                                                   |
0031 # |      192.0.2.18/28                                          |
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 192.0.2.1/28
0053 }
0054 
0055 h1_destroy()
0056 {
0057         simple_if_fini $h1 192.0.2.1/28
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 192.0.2.17 \
0073                 dstport "$VXPORT" nolearning noudpcsum tos inherit ttl 100
0074         ip link set dev vx1 master br1
0075         ip link set dev vx1 up
0076 
0077         ip address add dev $rp1 192.0.2.17/28
0078         ip link set dev $rp1 up
0079 }
0080 
0081 switch_destroy()
0082 {
0083         ip link set dev $rp1 down
0084         ip address del dev $rp1 192.0.2.17/28
0085 
0086         ip link set dev vx1 down
0087         ip link set dev vx1 nomaster
0088         ip link del dev vx1
0089 
0090         ip link set dev $swp1 down
0091         ip link set dev $swp1 nomaster
0092         tc qdisc del dev $swp1 clsact
0093 
0094         ip link set dev br1 down
0095         ip link del dev br1
0096 }
0097 
0098 vrf2_create()
0099 {
0100         simple_if_init $rp2 192.0.2.18/28
0101 }
0102 
0103 vrf2_destroy()
0104 {
0105         simple_if_fini $rp2 192.0.2.18/28
0106 }
0107 
0108 setup_prepare()
0109 {
0110         h1=${NETIFS[p1]}
0111         swp1=${NETIFS[p2]}
0112 
0113         rp1=${NETIFS[p3]}
0114         rp2=${NETIFS[p4]}
0115 
0116         vrf_prepare
0117         forwarding_enable
0118         h1_create
0119         switch_create
0120         vrf2_create
0121 }
0122 
0123 cleanup()
0124 {
0125         pre_cleanup
0126 
0127         vrf2_destroy
0128         switch_destroy
0129         h1_destroy
0130         forwarding_restore
0131         vrf_cleanup
0132 }
0133 
0134 ecn_payload_get()
0135 {
0136         dest_mac=$(mac_get $h1)
0137         p=$(:
0138                 )"08:"$(                      : VXLAN flags
0139                 )"00:00:00:"$(                : VXLAN reserved
0140                 )"00:03:e8:"$(                : VXLAN VNI : 1000
0141                 )"00:"$(                      : VXLAN reserved
0142                 )"$dest_mac:"$(               : ETH daddr
0143                 )"00:00:00:00:00:00:"$(       : ETH saddr
0144                 )"08:00:"$(                   : ETH type
0145                 )"45:"$(                      : IP version + IHL
0146                 )"00:"$(                      : IP TOS
0147                 )"00:14:"$(                   : IP total length
0148                 )"00:00:"$(                   : IP identification
0149                 )"20:00:"$(                   : IP flags + frag off
0150                 )"40:"$(                      : IP TTL
0151                 )"00:"$(                      : IP proto
0152                 )"D6:E5:"$(                   : IP header csum
0153                 )"c0:00:02:03:"$(             : IP saddr: 192.0.2.3
0154                 )"c0:00:02:01:"$(             : IP daddr: 192.0.2.1
0155                 )
0156         echo $p
0157 }
0158 
0159 ecn_decap_test()
0160 {
0161         local trap_name="decap_error"
0162         local desc=$1; shift
0163         local ecn_desc=$1; shift
0164         local outer_tos=$1; shift
0165         local mz_pid
0166 
0167         RET=0
0168 
0169         tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
0170                 flower src_ip 192.0.2.3 dst_ip 192.0.2.1 action pass
0171 
0172         rp1_mac=$(mac_get $rp1)
0173         payload=$(ecn_payload_get)
0174 
0175         ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -b $rp1_mac -B 192.0.2.17 \
0176                 -t udp sp=12345,dp=$VXPORT,tos=$outer_tos,p=$payload -q &
0177         mz_pid=$!
0178 
0179         devlink_trap_exception_test $trap_name
0180 
0181         tc_check_packets "dev $swp1 egress" 101 0
0182         check_err $? "Packets were not dropped"
0183 
0184         log_test "$desc: Inner ECN is not ECT and outer is $ecn_desc"
0185 
0186         kill $mz_pid && wait $mz_pid &> /dev/null
0187         tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
0188 }
0189 
0190 reserved_bits_payload_get()
0191 {
0192         dest_mac=$(mac_get $h1)
0193         p=$(:
0194                 )"08:"$(                      : VXLAN flags
0195                 )"01:00:00:"$(                : VXLAN reserved
0196                 )"00:03:e8:"$(                : VXLAN VNI : 1000
0197                 )"00:"$(                      : VXLAN reserved
0198                 )"$dest_mac:"$(               : ETH daddr
0199                 )"00:00:00:00:00:00:"$(       : ETH saddr
0200                 )"08:00:"$(                   : ETH type
0201                 )"45:"$(                      : IP version + IHL
0202                 )"00:"$(                      : IP TOS
0203                 )"00:14:"$(                   : IP total length
0204                 )"00:00:"$(                   : IP identification
0205                 )"20:00:"$(                   : IP flags + frag off
0206                 )"40:"$(                      : IP TTL
0207                 )"00:"$(                      : IP proto
0208                 )"00:00:"$(                   : IP header csum
0209                 )"c0:00:02:03:"$(             : IP saddr: 192.0.2.3
0210                 )"c0:00:02:01:"$(             : IP daddr: 192.0.2.1
0211                 )
0212         echo $p
0213 }
0214 
0215 short_payload_get()
0216 {
0217         dest_mac=$(mac_get $h1)
0218         p=$(:
0219                 )"08:"$(                      : VXLAN flags
0220                 )"00:00:00:"$(                : VXLAN reserved
0221                 )"00:03:e8:"$(                : VXLAN VNI : 1000
0222                 )"00:"$(                      : VXLAN reserved
0223                 )"$dest_mac:"$(               : ETH daddr
0224                 )"00:00:00:00:00:00:"$(       : ETH saddr
0225                 )
0226         echo $p
0227 }
0228 
0229 corrupted_packet_test()
0230 {
0231         local trap_name="decap_error"
0232         local desc=$1; shift
0233         local payload_get=$1; shift
0234         local mz_pid
0235 
0236         RET=0
0237 
0238         # In case of too short packet, there is no any inner packet,
0239         # so the matching will always succeed
0240         tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
0241                 flower skip_hw src_ip 192.0.2.3 dst_ip 192.0.2.1 action pass
0242 
0243         rp1_mac=$(mac_get $rp1)
0244         payload=$($payload_get)
0245         ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -b $rp1_mac \
0246                 -B 192.0.2.17 -t udp sp=12345,dp=$VXPORT,p=$payload -q &
0247         mz_pid=$!
0248 
0249         devlink_trap_exception_test $trap_name
0250 
0251         tc_check_packets "dev $swp1 egress" 101 0
0252         check_err $? "Packets were not dropped"
0253 
0254         log_test "$desc"
0255 
0256         kill $mz_pid && wait $mz_pid &> /dev/null
0257         tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
0258 }
0259 
0260 decap_error_test()
0261 {
0262         ecn_decap_test "Decap error" "ECT(1)" 01
0263         ecn_decap_test "Decap error" "ECT(0)" 02
0264         ecn_decap_test "Decap error" "CE" 03
0265 
0266         corrupted_packet_test "Decap error: Reserved bits in use" \
0267                 "reserved_bits_payload_get"
0268         corrupted_packet_test "Decap error: Too short inner packet" \
0269                 "short_payload_get"
0270 }
0271 
0272 mc_smac_payload_get()
0273 {
0274         dest_mac=$(mac_get $h1)
0275         source_mac=01:02:03:04:05:06
0276         p=$(:
0277                 )"08:"$(                      : VXLAN flags
0278                 )"00:00:00:"$(                : VXLAN reserved
0279                 )"00:03:e8:"$(                : VXLAN VNI : 1000
0280                 )"00:"$(                      : VXLAN reserved
0281                 )"$dest_mac:"$(               : ETH daddr
0282                 )"$source_mac:"$(             : ETH saddr
0283                 )"08:00:"$(                   : ETH type
0284                 )"45:"$(                      : IP version + IHL
0285                 )"00:"$(                      : IP TOS
0286                 )"00:14:"$(                   : IP total length
0287                 )"00:00:"$(                   : IP identification
0288                 )"20:00:"$(                   : IP flags + frag off
0289                 )"40:"$(                      : IP TTL
0290                 )"00:"$(                      : IP proto
0291                 )"00:00:"$(                   : IP header csum
0292                 )"c0:00:02:03:"$(             : IP saddr: 192.0.2.3
0293                 )"c0:00:02:01:"$(             : IP daddr: 192.0.2.1
0294                 )
0295         echo $p
0296 }
0297 
0298 overlay_smac_is_mc_test()
0299 {
0300         local trap_name="overlay_smac_is_mc"
0301         local mz_pid
0302 
0303         RET=0
0304 
0305         # The matching will be checked on devlink_trap_drop_test()
0306         # and the filter will be removed on devlink_trap_drop_cleanup()
0307         tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
0308                 flower src_mac 01:02:03:04:05:06 action pass
0309 
0310         rp1_mac=$(mac_get $rp1)
0311         payload=$(mc_smac_payload_get)
0312 
0313         ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -b $rp1_mac \
0314                 -B 192.0.2.17 -t udp sp=12345,dp=$VXPORT,p=$payload -q &
0315         mz_pid=$!
0316 
0317         devlink_trap_drop_test $trap_name $swp1 101
0318 
0319         log_test "Overlay source MAC is multicast"
0320 
0321         devlink_trap_drop_cleanup $mz_pid $swp1 "ip" 1 101
0322 }
0323 
0324 trap cleanup EXIT
0325 
0326 setup_prepare
0327 setup_wait
0328 tests_run
0329 
0330 exit $EXIT_STATUS