Back to home page

OSCL-LXR

 
 

    


0001 #!/bin/bash
0002 # SPDX-License-Identifier: GPL-2.0
0003 #
0004 # Test devlink-trap tunnel exceptions functionality over mlxsw.
0005 # Check all exception traps to make sure they are triggered under the right
0006 # conditions.
0007 
0008 # +-------------------------+
0009 # | H1                      |
0010 # |               $h1 +     |
0011 # |      192.0.2.1/28 |     |
0012 # +-------------------|-----+
0013 #                     |
0014 # +-------------------|-----+
0015 # | SW1               |     |
0016 # |             $swp1 +     |
0017 # |      192.0.2.2/28       |
0018 # |                         |
0019 # |  + g1a (gre)            |
0020 # |    loc=192.0.2.65       |
0021 # |    rem=192.0.2.66       |
0022 # |    tos=inherit          |
0023 # |                         |
0024 # |  + $rp1                 |
0025 # |  |  198.51.100.1/28     |
0026 # +--|----------------------+
0027 #    |
0028 # +--|----------------------+
0029 # |  |                 VRF2 |
0030 # |  + $rp2                 |
0031 # |    198.51.100.2/28      |
0032 # +-------------------------+
0033 
0034 lib_dir=$(dirname $0)/../../../net/forwarding
0035 
0036 ALL_TESTS="
0037         decap_error_test
0038 "
0039 
0040 NUM_NETIFS=4
0041 source $lib_dir/lib.sh
0042 source $lib_dir/tc_common.sh
0043 source $lib_dir/devlink_lib.sh
0044 
0045 h1_create()
0046 {
0047         simple_if_init $h1 192.0.2.1/28
0048 }
0049 
0050 h1_destroy()
0051 {
0052         simple_if_fini $h1 192.0.2.1/28
0053 }
0054 
0055 vrf2_create()
0056 {
0057         simple_if_init $rp2 198.51.100.2/28
0058 }
0059 
0060 vrf2_destroy()
0061 {
0062         simple_if_fini $rp2 198.51.100.2/28
0063 }
0064 
0065 switch_create()
0066 {
0067         __addr_add_del $swp1 add 192.0.2.2/28
0068         tc qdisc add dev $swp1 clsact
0069         ip link set dev $swp1 up
0070 
0071         tunnel_create g1 gre 192.0.2.65 192.0.2.66 tos inherit
0072         __addr_add_del g1 add 192.0.2.65/32
0073         ip link set dev g1 up
0074 
0075         __addr_add_del $rp1 add 198.51.100.1/28
0076         ip link set dev $rp1 up
0077 }
0078 
0079 switch_destroy()
0080 {
0081         ip link set dev $rp1 down
0082         __addr_add_del $rp1 del 198.51.100.1/28
0083 
0084         ip link set dev g1 down
0085         __addr_add_del g1 del 192.0.2.65/32
0086         tunnel_destroy g1
0087 
0088         ip link set dev $swp1 down
0089         tc qdisc del dev $swp1 clsact
0090         __addr_add_del $swp1 del 192.0.2.2/28
0091 }
0092 
0093 setup_prepare()
0094 {
0095         h1=${NETIFS[p1]}
0096         swp1=${NETIFS[p2]}
0097 
0098         rp1=${NETIFS[p3]}
0099         rp2=${NETIFS[p4]}
0100 
0101         forwarding_enable
0102         vrf_prepare
0103         h1_create
0104         switch_create
0105         vrf2_create
0106 }
0107 
0108 cleanup()
0109 {
0110         pre_cleanup
0111 
0112         vrf2_destroy
0113         switch_destroy
0114         h1_destroy
0115         vrf_cleanup
0116         forwarding_restore
0117 }
0118 
0119 ipip_payload_get()
0120 {
0121         local flags=$1; shift
0122         local key=$1; shift
0123 
0124         p=$(:
0125                 )"$flags"$(                   : GRE flags
0126                 )"0:00:"$(                    : Reserved + version
0127                 )"08:00:"$(                   : ETH protocol type
0128                 )"$key"$(                     : Key
0129                 )"4"$(                        : IP version
0130                 )"5:"$(                       : IHL
0131                 )"00:"$(                      : IP TOS
0132                 )"00:14:"$(                   : IP total length
0133                 )"00:00:"$(                   : IP identification
0134                 )"20:00:"$(                   : IP flags + frag off
0135                 )"30:"$(                      : IP TTL
0136                 )"01:"$(                      : IP proto
0137                 )"E7:E6:"$(                   : IP header csum
0138                 )"C0:00:01:01:"$(             : IP saddr : 192.0.1.1
0139                 )"C0:00:02:01:"$(             : IP daddr : 192.0.2.1
0140                 )
0141         echo $p
0142 }
0143 
0144 ecn_payload_get()
0145 {
0146         echo $(ipip_payload_get "0")
0147 }
0148 
0149 ecn_decap_test()
0150 {
0151         local trap_name="decap_error"
0152         local desc=$1; shift
0153         local ecn_desc=$1; shift
0154         local outer_tos=$1; shift
0155         local mz_pid
0156 
0157         RET=0
0158 
0159         tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
0160                 flower src_ip 192.0.1.1 dst_ip 192.0.2.1 action pass
0161 
0162         rp1_mac=$(mac_get $rp1)
0163         rp2_mac=$(mac_get $rp2)
0164         payload=$(ecn_payload_get)
0165 
0166         ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -a $rp2_mac -b $rp1_mac \
0167                 -A 192.0.2.66 -B 192.0.2.65 -t ip \
0168                         len=48,tos=$outer_tos,proto=47,p=$payload -q &
0169 
0170         mz_pid=$!
0171 
0172         devlink_trap_exception_test $trap_name
0173 
0174         tc_check_packets "dev $swp1 egress" 101 0
0175         check_err $? "Packets were not dropped"
0176 
0177         log_test "$desc: Inner ECN is not ECT and outer is $ecn_desc"
0178 
0179         kill $mz_pid && wait $mz_pid &> /dev/null
0180         tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
0181 }
0182 
0183 no_matching_tunnel_test()
0184 {
0185         local trap_name="decap_error"
0186         local desc=$1; shift
0187         local sip=$1; shift
0188         local mz_pid
0189 
0190         RET=0
0191 
0192         tc filter add dev $swp1 egress protocol ip pref 1 handle 101 \
0193                 flower src_ip 192.0.1.1 dst_ip 192.0.2.1 action pass
0194 
0195         rp1_mac=$(mac_get $rp1)
0196         rp2_mac=$(mac_get $rp2)
0197         payload=$(ipip_payload_get "$@")
0198 
0199         ip vrf exec v$rp2 $MZ $rp2 -c 0 -d 1msec -a $rp2_mac -b $rp1_mac \
0200                 -A $sip -B 192.0.2.65 -t ip len=48,proto=47,p=$payload -q &
0201         mz_pid=$!
0202 
0203         devlink_trap_exception_test $trap_name
0204 
0205         tc_check_packets "dev $swp1 egress" 101 0
0206         check_err $? "Packets were not dropped"
0207 
0208         log_test "$desc"
0209 
0210         kill $mz_pid && wait $mz_pid &> /dev/null
0211         tc filter del dev $swp1 egress protocol ip pref 1 handle 101 flower
0212 }
0213 
0214 decap_error_test()
0215 {
0216         # Correct source IP - the remote address
0217         local sip=192.0.2.66
0218 
0219         ecn_decap_test "Decap error" "ECT(1)" 01
0220         ecn_decap_test "Decap error" "ECT(0)" 02
0221         ecn_decap_test "Decap error" "CE" 03
0222 
0223         no_matching_tunnel_test "Decap error: Source IP check failed" \
0224                 192.0.2.68 "0"
0225         no_matching_tunnel_test \
0226                 "Decap error: Key exists but was not expected" $sip "2" \
0227                 "00:00:00:E9:"
0228 
0229         # Destroy the tunnel and create new one with key
0230         __addr_add_del g1 del 192.0.2.65/32
0231         tunnel_destroy g1
0232 
0233         tunnel_create g1 gre 192.0.2.65 192.0.2.66 tos inherit key 233
0234         __addr_add_del g1 add 192.0.2.65/32
0235 
0236         no_matching_tunnel_test \
0237                 "Decap error: Key does not exist but was expected" $sip "0"
0238         no_matching_tunnel_test \
0239                 "Decap error: Packet has a wrong key field" $sip "2" \
0240                 "00:00:00:E8:"
0241 }
0242 
0243 trap cleanup EXIT
0244 
0245 setup_prepare
0246 setup_wait
0247 tests_run
0248 
0249 exit $EXIT_STATUS