251 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03#4# Test devlink-trap tunnel exceptions functionality over mlxsw.5# Check all exception traps to make sure they are triggered under the right6# conditions.7 8# +-------------------------+9# | H1 |10# | $h1 + |11# | 2001:db8:1::1/64 | |12# +-------------------|-----+13# |14# +-------------------|-----+15# | SW1 | |16# | $swp1 + |17# | 2001:db8:1::2/64 |18# | |19# | + g1 (ip6gre) |20# | loc=2001:db8:3::1 |21# | rem=2001:db8:3::2 |22# | tos=inherit |23# | |24# | + $rp1 |25# | | 2001:db8:10::1/64 |26# +--|----------------------+27# |28# +--|----------------------+29# | | VRF2 |30# | + $rp2 |31# | 2001:db8:10::2/64 |32# +-------------------------+33 34lib_dir=$(dirname $0)/../../../net/forwarding35 36ALL_TESTS="37 decap_error_test38"39 40NUM_NETIFS=441source $lib_dir/lib.sh42source $lib_dir/tc_common.sh43source $lib_dir/devlink_lib.sh44 45h1_create()46{47 simple_if_init $h1 2001:db8:1::1/6448}49 50h1_destroy()51{52 simple_if_fini $h1 2001:db8:1::1/6453}54 55vrf2_create()56{57 simple_if_init $rp2 2001:db8:10::2/6458}59 60vrf2_destroy()61{62 simple_if_fini $rp2 2001:db8:10::2/6463}64 65switch_create()66{67 ip link set dev $swp1 up68 __addr_add_del $swp1 add 2001:db8:1::2/6469 tc qdisc add dev $swp1 clsact70 71 tunnel_create g1 ip6gre 2001:db8:3::1 2001:db8:3::2 tos inherit \72 ttl inherit73 ip link set dev g1 up74 __addr_add_del g1 add 2001:db8:3::1/12875 76 ip link set dev $rp1 up77 __addr_add_del $rp1 add 2001:db8:10::1/6478}79 80switch_destroy()81{82 __addr_add_del $rp1 del 2001:db8:10::1/6483 ip link set dev $rp1 down84 85 __addr_add_del g1 del 2001:db8:3::1/12886 ip link set dev g1 down87 tunnel_destroy g188 89 tc qdisc del dev $swp1 clsact90 __addr_add_del $swp1 del 2001:db8:1::2/6491 ip link set dev $swp1 down92}93 94setup_prepare()95{96 h1=${NETIFS[p1]}97 swp1=${NETIFS[p2]}98 99 rp1=${NETIFS[p3]}100 rp2=${NETIFS[p4]}101 102 forwarding_enable103 vrf_prepare104 h1_create105 switch_create106 vrf2_create107}108 109cleanup()110{111 pre_cleanup112 113 vrf2_destroy114 switch_destroy115 h1_destroy116 vrf_cleanup117 forwarding_restore118}119 120ipip_payload_get()121{122 local saddr="20:01:0d:b8:00:02:00:00:00:00:00:00:00:00:00:01"123 local daddr="20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01"124 local flags=$1; shift125 local key=$1; shift126 127 p=$(:128 )"$flags"$( : GRE flags129 )"0:00:"$( : Reserved + version130 )"86:dd:"$( : ETH protocol type131 )"$key"$( : Key132 )"6"$( : IP version133 )"0:0"$( : Traffic class134 )"0:00:00:"$( : Flow label135 )"00:00:"$( : Payload length136 )"3a:"$( : Next header137 )"04:"$( : Hop limit138 )"$saddr:"$( : IP saddr139 )"$daddr:"$( : IP daddr140 )141 echo $p142}143 144ecn_payload_get()145{146 echo $(ipip_payload_get "0")147}148 149ecn_decap_test()150{151 local trap_name="decap_error"152 local desc=$1; shift153 local ecn_desc=$1; shift154 local outer_tos=$1; shift155 local mz_pid156 157 RET=0158 159 tc filter add dev $swp1 egress protocol ipv6 pref 1 handle 101 \160 flower src_ip 2001:db8:2::1 dst_ip 2001:db8:1::1 skip_sw \161 action pass162 163 rp1_mac=$(mac_get $rp1)164 rp2_mac=$(mac_get $rp2)165 payload=$(ecn_payload_get)166 167 ip vrf exec v$rp2 $MZ -6 $rp2 -c 0 -d 1msec -a $rp2_mac -b $rp1_mac \168 -A 2001:db8:3::2 -B 2001:db8:3::1 -t ip \169 tos=$outer_tos,next=47,p=$payload -q &170 mz_pid=$!171 172 devlink_trap_exception_test $trap_name173 174 tc_check_packets "dev $swp1 egress" 101 0175 check_err $? "Packets were not dropped"176 177 log_test "$desc: Inner ECN is not ECT and outer is $ecn_desc"178 179 kill $mz_pid && wait $mz_pid &> /dev/null180 tc filter del dev $swp1 egress protocol ipv6 pref 1 handle 101 flower181}182 183no_matching_tunnel_test()184{185 local trap_name="decap_error"186 local desc=$1; shift187 local sip=$1; shift188 local mz_pid189 190 RET=0191 192 tc filter add dev $swp1 egress protocol ipv6 pref 1 handle 101 \193 flower src_ip 2001:db8:2::1 dst_ip 2001:db8:1::1 action pass194 195 rp1_mac=$(mac_get $rp1)196 rp2_mac=$(mac_get $rp2)197 payload=$(ipip_payload_get "$@")198 199 ip vrf exec v$rp2 $MZ -6 $rp2 -c 0 -d 1msec -a $rp2_mac -b $rp1_mac \200 -A $sip -B 2001:db8:3::1 -t ip next=47,p=$payload -q &201 mz_pid=$!202 203 devlink_trap_exception_test $trap_name204 205 tc_check_packets "dev $swp1 egress" 101 0206 check_err $? "Packets were not dropped"207 208 log_test "$desc"209 210 kill $mz_pid && wait $mz_pid &> /dev/null211 tc filter del dev $swp1 egress protocol ipv6 pref 1 handle 101 flower212}213 214decap_error_test()215{216 # Correct source IP - the remote address217 local sip=2001:db8:3::2218 219 ecn_decap_test "Decap error" "ECT(1)" 01220 ecn_decap_test "Decap error" "ECT(0)" 02221 ecn_decap_test "Decap error" "CE" 03222 223 no_matching_tunnel_test "Decap error: Source IP check failed" \224 2001:db8:4::2 "0"225 no_matching_tunnel_test \226 "Decap error: Key exists but was not expected" $sip "2" \227 "00:00:00:E9:"228 229 # Destroy the tunnel and create new one with key230 __addr_add_del g1 del 2001:db8:3::1/128231 tunnel_destroy g1232 233 tunnel_create g1 ip6gre 2001:db8:3::1 2001:db8:3::2 tos inherit \234 ttl inherit key 233235 __addr_add_del g1 add 2001:db8:3::1/128236 237 no_matching_tunnel_test \238 "Decap error: Key does not exist but was expected" $sip "0"239 no_matching_tunnel_test \240 "Decap error: Packet has a wrong key field" $sip "2" \241 "00:00:00:E8:"242}243 244trap cleanup EXIT245 246setup_prepare247setup_wait248tests_run249 250exit $EXIT_STATUS251