183b2b61eSAmit Cohen#!/bin/bash 283b2b61eSAmit Cohen# SPDX-License-Identifier: GPL-2.0 383b2b61eSAmit Cohen# 483b2b61eSAmit Cohen# Test devlink-trap L3 exceptions functionality over mlxsw. 583b2b61eSAmit Cohen# Check all exception traps to make sure they are triggered under the right 683b2b61eSAmit Cohen# conditions. 783b2b61eSAmit Cohen 883b2b61eSAmit Cohen# +---------------------------------+ 983b2b61eSAmit Cohen# | H1 (vrf) | 1083b2b61eSAmit Cohen# | + $h1 | 1183b2b61eSAmit Cohen# | | 192.0.2.1/24 | 1283b2b61eSAmit Cohen# | | 2001:db8:1::1/64 | 1383b2b61eSAmit Cohen# | | | 1483b2b61eSAmit Cohen# | | default via 192.0.2.2 | 1583b2b61eSAmit Cohen# | | default via 2001:db8:1::2 | 1683b2b61eSAmit Cohen# +----|----------------------------+ 1783b2b61eSAmit Cohen# | 1883b2b61eSAmit Cohen# +----|----------------------------------------------------------------------+ 1983b2b61eSAmit Cohen# | SW | | 2083b2b61eSAmit Cohen# | + $rp1 | 2183b2b61eSAmit Cohen# | 192.0.2.2/24 | 2283b2b61eSAmit Cohen# | 2001:db8:1::2/64 | 2383b2b61eSAmit Cohen# | | 2483b2b61eSAmit Cohen# | 2001:db8:2::2/64 | 2583b2b61eSAmit Cohen# | 198.51.100.2/24 | 2683b2b61eSAmit Cohen# | + $rp2 | 2783b2b61eSAmit Cohen# | | | 2883b2b61eSAmit Cohen# +----|----------------------------------------------------------------------+ 2983b2b61eSAmit Cohen# | 3083b2b61eSAmit Cohen# +----|----------------------------+ 3183b2b61eSAmit Cohen# | | default via 198.51.100.2 | 3283b2b61eSAmit Cohen# | | default via 2001:db8:2::2 | 3383b2b61eSAmit Cohen# | | | 3483b2b61eSAmit Cohen# | | 2001:db8:2::1/64 | 3583b2b61eSAmit Cohen# | | 198.51.100.1/24 | 3683b2b61eSAmit Cohen# | + $h2 | 3783b2b61eSAmit Cohen# | H2 (vrf) | 3883b2b61eSAmit Cohen# +---------------------------------+ 3983b2b61eSAmit Cohen 4083b2b61eSAmit Cohenlib_dir=$(dirname $0)/../../../net/forwarding 4183b2b61eSAmit Cohen 4283b2b61eSAmit CohenALL_TESTS=" 4383b2b61eSAmit Cohen mtu_value_is_too_small_test 4483b2b61eSAmit Cohen ttl_value_is_too_small_test 4583b2b61eSAmit Cohen mc_reverse_path_forwarding_test 4683b2b61eSAmit Cohen reject_route_test 4783b2b61eSAmit Cohen unresolved_neigh_test 4883b2b61eSAmit Cohen ipv4_lpm_miss_test 4983b2b61eSAmit Cohen ipv6_lpm_miss_test 5083b2b61eSAmit Cohen" 5183b2b61eSAmit Cohen 5283b2b61eSAmit CohenNUM_NETIFS=4 5383b2b61eSAmit Cohensource $lib_dir/lib.sh 5483b2b61eSAmit Cohensource $lib_dir/tc_common.sh 5583b2b61eSAmit Cohensource $lib_dir/devlink_lib.sh 5683b2b61eSAmit Cohen 5783b2b61eSAmit Cohenrequire_command $MCD 5883b2b61eSAmit Cohenrequire_command $MC_CLI 5983b2b61eSAmit Cohentable_name=selftests 6083b2b61eSAmit Cohen 6183b2b61eSAmit Cohenh1_create() 6283b2b61eSAmit Cohen{ 6383b2b61eSAmit Cohen simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64 6483b2b61eSAmit Cohen 6583b2b61eSAmit Cohen ip -4 route add default vrf v$h1 nexthop via 192.0.2.2 6683b2b61eSAmit Cohen ip -6 route add default vrf v$h1 nexthop via 2001:db8:1::2 6783b2b61eSAmit Cohen 6883b2b61eSAmit Cohen tc qdisc add dev $h1 clsact 6983b2b61eSAmit Cohen} 7083b2b61eSAmit Cohen 7183b2b61eSAmit Cohenh1_destroy() 7283b2b61eSAmit Cohen{ 7383b2b61eSAmit Cohen tc qdisc del dev $h1 clsact 7483b2b61eSAmit Cohen 7583b2b61eSAmit Cohen ip -6 route del default vrf v$h1 nexthop via 2001:db8:1::2 7683b2b61eSAmit Cohen ip -4 route del default vrf v$h1 nexthop via 192.0.2.2 7783b2b61eSAmit Cohen 7883b2b61eSAmit Cohen simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64 7983b2b61eSAmit Cohen} 8083b2b61eSAmit Cohen 8183b2b61eSAmit Cohenh2_create() 8283b2b61eSAmit Cohen{ 8383b2b61eSAmit Cohen simple_if_init $h2 198.51.100.1/24 2001:db8:2::1/64 8483b2b61eSAmit Cohen 8583b2b61eSAmit Cohen ip -4 route add default vrf v$h2 nexthop via 198.51.100.2 8683b2b61eSAmit Cohen ip -6 route add default vrf v$h2 nexthop via 2001:db8:2::2 8783b2b61eSAmit Cohen} 8883b2b61eSAmit Cohen 8983b2b61eSAmit Cohenh2_destroy() 9083b2b61eSAmit Cohen{ 9183b2b61eSAmit Cohen ip -6 route del default vrf v$h2 nexthop via 2001:db8:2::2 9283b2b61eSAmit Cohen ip -4 route del default vrf v$h2 nexthop via 198.51.100.2 9383b2b61eSAmit Cohen 9483b2b61eSAmit Cohen simple_if_fini $h2 198.51.100.1/24 2001:db8:2::1/64 9583b2b61eSAmit Cohen} 9683b2b61eSAmit Cohen 9783b2b61eSAmit Cohenrouter_create() 9883b2b61eSAmit Cohen{ 9983b2b61eSAmit Cohen ip link set dev $rp1 up 10083b2b61eSAmit Cohen ip link set dev $rp2 up 10183b2b61eSAmit Cohen 10283b2b61eSAmit Cohen tc qdisc add dev $rp2 clsact 10383b2b61eSAmit Cohen 10483b2b61eSAmit Cohen __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64 10583b2b61eSAmit Cohen __addr_add_del $rp2 add 198.51.100.2/24 2001:db8:2::2/64 10683b2b61eSAmit Cohen} 10783b2b61eSAmit Cohen 10883b2b61eSAmit Cohenrouter_destroy() 10983b2b61eSAmit Cohen{ 11083b2b61eSAmit Cohen __addr_add_del $rp2 del 198.51.100.2/24 2001:db8:2::2/64 11183b2b61eSAmit Cohen __addr_add_del $rp1 del 192.0.2.2/24 2001:db8:1::2/64 11283b2b61eSAmit Cohen 11383b2b61eSAmit Cohen tc qdisc del dev $rp2 clsact 114e67dfb8dSAmit Cohen 115e67dfb8dSAmit Cohen ip link set dev $rp2 down 116e67dfb8dSAmit Cohen ip link set dev $rp1 down 11783b2b61eSAmit Cohen} 11883b2b61eSAmit Cohen 11983b2b61eSAmit Cohensetup_prepare() 12083b2b61eSAmit Cohen{ 12183b2b61eSAmit Cohen h1=${NETIFS[p1]} 12283b2b61eSAmit Cohen rp1=${NETIFS[p2]} 12383b2b61eSAmit Cohen 12483b2b61eSAmit Cohen rp2=${NETIFS[p3]} 12583b2b61eSAmit Cohen h2=${NETIFS[p4]} 12683b2b61eSAmit Cohen 12783b2b61eSAmit Cohen rp1mac=$(mac_get $rp1) 12883b2b61eSAmit Cohen 12983b2b61eSAmit Cohen start_mcd 13083b2b61eSAmit Cohen 13183b2b61eSAmit Cohen vrf_prepare 13283b2b61eSAmit Cohen forwarding_enable 13383b2b61eSAmit Cohen 13483b2b61eSAmit Cohen h1_create 13583b2b61eSAmit Cohen h2_create 13683b2b61eSAmit Cohen 13783b2b61eSAmit Cohen router_create 13883b2b61eSAmit Cohen} 13983b2b61eSAmit Cohen 14083b2b61eSAmit Cohencleanup() 14183b2b61eSAmit Cohen{ 14283b2b61eSAmit Cohen pre_cleanup 14383b2b61eSAmit Cohen 14483b2b61eSAmit Cohen router_destroy 14583b2b61eSAmit Cohen 14683b2b61eSAmit Cohen h2_destroy 14783b2b61eSAmit Cohen h1_destroy 14883b2b61eSAmit Cohen 14983b2b61eSAmit Cohen forwarding_restore 15083b2b61eSAmit Cohen vrf_cleanup 15183b2b61eSAmit Cohen 15283b2b61eSAmit Cohen kill_mcd 15383b2b61eSAmit Cohen} 15483b2b61eSAmit Cohen 15583b2b61eSAmit Cohenping_check() 15683b2b61eSAmit Cohen{ 15783b2b61eSAmit Cohen ping_do $h1 198.51.100.1 15883b2b61eSAmit Cohen check_err $? "Packets that should not be trapped were trapped" 15983b2b61eSAmit Cohen} 16083b2b61eSAmit Cohen 16183b2b61eSAmit Cohentrap_action_check() 16283b2b61eSAmit Cohen{ 16383b2b61eSAmit Cohen local trap_name=$1; shift 16483b2b61eSAmit Cohen local expected_action=$1; shift 16583b2b61eSAmit Cohen 16683b2b61eSAmit Cohen action=$(devlink_trap_action_get $trap_name) 16783b2b61eSAmit Cohen if [ "$action" != $expected_action ]; then 16883b2b61eSAmit Cohen check_err 1 "Trap $trap_name has wrong action: $action" 16983b2b61eSAmit Cohen fi 17083b2b61eSAmit Cohen} 17183b2b61eSAmit Cohen 17283b2b61eSAmit Cohenmtu_value_is_too_small_test() 17383b2b61eSAmit Cohen{ 17483b2b61eSAmit Cohen local trap_name="mtu_value_is_too_small" 17583b2b61eSAmit Cohen local expected_action="trap" 17683b2b61eSAmit Cohen local mz_pid 17783b2b61eSAmit Cohen 17883b2b61eSAmit Cohen RET=0 17983b2b61eSAmit Cohen 18083b2b61eSAmit Cohen ping_check $trap_name 18183b2b61eSAmit Cohen trap_action_check $trap_name $expected_action 18283b2b61eSAmit Cohen 18383b2b61eSAmit Cohen # type - Destination Unreachable 18483b2b61eSAmit Cohen # code - Fragmentation Needed and Don't Fragment was Set 18583b2b61eSAmit Cohen tc filter add dev $h1 ingress protocol ip pref 1 handle 101 \ 18683b2b61eSAmit Cohen flower skip_hw ip_proto icmp type 3 code 4 action pass 18783b2b61eSAmit Cohen 18883b2b61eSAmit Cohen mtu_set $rp2 1300 18983b2b61eSAmit Cohen 19083b2b61eSAmit Cohen # Generate IP packets bigger than router's MTU with don't fragment 19183b2b61eSAmit Cohen # flag on. 19283b2b61eSAmit Cohen $MZ $h1 -t udp "sp=54321,dp=12345,df" -p 1400 -c 0 -d 1msec -b $rp1mac \ 19383b2b61eSAmit Cohen -B 198.51.100.1 -q & 19483b2b61eSAmit Cohen mz_pid=$! 19583b2b61eSAmit Cohen 19604cc99d9SIdo Schimmel devlink_trap_exception_test $trap_name 19783b2b61eSAmit Cohen 19883b2b61eSAmit Cohen tc_check_packets_hitting "dev $h1 ingress" 101 19983b2b61eSAmit Cohen check_err $? "Packets were not received to h1" 20083b2b61eSAmit Cohen 20183b2b61eSAmit Cohen log_test "MTU value is too small" 20283b2b61eSAmit Cohen 20383b2b61eSAmit Cohen mtu_restore $rp2 20483b2b61eSAmit Cohen 205*46f6569cSPetr Machata kill_process $mz_pid 20683b2b61eSAmit Cohen tc filter del dev $h1 ingress protocol ip pref 1 handle 101 flower 20783b2b61eSAmit Cohen} 20883b2b61eSAmit Cohen 20983b2b61eSAmit Cohen__ttl_value_is_too_small_test() 21083b2b61eSAmit Cohen{ 21183b2b61eSAmit Cohen local ttl_val=$1; shift 21283b2b61eSAmit Cohen local trap_name="ttl_value_is_too_small" 21383b2b61eSAmit Cohen local expected_action="trap" 21483b2b61eSAmit Cohen local mz_pid 21583b2b61eSAmit Cohen 21683b2b61eSAmit Cohen RET=0 21783b2b61eSAmit Cohen 21883b2b61eSAmit Cohen ping_check $trap_name 21983b2b61eSAmit Cohen trap_action_check $trap_name $expected_action 22083b2b61eSAmit Cohen 22183b2b61eSAmit Cohen # type - Time Exceeded 22283b2b61eSAmit Cohen # code - Time to Live exceeded in Transit 22383b2b61eSAmit Cohen tc filter add dev $h1 ingress protocol ip pref 1 handle 101 \ 22483b2b61eSAmit Cohen flower skip_hw ip_proto icmp type 11 code 0 action pass 22583b2b61eSAmit Cohen 22683b2b61eSAmit Cohen # Generate IP packets with small TTL 22783b2b61eSAmit Cohen $MZ $h1 -t udp "ttl=$ttl_val,sp=54321,dp=12345" -c 0 -d 1msec \ 22883b2b61eSAmit Cohen -b $rp1mac -B 198.51.100.1 -q & 22983b2b61eSAmit Cohen mz_pid=$! 23083b2b61eSAmit Cohen 23104cc99d9SIdo Schimmel devlink_trap_exception_test $trap_name 23283b2b61eSAmit Cohen 23383b2b61eSAmit Cohen tc_check_packets_hitting "dev $h1 ingress" 101 23483b2b61eSAmit Cohen check_err $? "Packets were not received to h1" 23583b2b61eSAmit Cohen 23683b2b61eSAmit Cohen log_test "TTL value is too small: TTL=$ttl_val" 23783b2b61eSAmit Cohen 238*46f6569cSPetr Machata kill_process $mz_pid 23983b2b61eSAmit Cohen tc filter del dev $h1 ingress protocol ip pref 1 handle 101 flower 24083b2b61eSAmit Cohen} 24183b2b61eSAmit Cohen 24283b2b61eSAmit Cohenttl_value_is_too_small_test() 24383b2b61eSAmit Cohen{ 24483b2b61eSAmit Cohen __ttl_value_is_too_small_test 0 24583b2b61eSAmit Cohen __ttl_value_is_too_small_test 1 24683b2b61eSAmit Cohen} 24783b2b61eSAmit Cohen 24883b2b61eSAmit Cohenstart_mcd() 24983b2b61eSAmit Cohen{ 25083b2b61eSAmit Cohen SMCROUTEDIR="$(mktemp -d)" 25183b2b61eSAmit Cohen for ((i = 1; i <= $NUM_NETIFS; ++i)); do 25283b2b61eSAmit Cohen echo "phyint ${NETIFS[p$i]} enable" >> \ 25383b2b61eSAmit Cohen $SMCROUTEDIR/$table_name.conf 25483b2b61eSAmit Cohen done 25583b2b61eSAmit Cohen 25683b2b61eSAmit Cohen $MCD -N -I $table_name -f $SMCROUTEDIR/$table_name.conf \ 25783b2b61eSAmit Cohen -P $SMCROUTEDIR/$table_name.pid 25883b2b61eSAmit Cohen} 25983b2b61eSAmit Cohen 26083b2b61eSAmit Cohenkill_mcd() 26183b2b61eSAmit Cohen{ 26283b2b61eSAmit Cohen pkill $MCD 26383b2b61eSAmit Cohen rm -rf $SMCROUTEDIR 26483b2b61eSAmit Cohen} 26583b2b61eSAmit Cohen 26683b2b61eSAmit Cohen__mc_reverse_path_forwarding_test() 26783b2b61eSAmit Cohen{ 26883b2b61eSAmit Cohen local desc=$1; shift 26983b2b61eSAmit Cohen local src_ip=$1; shift 27083b2b61eSAmit Cohen local dst_ip=$1; shift 27183b2b61eSAmit Cohen local dst_mac=$1; shift 27283b2b61eSAmit Cohen local proto=$1; shift 27383b2b61eSAmit Cohen local flags=${1:-""}; shift 27483b2b61eSAmit Cohen local trap_name="mc_reverse_path_forwarding" 27583b2b61eSAmit Cohen local expected_action="trap" 27683b2b61eSAmit Cohen local mz_pid 27783b2b61eSAmit Cohen 27883b2b61eSAmit Cohen RET=0 27983b2b61eSAmit Cohen 28083b2b61eSAmit Cohen ping_check $trap_name 28183b2b61eSAmit Cohen trap_action_check $trap_name $expected_action 28283b2b61eSAmit Cohen 28383b2b61eSAmit Cohen tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \ 28483b2b61eSAmit Cohen flower dst_ip $dst_ip ip_proto udp action drop 28583b2b61eSAmit Cohen 28683b2b61eSAmit Cohen $MC_CLI -I $table_name add $rp1 $src_ip $dst_ip $rp2 28783b2b61eSAmit Cohen 28883b2b61eSAmit Cohen # Generate packets to multicast address. 28983b2b61eSAmit Cohen $MZ $h2 $flags -t udp "sp=54321,dp=12345" -c 0 -p 128 \ 29083b2b61eSAmit Cohen -a 00:11:22:33:44:55 -b $dst_mac \ 29183b2b61eSAmit Cohen -A $src_ip -B $dst_ip -q & 29283b2b61eSAmit Cohen 29383b2b61eSAmit Cohen mz_pid=$! 29483b2b61eSAmit Cohen 29504cc99d9SIdo Schimmel devlink_trap_exception_test $trap_name 29683b2b61eSAmit Cohen 29783b2b61eSAmit Cohen tc_check_packets "dev $rp2 egress" 101 0 29883b2b61eSAmit Cohen check_err $? "Packets were not dropped" 29983b2b61eSAmit Cohen 30083b2b61eSAmit Cohen log_test "Multicast reverse path forwarding: $desc" 30183b2b61eSAmit Cohen 302*46f6569cSPetr Machata kill_process $mz_pid 30383b2b61eSAmit Cohen tc filter del dev $rp2 egress protocol $proto pref 1 handle 101 flower 30483b2b61eSAmit Cohen} 30583b2b61eSAmit Cohen 30683b2b61eSAmit Cohenmc_reverse_path_forwarding_test() 30783b2b61eSAmit Cohen{ 30883b2b61eSAmit Cohen __mc_reverse_path_forwarding_test "IPv4" "192.0.2.1" "225.1.2.3" \ 30983b2b61eSAmit Cohen "01:00:5e:01:02:03" "ip" 31083b2b61eSAmit Cohen __mc_reverse_path_forwarding_test "IPv6" "2001:db8:1::1" "ff0e::3" \ 31183b2b61eSAmit Cohen "33:33:00:00:00:03" "ipv6" "-6" 31283b2b61eSAmit Cohen} 31383b2b61eSAmit Cohen 31483b2b61eSAmit Cohen__reject_route_test() 31583b2b61eSAmit Cohen{ 31683b2b61eSAmit Cohen local desc=$1; shift 31783b2b61eSAmit Cohen local dst_ip=$1; shift 31883b2b61eSAmit Cohen local proto=$1; shift 31983b2b61eSAmit Cohen local ip_proto=$1; shift 32083b2b61eSAmit Cohen local type=$1; shift 32183b2b61eSAmit Cohen local code=$1; shift 32283b2b61eSAmit Cohen local unreachable=$1; shift 32383b2b61eSAmit Cohen local flags=${1:-""}; shift 32483b2b61eSAmit Cohen local trap_name="reject_route" 32583b2b61eSAmit Cohen local expected_action="trap" 32683b2b61eSAmit Cohen local mz_pid 32783b2b61eSAmit Cohen 32883b2b61eSAmit Cohen RET=0 32983b2b61eSAmit Cohen 33083b2b61eSAmit Cohen ping_check $trap_name 33183b2b61eSAmit Cohen trap_action_check $trap_name $expected_action 33283b2b61eSAmit Cohen 33383b2b61eSAmit Cohen tc filter add dev $h1 ingress protocol $proto pref 1 handle 101 flower \ 33483b2b61eSAmit Cohen skip_hw ip_proto $ip_proto type $type code $code action pass 33583b2b61eSAmit Cohen 33683b2b61eSAmit Cohen ip route add unreachable $unreachable 33783b2b61eSAmit Cohen 33883b2b61eSAmit Cohen # Generate pacekts to h2. The destination IP is unreachable. 33983b2b61eSAmit Cohen $MZ $flags $h1 -t udp "sp=54321,dp=12345" -c 0 -d 1msec -b $rp1mac \ 34083b2b61eSAmit Cohen -B $dst_ip -q & 34183b2b61eSAmit Cohen mz_pid=$! 34283b2b61eSAmit Cohen 34304cc99d9SIdo Schimmel devlink_trap_exception_test $trap_name 34483b2b61eSAmit Cohen 34583b2b61eSAmit Cohen tc_check_packets_hitting "dev $h1 ingress" 101 34683b2b61eSAmit Cohen check_err $? "ICMP packet was not received to h1" 34783b2b61eSAmit Cohen 34883b2b61eSAmit Cohen log_test "Reject route: $desc" 34983b2b61eSAmit Cohen 350*46f6569cSPetr Machata kill_process $mz_pid 35183b2b61eSAmit Cohen ip route del unreachable $unreachable 35283b2b61eSAmit Cohen tc filter del dev $h1 ingress protocol $proto pref 1 handle 101 flower 35383b2b61eSAmit Cohen} 35483b2b61eSAmit Cohen 35583b2b61eSAmit Cohenreject_route_test() 35683b2b61eSAmit Cohen{ 35783b2b61eSAmit Cohen # type - Destination Unreachable 35883b2b61eSAmit Cohen # code - Host Unreachable 35983b2b61eSAmit Cohen __reject_route_test "IPv4" 198.51.100.1 "ip" "icmp" 3 1 \ 36083b2b61eSAmit Cohen "198.51.100.0/26" 36183b2b61eSAmit Cohen # type - Destination Unreachable 36283b2b61eSAmit Cohen # code - No Route 36383b2b61eSAmit Cohen __reject_route_test "IPv6" 2001:db8:2::1 "ipv6" "icmpv6" 1 0 \ 36483b2b61eSAmit Cohen "2001:db8:2::0/66" "-6" 36583b2b61eSAmit Cohen} 36683b2b61eSAmit Cohen 36783b2b61eSAmit Cohen__host_miss_test() 36883b2b61eSAmit Cohen{ 36983b2b61eSAmit Cohen local desc=$1; shift 37083b2b61eSAmit Cohen local dip=$1; shift 37183b2b61eSAmit Cohen local trap_name="unresolved_neigh" 37283b2b61eSAmit Cohen local expected_action="trap" 37383b2b61eSAmit Cohen local mz_pid 37483b2b61eSAmit Cohen 37583b2b61eSAmit Cohen RET=0 37683b2b61eSAmit Cohen 37783b2b61eSAmit Cohen ping_check $trap_name 37883b2b61eSAmit Cohen trap_action_check $trap_name $expected_action 37983b2b61eSAmit Cohen 38083b2b61eSAmit Cohen ip neigh flush dev $rp2 38183b2b61eSAmit Cohen 38283b2b61eSAmit Cohen t0_packets=$(devlink_trap_rx_packets_get $trap_name) 38383b2b61eSAmit Cohen 38483b2b61eSAmit Cohen # Generate packets to h2 (will incur a unresolved neighbor). 38583b2b61eSAmit Cohen # The ping should pass and devlink counters should be increased. 38683b2b61eSAmit Cohen ping_do $h1 $dip 38783b2b61eSAmit Cohen check_err $? "ping failed: $desc" 38883b2b61eSAmit Cohen 38983b2b61eSAmit Cohen t1_packets=$(devlink_trap_rx_packets_get $trap_name) 39083b2b61eSAmit Cohen 39183b2b61eSAmit Cohen if [[ $t0_packets -eq $t1_packets ]]; then 39283b2b61eSAmit Cohen check_err 1 "Trap counter did not increase" 39383b2b61eSAmit Cohen fi 39483b2b61eSAmit Cohen 39583b2b61eSAmit Cohen log_test "Unresolved neigh: host miss: $desc" 39683b2b61eSAmit Cohen} 39783b2b61eSAmit Cohen 39883b2b61eSAmit Cohen__invalid_nexthop_test() 39983b2b61eSAmit Cohen{ 40083b2b61eSAmit Cohen local desc=$1; shift 40183b2b61eSAmit Cohen local dip=$1; shift 40283b2b61eSAmit Cohen local extra_add=$1; shift 40383b2b61eSAmit Cohen local subnet=$1; shift 40483b2b61eSAmit Cohen local via_add=$1; shift 40583b2b61eSAmit Cohen local trap_name="unresolved_neigh" 40683b2b61eSAmit Cohen local expected_action="trap" 40783b2b61eSAmit Cohen local mz_pid 40883b2b61eSAmit Cohen 40983b2b61eSAmit Cohen RET=0 41083b2b61eSAmit Cohen 41183b2b61eSAmit Cohen ping_check $trap_name 41283b2b61eSAmit Cohen trap_action_check $trap_name $expected_action 41383b2b61eSAmit Cohen 41483b2b61eSAmit Cohen ip address add $extra_add/$subnet dev $h2 41583b2b61eSAmit Cohen 41683b2b61eSAmit Cohen # Check that correct route does not trigger unresolved_neigh 41783b2b61eSAmit Cohen ip $flags route add $dip via $extra_add dev $rp2 41883b2b61eSAmit Cohen 41983b2b61eSAmit Cohen # Generate packets in order to discover all neighbours. 42083b2b61eSAmit Cohen # Without it, counters of unresolved_neigh will be increased 42183b2b61eSAmit Cohen # during neighbours discovery and the check below will fail 42283b2b61eSAmit Cohen # for a wrong reason 42383b2b61eSAmit Cohen ping_do $h1 $dip 42483b2b61eSAmit Cohen 42583b2b61eSAmit Cohen t0_packets=$(devlink_trap_rx_packets_get $trap_name) 42683b2b61eSAmit Cohen ping_do $h1 $dip 42783b2b61eSAmit Cohen t1_packets=$(devlink_trap_rx_packets_get $trap_name) 42883b2b61eSAmit Cohen 42983b2b61eSAmit Cohen if [[ $t0_packets -ne $t1_packets ]]; then 43083b2b61eSAmit Cohen check_err 1 "Trap counter increased when it should not" 43183b2b61eSAmit Cohen fi 43283b2b61eSAmit Cohen 43383b2b61eSAmit Cohen ip $flags route del $dip via $extra_add dev $rp2 43483b2b61eSAmit Cohen 43583b2b61eSAmit Cohen # Check that route to nexthop that does not exist trigger 43683b2b61eSAmit Cohen # unresolved_neigh 43783b2b61eSAmit Cohen ip $flags route add $dip via $via_add dev $h2 43883b2b61eSAmit Cohen 43983b2b61eSAmit Cohen t0_packets=$(devlink_trap_rx_packets_get $trap_name) 44083b2b61eSAmit Cohen ping_do $h1 $dip 44183b2b61eSAmit Cohen t1_packets=$(devlink_trap_rx_packets_get $trap_name) 44283b2b61eSAmit Cohen 44383b2b61eSAmit Cohen if [[ $t0_packets -eq $t1_packets ]]; then 44483b2b61eSAmit Cohen check_err 1 "Trap counter did not increase" 44583b2b61eSAmit Cohen fi 44683b2b61eSAmit Cohen 44783b2b61eSAmit Cohen ip $flags route del $dip via $via_add dev $h2 44883b2b61eSAmit Cohen ip address del $extra_add/$subnet dev $h2 44983b2b61eSAmit Cohen log_test "Unresolved neigh: nexthop does not exist: $desc" 45083b2b61eSAmit Cohen} 45183b2b61eSAmit Cohen 45286158472SIdo Schimmel__invalid_nexthop_bucket_test() 45386158472SIdo Schimmel{ 45486158472SIdo Schimmel local desc=$1; shift 45586158472SIdo Schimmel local dip=$1; shift 45686158472SIdo Schimmel local via_add=$1; shift 45786158472SIdo Schimmel local trap_name="unresolved_neigh" 45886158472SIdo Schimmel 45986158472SIdo Schimmel RET=0 46086158472SIdo Schimmel 46186158472SIdo Schimmel # Check that route to nexthop that does not exist triggers 46286158472SIdo Schimmel # unresolved_neigh 46386158472SIdo Schimmel ip nexthop add id 1 via $via_add dev $rp2 46486158472SIdo Schimmel ip nexthop add id 10 group 1 type resilient buckets 32 46586158472SIdo Schimmel ip route add $dip nhid 10 46686158472SIdo Schimmel 46786158472SIdo Schimmel t0_packets=$(devlink_trap_rx_packets_get $trap_name) 46886158472SIdo Schimmel ping_do $h1 $dip 46986158472SIdo Schimmel t1_packets=$(devlink_trap_rx_packets_get $trap_name) 47086158472SIdo Schimmel 47186158472SIdo Schimmel if [[ $t0_packets -eq $t1_packets ]]; then 47286158472SIdo Schimmel check_err 1 "Trap counter did not increase" 47386158472SIdo Schimmel fi 47486158472SIdo Schimmel 47586158472SIdo Schimmel ip route del $dip nhid 10 47686158472SIdo Schimmel ip nexthop del id 10 47786158472SIdo Schimmel ip nexthop del id 1 47886158472SIdo Schimmel log_test "Unresolved neigh: nexthop bucket does not exist: $desc" 47986158472SIdo Schimmel} 48086158472SIdo Schimmel 48183b2b61eSAmit Cohenunresolved_neigh_test() 48283b2b61eSAmit Cohen{ 48383b2b61eSAmit Cohen __host_miss_test "IPv4" 198.51.100.1 48483b2b61eSAmit Cohen __host_miss_test "IPv6" 2001:db8:2::1 48583b2b61eSAmit Cohen __invalid_nexthop_test "IPv4" 198.51.100.1 198.51.100.3 24 198.51.100.4 48683b2b61eSAmit Cohen __invalid_nexthop_test "IPv6" 2001:db8:2::1 2001:db8:2::3 64 \ 48783b2b61eSAmit Cohen 2001:db8:2::4 48886158472SIdo Schimmel __invalid_nexthop_bucket_test "IPv4" 198.51.100.1 198.51.100.4 48986158472SIdo Schimmel __invalid_nexthop_bucket_test "IPv6" 2001:db8:2::1 2001:db8:2::4 49083b2b61eSAmit Cohen} 49183b2b61eSAmit Cohen 49283b2b61eSAmit Cohenvrf_without_routes_create() 49383b2b61eSAmit Cohen{ 49483b2b61eSAmit Cohen # VRF creating makes the links to be down and then up again. 49583b2b61eSAmit Cohen # By default, IPv6 address is not saved after link becomes down. 49683b2b61eSAmit Cohen # Save IPv6 address using sysctl configuration. 49783b2b61eSAmit Cohen sysctl_set net.ipv6.conf.$rp1.keep_addr_on_down 1 49883b2b61eSAmit Cohen sysctl_set net.ipv6.conf.$rp2.keep_addr_on_down 1 49983b2b61eSAmit Cohen 50083b2b61eSAmit Cohen ip link add dev vrf1 type vrf table 101 50183b2b61eSAmit Cohen ip link set dev $rp1 master vrf1 50283b2b61eSAmit Cohen ip link set dev $rp2 master vrf1 50383b2b61eSAmit Cohen ip link set dev vrf1 up 50483b2b61eSAmit Cohen 50583b2b61eSAmit Cohen # Wait for rp1 and rp2 to be up 50683b2b61eSAmit Cohen setup_wait 50783b2b61eSAmit Cohen} 50883b2b61eSAmit Cohen 50983b2b61eSAmit Cohenvrf_without_routes_destroy() 51083b2b61eSAmit Cohen{ 51183b2b61eSAmit Cohen ip link set dev $rp1 nomaster 51283b2b61eSAmit Cohen ip link set dev $rp2 nomaster 51383b2b61eSAmit Cohen ip link del dev vrf1 51483b2b61eSAmit Cohen 51583b2b61eSAmit Cohen sysctl_restore net.ipv6.conf.$rp2.keep_addr_on_down 51683b2b61eSAmit Cohen sysctl_restore net.ipv6.conf.$rp1.keep_addr_on_down 51783b2b61eSAmit Cohen 51883b2b61eSAmit Cohen # Wait for interfaces to be up 51983b2b61eSAmit Cohen setup_wait 52083b2b61eSAmit Cohen} 52183b2b61eSAmit Cohen 52283b2b61eSAmit Cohenipv4_lpm_miss_test() 52383b2b61eSAmit Cohen{ 52483b2b61eSAmit Cohen local trap_name="ipv4_lpm_miss" 52583b2b61eSAmit Cohen local expected_action="trap" 52683b2b61eSAmit Cohen local mz_pid 52783b2b61eSAmit Cohen 52883b2b61eSAmit Cohen RET=0 52983b2b61eSAmit Cohen 53083b2b61eSAmit Cohen ping_check $trap_name 53183b2b61eSAmit Cohen trap_action_check $trap_name $expected_action 53283b2b61eSAmit Cohen 53383b2b61eSAmit Cohen # Create a VRF without a default route 53483b2b61eSAmit Cohen vrf_without_routes_create 53583b2b61eSAmit Cohen 53683b2b61eSAmit Cohen # Generate packets through a VRF without a matching route. 53783b2b61eSAmit Cohen $MZ $h1 -t udp "sp=54321,dp=12345" -c 0 -d 1msec -b $rp1mac \ 53883b2b61eSAmit Cohen -B 203.0.113.1 -q & 53983b2b61eSAmit Cohen mz_pid=$! 54083b2b61eSAmit Cohen 54104cc99d9SIdo Schimmel devlink_trap_exception_test $trap_name 54283b2b61eSAmit Cohen 54383b2b61eSAmit Cohen log_test "LPM miss: IPv4" 54483b2b61eSAmit Cohen 545*46f6569cSPetr Machata kill_process $mz_pid 54683b2b61eSAmit Cohen vrf_without_routes_destroy 54783b2b61eSAmit Cohen} 54883b2b61eSAmit Cohen 54983b2b61eSAmit Cohenipv6_lpm_miss_test() 55083b2b61eSAmit Cohen{ 55183b2b61eSAmit Cohen local trap_name="ipv6_lpm_miss" 55283b2b61eSAmit Cohen local expected_action="trap" 55383b2b61eSAmit Cohen local mz_pid 55483b2b61eSAmit Cohen 55583b2b61eSAmit Cohen RET=0 55683b2b61eSAmit Cohen 55783b2b61eSAmit Cohen ping_check $trap_name 55883b2b61eSAmit Cohen trap_action_check $trap_name $expected_action 55983b2b61eSAmit Cohen 56083b2b61eSAmit Cohen # Create a VRF without a default route 56183b2b61eSAmit Cohen vrf_without_routes_create 56283b2b61eSAmit Cohen 56383b2b61eSAmit Cohen # Generate packets through a VRF without a matching route. 56483b2b61eSAmit Cohen $MZ -6 $h1 -t udp "sp=54321,dp=12345" -c 0 -d 1msec -b $rp1mac \ 56583b2b61eSAmit Cohen -B 2001:db8::1 -q & 56683b2b61eSAmit Cohen mz_pid=$! 56783b2b61eSAmit Cohen 56804cc99d9SIdo Schimmel devlink_trap_exception_test $trap_name 56983b2b61eSAmit Cohen 57083b2b61eSAmit Cohen log_test "LPM miss: IPv6" 57183b2b61eSAmit Cohen 572*46f6569cSPetr Machata kill_process $mz_pid 57383b2b61eSAmit Cohen vrf_without_routes_destroy 57483b2b61eSAmit Cohen} 57583b2b61eSAmit Cohen 57683b2b61eSAmit Cohentrap cleanup EXIT 57783b2b61eSAmit Cohen 57883b2b61eSAmit Cohensetup_prepare 57983b2b61eSAmit Cohensetup_wait 58083b2b61eSAmit Cohen 58183b2b61eSAmit Cohentests_run 58283b2b61eSAmit Cohen 58383b2b61eSAmit Cohenexit $EXIT_STATUS 584