0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 lib_dir=$(dirname $0)/../../../net/forwarding
0041
0042 ALL_TESTS="
0043 non_ip_test
0044 uc_dip_over_mc_dmac_test
0045 dip_is_loopback_test
0046 sip_is_mc_test
0047 sip_is_loopback_test
0048 ip_header_corrupted_test
0049 ipv4_sip_is_limited_bc_test
0050 ipv6_mc_dip_reserved_scope_test
0051 ipv6_mc_dip_interface_local_scope_test
0052 blackhole_route_test
0053 irif_disabled_test
0054 erif_disabled_test
0055 blackhole_nexthop_test
0056 "
0057
0058 NUM_NETIFS=4
0059 source $lib_dir/lib.sh
0060 source $lib_dir/tc_common.sh
0061 source $lib_dir/devlink_lib.sh
0062
0063 h1_create()
0064 {
0065 simple_if_init $h1 192.0.2.1/24 2001:db8:1::1/64
0066
0067 ip -4 route add default vrf v$h1 nexthop via 192.0.2.2
0068 ip -6 route add default vrf v$h1 nexthop via 2001:db8:1::2
0069 }
0070
0071 h1_destroy()
0072 {
0073 ip -6 route del default vrf v$h1 nexthop via 2001:db8:1::2
0074 ip -4 route del default vrf v$h1 nexthop via 192.0.2.2
0075
0076 simple_if_fini $h1 192.0.2.1/24 2001:db8:1::1/64
0077 }
0078
0079 h2_create()
0080 {
0081 simple_if_init $h2 $h2_ipv4/24 $h2_ipv6/64
0082
0083 ip -4 route add default vrf v$h2 nexthop via 198.51.100.2
0084 ip -6 route add default vrf v$h2 nexthop via 2001:db8:2::2
0085 }
0086
0087 h2_destroy()
0088 {
0089 ip -6 route del default vrf v$h2 nexthop via 2001:db8:2::2
0090 ip -4 route del default vrf v$h2 nexthop via 198.51.100.2
0091
0092 simple_if_fini $h2 $h2_ipv4/24 $h2_ipv6/64
0093 }
0094
0095 router_create()
0096 {
0097 ip link set dev $rp1 up
0098 ip link set dev $rp2 up
0099
0100 tc qdisc add dev $rp2 clsact
0101
0102 __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
0103 __addr_add_del $rp2 add 198.51.100.2/24 2001:db8:2::2/64
0104 }
0105
0106 router_destroy()
0107 {
0108 __addr_add_del $rp2 del 198.51.100.2/24 2001:db8:2::2/64
0109 __addr_add_del $rp1 del 192.0.2.2/24 2001:db8:1::2/64
0110
0111 tc qdisc del dev $rp2 clsact
0112
0113 ip link set dev $rp2 down
0114 ip link set dev $rp1 down
0115 }
0116
0117 setup_prepare()
0118 {
0119 h1=${NETIFS[p1]}
0120 rp1=${NETIFS[p2]}
0121
0122 rp2=${NETIFS[p3]}
0123 h2=${NETIFS[p4]}
0124
0125 h1mac=$(mac_get $h1)
0126 rp1mac=$(mac_get $rp1)
0127
0128 h1_ipv4=192.0.2.1
0129 h2_ipv4=198.51.100.1
0130 h1_ipv6=2001:db8:1::1
0131 h2_ipv6=2001:db8:2::1
0132
0133 vrf_prepare
0134 forwarding_enable
0135
0136 h1_create
0137 h2_create
0138
0139 router_create
0140 }
0141
0142 cleanup()
0143 {
0144 pre_cleanup
0145
0146 router_destroy
0147
0148 h2_destroy
0149 h1_destroy
0150
0151 forwarding_restore
0152 vrf_cleanup
0153 }
0154
0155 ping_check()
0156 {
0157 trap_name=$1; shift
0158
0159 devlink_trap_action_set $trap_name "trap"
0160 ping_do $h1 $h2_ipv4
0161 check_err $? "Packets that should not be trapped were trapped"
0162 devlink_trap_action_set $trap_name "drop"
0163 }
0164
0165 non_ip_test()
0166 {
0167 local trap_name="non_ip"
0168 local mz_pid
0169
0170 RET=0
0171
0172 ping_check $trap_name
0173
0174 tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
0175 flower dst_ip $h2_ipv4 action drop
0176
0177
0178 $MZ $h1 -c 0 -p 100 -d 1msec -B $h2_ipv4 -q "$rp1mac $h1mac \
0179 00:00 de:ad:be:ef" &
0180 mz_pid=$!
0181
0182 devlink_trap_drop_test $trap_name $rp2 101
0183
0184 log_test "Non IP"
0185
0186 devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101
0187 }
0188
0189 __uc_dip_over_mc_dmac_test()
0190 {
0191 local desc=$1; shift
0192 local proto=$1; shift
0193 local dip=$1; shift
0194 local flags=${1:-""}; shift
0195 local trap_name="uc_dip_over_mc_dmac"
0196 local dmac=01:02:03:04:05:06
0197 local mz_pid
0198
0199 RET=0
0200
0201 ping_check $trap_name
0202
0203 tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
0204 flower ip_proto udp src_port 54321 dst_port 12345 action drop
0205
0206
0207 $MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $dmac \
0208 -B $dip -d 1msec -q &
0209 mz_pid=$!
0210
0211 devlink_trap_drop_test $trap_name $rp2 101
0212
0213 log_test "Unicast destination IP over multicast destination MAC: $desc"
0214
0215 devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
0216 }
0217
0218 uc_dip_over_mc_dmac_test()
0219 {
0220 __uc_dip_over_mc_dmac_test "IPv4" "ip" $h2_ipv4
0221 __uc_dip_over_mc_dmac_test "IPv6" "ipv6" $h2_ipv6 "-6"
0222 }
0223
0224 __sip_is_loopback_test()
0225 {
0226 local desc=$1; shift
0227 local proto=$1; shift
0228 local sip=$1; shift
0229 local dip=$1; shift
0230 local flags=${1:-""}; shift
0231 local trap_name="sip_is_loopback_address"
0232 local mz_pid
0233
0234 RET=0
0235
0236 ping_check $trap_name
0237
0238 tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
0239 flower src_ip $sip action drop
0240
0241
0242 $MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -A $sip \
0243 -b $rp1mac -B $dip -d 1msec -q &
0244 mz_pid=$!
0245
0246 devlink_trap_drop_test $trap_name $rp2 101
0247
0248 log_test "Source IP is loopback address: $desc"
0249
0250 devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
0251 }
0252
0253 sip_is_loopback_test()
0254 {
0255 __sip_is_loopback_test "IPv4" "ip" "127.0.0.0/8" $h2_ipv4
0256 __sip_is_loopback_test "IPv6" "ipv6" "::1" $h2_ipv6 "-6"
0257 }
0258
0259 __dip_is_loopback_test()
0260 {
0261 local desc=$1; shift
0262 local proto=$1; shift
0263 local dip=$1; shift
0264 local flags=${1:-""}; shift
0265 local trap_name="dip_is_loopback_address"
0266 local mz_pid
0267
0268 RET=0
0269
0270 ping_check $trap_name
0271
0272 tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
0273 flower dst_ip $dip action drop
0274
0275
0276 $MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $rp1mac \
0277 -B $dip -d 1msec -q &
0278 mz_pid=$!
0279
0280 devlink_trap_drop_test $trap_name $rp2 101
0281
0282 log_test "Destination IP is loopback address: $desc"
0283
0284 devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
0285 }
0286
0287 dip_is_loopback_test()
0288 {
0289 __dip_is_loopback_test "IPv4" "ip" "127.0.0.0/8"
0290 __dip_is_loopback_test "IPv6" "ipv6" "::1" "-6"
0291 }
0292
0293 __sip_is_mc_test()
0294 {
0295 local desc=$1; shift
0296 local proto=$1; shift
0297 local sip=$1; shift
0298 local dip=$1; shift
0299 local flags=${1:-""}; shift
0300 local trap_name="sip_is_mc"
0301 local mz_pid
0302
0303 RET=0
0304
0305 ping_check $trap_name
0306
0307 tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
0308 flower src_ip $sip action drop
0309
0310
0311 $MZ $h1 $flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -A $sip \
0312 -b $rp1mac -B $dip -d 1msec -q &
0313 mz_pid=$!
0314
0315 devlink_trap_drop_test $trap_name $rp2 101
0316
0317 log_test "Source IP is multicast: $desc"
0318
0319 devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
0320 }
0321
0322 sip_is_mc_test()
0323 {
0324 __sip_is_mc_test "IPv4" "ip" "239.1.1.1" $h2_ipv4
0325 __sip_is_mc_test "IPv6" "ipv6" "FF02::2" $h2_ipv6 "-6"
0326 }
0327
0328 ipv4_sip_is_limited_bc_test()
0329 {
0330 local trap_name="ipv4_sip_is_limited_bc"
0331 local sip=255.255.255.255
0332 local mz_pid
0333
0334 RET=0
0335
0336 ping_check $trap_name
0337
0338 tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
0339 flower src_ip $sip action drop
0340
0341
0342 $MZ $h1 -t udp "sp=54321,dp=12345" -c 0 -p 100 -A $sip -b $rp1mac \
0343 -B $h2_ipv4 -d 1msec -q &
0344 mz_pid=$!
0345
0346 devlink_trap_drop_test $trap_name $rp2 101
0347
0348 log_test "IPv4 source IP is limited broadcast"
0349
0350 devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101
0351 }
0352
0353 ipv4_payload_get()
0354 {
0355 local ipver=$1; shift
0356 local ihl=$1; shift
0357 local checksum=$1; shift
0358
0359 p=$(:
0360 )"08:00:"$( : ETH type
0361 )"$ipver"$( : IP version
0362 )"$ihl:"$( : IHL
0363 )"00:"$( : IP TOS
0364 )"00:F4:"$( : IP total length
0365 )"00:00:"$( : IP identification
0366 )"20:00:"$( : IP flags + frag off
0367 )"30:"$( : IP TTL
0368 )"01:"$( : IP proto
0369 )"$checksum:"$( : IP header csum
0370 )"$h1_ipv4:"$( : IP saddr
0371 )"$h2_ipv4:"$( : IP daddr
0372 )
0373 echo $p
0374 }
0375
0376 __ipv4_header_corrupted_test()
0377 {
0378 local desc=$1; shift
0379 local ipver=$1; shift
0380 local ihl=$1; shift
0381 local checksum=$1; shift
0382 local trap_name="ip_header_corrupted"
0383 local payload
0384 local mz_pid
0385
0386 RET=0
0387
0388 ping_check $trap_name
0389
0390 tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
0391 flower dst_ip $h2_ipv4 action drop
0392
0393 payload=$(ipv4_payload_get $ipver $ihl $checksum)
0394
0395
0396 $MZ $h1 -c 0 -d 1msec -a $h1mac -b $rp1mac -q p=$payload &
0397 mz_pid=$!
0398
0399 devlink_trap_drop_test $trap_name $rp2 101
0400
0401 log_test "IP header corrupted: $desc: IPv4"
0402
0403 devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101
0404 }
0405
0406 ipv6_payload_get()
0407 {
0408 local ipver=$1; shift
0409
0410 p=$(:
0411 )"86:DD:"$( : ETH type
0412 )"$ipver"$( : IP version
0413 )"0:0:"$( : Traffic class
0414 )"0:00:00:"$( : Flow label
0415 )"00:00:"$( : Payload length
0416 )"01:"$( : Next header
0417 )"04:"$( : Hop limit
0418 )"$h1_ipv6:"$( : IP saddr
0419 )"$h2_ipv6:"$( : IP daddr
0420 )
0421 echo $p
0422 }
0423
0424 __ipv6_header_corrupted_test()
0425 {
0426 local desc=$1; shift
0427 local ipver=$1; shift
0428 local trap_name="ip_header_corrupted"
0429 local payload
0430 local mz_pid
0431
0432 RET=0
0433
0434 ping_check $trap_name
0435
0436 tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \
0437 flower dst_ip $h2_ipv4 action drop
0438
0439 payload=$(ipv6_payload_get $ipver)
0440
0441
0442 $MZ $h1 -c 0 -d 1msec -a $h1mac -b $rp1mac -q p=$payload &
0443 mz_pid=$!
0444
0445 devlink_trap_drop_test $trap_name $rp2 101
0446
0447 log_test "IP header corrupted: $desc: IPv6"
0448
0449 devlink_trap_drop_cleanup $mz_pid $rp2 "ip" 1 101
0450 }
0451
0452 ip_header_corrupted_test()
0453 {
0454
0455 local ipv="4"
0456 local ihl="5"
0457 local checksum="00:F4"
0458
0459 __ipv4_header_corrupted_test "wrong IP version" 5 $ihl $checksum
0460 __ipv4_header_corrupted_test "wrong IHL" $ipv 4 $checksum
0461 __ipv4_header_corrupted_test "wrong checksum" $ipv $ihl "00:00"
0462 __ipv6_header_corrupted_test "wrong IP version" 5
0463 }
0464
0465 ipv6_mc_dip_reserved_scope_test()
0466 {
0467 local trap_name="ipv6_mc_dip_reserved_scope"
0468 local dip=FF00::
0469 local mz_pid
0470
0471 RET=0
0472
0473 ping_check $trap_name
0474
0475 tc filter add dev $rp2 egress protocol ipv6 pref 1 handle 101 \
0476 flower dst_ip $dip action drop
0477
0478
0479 $MZ $h1 -6 -t udp "sp=54321,dp=12345" -c 0 -p 100 -b \
0480 "33:33:00:00:00:00" -B $dip -d 1msec -q &
0481 mz_pid=$!
0482
0483 devlink_trap_drop_test $trap_name $rp2 101
0484
0485 log_test "IPv6 multicast destination IP reserved scope"
0486
0487 devlink_trap_drop_cleanup $mz_pid $rp2 "ipv6" 1 101
0488 }
0489
0490 ipv6_mc_dip_interface_local_scope_test()
0491 {
0492 local trap_name="ipv6_mc_dip_interface_local_scope"
0493 local dip=FF01::
0494 local mz_pid
0495
0496 RET=0
0497
0498 ping_check $trap_name
0499
0500 tc filter add dev $rp2 egress protocol ipv6 pref 1 handle 101 \
0501 flower dst_ip $dip action drop
0502
0503
0504 $MZ $h1 -6 -t udp "sp=54321,dp=12345" -c 0 -p 100 -b \
0505 "33:33:00:00:00:00" -B $dip -d 1msec -q &
0506 mz_pid=$!
0507
0508 devlink_trap_drop_test $trap_name $rp2 101
0509
0510 log_test "IPv6 multicast destination IP interface-local scope"
0511
0512 devlink_trap_drop_cleanup $mz_pid $rp2 "ipv6" 1 101
0513 }
0514
0515 __blackhole_route_test()
0516 {
0517 local flags=$1; shift
0518 local subnet=$1; shift
0519 local proto=$1; shift
0520 local dip=$1; shift
0521 local ip_proto=${1:-"icmp"}; shift
0522 local trap_name="blackhole_route"
0523 local mz_pid
0524
0525 RET=0
0526
0527 ping_check $trap_name
0528
0529 ip -$flags route add blackhole $subnet
0530 tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
0531 flower skip_hw dst_ip $dip ip_proto $ip_proto action drop
0532
0533
0534 $MZ $h1 -$flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $rp1mac \
0535 -B $dip -d 1msec -q &
0536 mz_pid=$!
0537
0538 devlink_trap_drop_test $trap_name $rp2 101
0539 log_test "Blackhole route: IPv$flags"
0540
0541 devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
0542 ip -$flags route del blackhole $subnet
0543 }
0544
0545 blackhole_route_test()
0546 {
0547 __blackhole_route_test "4" "198.51.100.0/30" "ip" $h2_ipv4
0548 __blackhole_route_test "6" "2001:db8:2::/120" "ipv6" $h2_ipv6 "icmpv6"
0549 }
0550
0551 irif_disabled_test()
0552 {
0553 local trap_name="irif_disabled"
0554 local t0_packets t0_bytes
0555 local t1_packets t1_bytes
0556 local mz_pid
0557
0558 RET=0
0559
0560 ping_check $trap_name
0561
0562 devlink_trap_action_set $trap_name "trap"
0563
0564
0565
0566
0567
0568
0569 ip link add dev br0 type bridge
0570 ip link set dev $rp1 master br0
0571 ip address flush dev $rp1
0572 __addr_add_del br0 add 192.0.2.2/24
0573 ip li set dev br0 up
0574
0575 t0_packets=$(devlink_trap_rx_packets_get $trap_name)
0576 t0_bytes=$(devlink_trap_rx_bytes_get $trap_name)
0577
0578
0579 $MZ $h1 -t udp "sp=54321,dp=12345" -c 0 -p 100 -a own -b $rp1mac \
0580 -B $h2_ipv4 -q &
0581 mz_pid=$!
0582
0583
0584 sleep 1
0585
0586
0587 ip address flush dev br0
0588
0589 t1_packets=$(devlink_trap_rx_packets_get $trap_name)
0590 t1_bytes=$(devlink_trap_rx_bytes_get $trap_name)
0591
0592 if [[ $t0_packets -eq $t1_packets && $t0_bytes -eq $t1_bytes ]]; then
0593 check_err 1 "Trap stats idle when packets should be trapped"
0594 fi
0595
0596 log_test "Ingress RIF disabled"
0597
0598 kill $mz_pid && wait $mz_pid &> /dev/null
0599 ip link set dev $rp1 nomaster
0600 __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
0601 ip link del dev br0 type bridge
0602 devlink_trap_action_set $trap_name "drop"
0603 }
0604
0605 erif_disabled_test()
0606 {
0607 local trap_name="erif_disabled"
0608 local t0_packets t0_bytes
0609 local t1_packets t1_bytes
0610 local mz_pid
0611
0612 RET=0
0613
0614 ping_check $trap_name
0615
0616 devlink_trap_action_set $trap_name "trap"
0617 ip link add dev br0 type bridge
0618 ip add flush dev $rp1
0619 ip link set dev $rp1 master br0
0620 __addr_add_del br0 add 192.0.2.2/24
0621 ip link set dev br0 up
0622
0623 t0_packets=$(devlink_trap_rx_packets_get $trap_name)
0624 t0_bytes=$(devlink_trap_rx_bytes_get $trap_name)
0625
0626 rp2mac=$(mac_get $rp2)
0627
0628
0629
0630 $MZ $h2 -t udp "sp=54321,dp=12345" -c 0 -p 100 -a own -b $rp2mac \
0631 -B 192.0.2.1 -q &
0632 mz_pid=$!
0633
0634 sleep 5
0635
0636
0637 ip link set dev $rp1 nomaster
0638
0639 t1_packets=$(devlink_trap_rx_packets_get $trap_name)
0640 t1_bytes=$(devlink_trap_rx_bytes_get $trap_name)
0641
0642 if [[ $t0_packets -eq $t1_packets && $t0_bytes -eq $t1_bytes ]]; then
0643 check_err 1 "Trap stats idle when packets should be trapped"
0644 fi
0645
0646 log_test "Egress RIF disabled"
0647
0648 kill $mz_pid && wait $mz_pid &> /dev/null
0649 __addr_add_del $rp1 add 192.0.2.2/24 2001:db8:1::2/64
0650 ip link del dev br0 type bridge
0651 devlink_trap_action_set $trap_name "drop"
0652 }
0653
0654 __blackhole_nexthop_test()
0655 {
0656 local flags=$1; shift
0657 local subnet=$1; shift
0658 local proto=$1; shift
0659 local dip=$1; shift
0660 local trap_name="blackhole_nexthop"
0661 local mz_pid
0662
0663 RET=0
0664
0665 ip -$flags nexthop add id 1 blackhole
0666 ip -$flags route add $subnet nhid 1
0667 tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \
0668 flower skip_hw dst_ip $dip ip_proto udp action drop
0669
0670
0671 $MZ $h1 -$flags -t udp "sp=54321,dp=12345" -c 0 -p 100 -b $rp1mac \
0672 -B $dip -d 1msec -q &
0673 mz_pid=$!
0674
0675 devlink_trap_drop_test $trap_name $rp2 101
0676 log_test "Blackhole nexthop: IPv$flags"
0677
0678 devlink_trap_drop_cleanup $mz_pid $rp2 $proto 1 101
0679 ip -$flags route del $subnet
0680 ip -$flags nexthop del id 1
0681 }
0682
0683 blackhole_nexthop_test()
0684 {
0685 __blackhole_nexthop_test "4" "198.51.100.0/30" "ip" $h2_ipv4
0686 __blackhole_nexthop_test "6" "2001:db8:2::/120" "ipv6" $h2_ipv6
0687 }
0688
0689 trap cleanup EXIT
0690
0691 setup_prepare
0692 setup_wait
0693
0694 tests_run
0695
0696 exit $EXIT_STATUS