18c2ecf20Sopenharmony_ci#!/bin/bash 28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ciALL_TESTS=" 58c2ecf20Sopenharmony_ci ping_ipv4 68c2ecf20Sopenharmony_ci ping_ipv6 78c2ecf20Sopenharmony_ci sip_in_class_e 88c2ecf20Sopenharmony_ci mc_mac_mismatch 98c2ecf20Sopenharmony_ci ipv4_sip_equal_dip 108c2ecf20Sopenharmony_ci ipv6_sip_equal_dip 118c2ecf20Sopenharmony_ci ipv4_dip_link_local 128c2ecf20Sopenharmony_ci" 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ciNUM_NETIFS=4 158c2ecf20Sopenharmony_cisource lib.sh 168c2ecf20Sopenharmony_cisource tc_common.sh 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_cirequire_command $MCD 198c2ecf20Sopenharmony_cirequire_command $MC_CLI 208c2ecf20Sopenharmony_citable_name=selftests 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_cih1_create() 238c2ecf20Sopenharmony_ci{ 248c2ecf20Sopenharmony_ci vrf_create "vrf-h1" 258c2ecf20Sopenharmony_ci ip link set dev $h1 master vrf-h1 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci ip link set dev vrf-h1 up 288c2ecf20Sopenharmony_ci ip link set dev $h1 up 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci ip address add 192.0.2.2/24 dev $h1 318c2ecf20Sopenharmony_ci ip address add 2001:db8:1::2/64 dev $h1 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci ip route add 198.51.100.0/24 vrf vrf-h1 nexthop via 192.0.2.1 348c2ecf20Sopenharmony_ci ip route add 2001:db8:2::/64 vrf vrf-h1 nexthop via 2001:db8:1::1 358c2ecf20Sopenharmony_ci} 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_cih1_destroy() 388c2ecf20Sopenharmony_ci{ 398c2ecf20Sopenharmony_ci ip route del 2001:db8:2::/64 vrf vrf-h1 408c2ecf20Sopenharmony_ci ip route del 198.51.100.0/24 vrf vrf-h1 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci ip address del 2001:db8:1::2/64 dev $h1 438c2ecf20Sopenharmony_ci ip address del 192.0.2.2/24 dev $h1 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci ip link set dev $h1 down 468c2ecf20Sopenharmony_ci vrf_destroy "vrf-h1" 478c2ecf20Sopenharmony_ci} 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_cih2_create() 508c2ecf20Sopenharmony_ci{ 518c2ecf20Sopenharmony_ci vrf_create "vrf-h2" 528c2ecf20Sopenharmony_ci ip link set dev $h2 master vrf-h2 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_ci ip link set dev vrf-h2 up 558c2ecf20Sopenharmony_ci ip link set dev $h2 up 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci ip address add 198.51.100.2/24 dev $h2 588c2ecf20Sopenharmony_ci ip address add 2001:db8:2::2/64 dev $h2 598c2ecf20Sopenharmony_ci 608c2ecf20Sopenharmony_ci ip route add 192.0.2.0/24 vrf vrf-h2 nexthop via 198.51.100.1 618c2ecf20Sopenharmony_ci ip route add 2001:db8:1::/64 vrf vrf-h2 nexthop via 2001:db8:2::1 628c2ecf20Sopenharmony_ci} 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_cih2_destroy() 658c2ecf20Sopenharmony_ci{ 668c2ecf20Sopenharmony_ci ip route del 2001:db8:1::/64 vrf vrf-h2 678c2ecf20Sopenharmony_ci ip route del 192.0.2.0/24 vrf vrf-h2 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci ip address del 2001:db8:2::2/64 dev $h2 708c2ecf20Sopenharmony_ci ip address del 198.51.100.2/24 dev $h2 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci ip link set dev $h2 down 738c2ecf20Sopenharmony_ci vrf_destroy "vrf-h2" 748c2ecf20Sopenharmony_ci} 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_cirouter_create() 778c2ecf20Sopenharmony_ci{ 788c2ecf20Sopenharmony_ci ip link set dev $rp1 up 798c2ecf20Sopenharmony_ci ip link set dev $rp2 up 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci tc qdisc add dev $rp2 clsact 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci ip address add 192.0.2.1/24 dev $rp1 848c2ecf20Sopenharmony_ci ip address add 2001:db8:1::1/64 dev $rp1 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci ip address add 198.51.100.1/24 dev $rp2 878c2ecf20Sopenharmony_ci ip address add 2001:db8:2::1/64 dev $rp2 888c2ecf20Sopenharmony_ci} 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_cirouter_destroy() 918c2ecf20Sopenharmony_ci{ 928c2ecf20Sopenharmony_ci ip address del 2001:db8:2::1/64 dev $rp2 938c2ecf20Sopenharmony_ci ip address del 198.51.100.1/24 dev $rp2 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_ci ip address del 2001:db8:1::1/64 dev $rp1 968c2ecf20Sopenharmony_ci ip address del 192.0.2.1/24 dev $rp1 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci tc qdisc del dev $rp2 clsact 998c2ecf20Sopenharmony_ci 1008c2ecf20Sopenharmony_ci ip link set dev $rp2 down 1018c2ecf20Sopenharmony_ci ip link set dev $rp1 down 1028c2ecf20Sopenharmony_ci} 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_cistart_mcd() 1058c2ecf20Sopenharmony_ci{ 1068c2ecf20Sopenharmony_ci SMCROUTEDIR="$(mktemp -d)" 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci for ((i = 1; i <= $NUM_NETIFS; ++i)); do 1098c2ecf20Sopenharmony_ci echo "phyint ${NETIFS[p$i]} enable" >> \ 1108c2ecf20Sopenharmony_ci $SMCROUTEDIR/$table_name.conf 1118c2ecf20Sopenharmony_ci done 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci $MCD -N -I $table_name -f $SMCROUTEDIR/$table_name.conf \ 1148c2ecf20Sopenharmony_ci -P $SMCROUTEDIR/$table_name.pid 1158c2ecf20Sopenharmony_ci} 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_cikill_mcd() 1188c2ecf20Sopenharmony_ci{ 1198c2ecf20Sopenharmony_ci pkill $MCD 1208c2ecf20Sopenharmony_ci rm -rf $SMCROUTEDIR 1218c2ecf20Sopenharmony_ci} 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_cisetup_prepare() 1248c2ecf20Sopenharmony_ci{ 1258c2ecf20Sopenharmony_ci h1=${NETIFS[p1]} 1268c2ecf20Sopenharmony_ci rp1=${NETIFS[p2]} 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci rp2=${NETIFS[p3]} 1298c2ecf20Sopenharmony_ci h2=${NETIFS[p4]} 1308c2ecf20Sopenharmony_ci 1318c2ecf20Sopenharmony_ci rp1mac=$(mac_get $rp1) 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci start_mcd 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci vrf_prepare 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci h1_create 1388c2ecf20Sopenharmony_ci h2_create 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci router_create 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci forwarding_enable 1438c2ecf20Sopenharmony_ci} 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_cicleanup() 1468c2ecf20Sopenharmony_ci{ 1478c2ecf20Sopenharmony_ci pre_cleanup 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_ci forwarding_restore 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci router_destroy 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ci h2_destroy 1548c2ecf20Sopenharmony_ci h1_destroy 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ci vrf_cleanup 1578c2ecf20Sopenharmony_ci 1588c2ecf20Sopenharmony_ci kill_mcd 1598c2ecf20Sopenharmony_ci} 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ciping_ipv4() 1628c2ecf20Sopenharmony_ci{ 1638c2ecf20Sopenharmony_ci ping_test $h1 198.51.100.2 1648c2ecf20Sopenharmony_ci} 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ciping_ipv6() 1678c2ecf20Sopenharmony_ci{ 1688c2ecf20Sopenharmony_ci ping6_test $h1 2001:db8:2::2 1698c2ecf20Sopenharmony_ci} 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_cisip_in_class_e() 1728c2ecf20Sopenharmony_ci{ 1738c2ecf20Sopenharmony_ci RET=0 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_ci # Disable rpfilter to prevent packets to be dropped because of it. 1768c2ecf20Sopenharmony_ci sysctl_set net.ipv4.conf.all.rp_filter 0 1778c2ecf20Sopenharmony_ci sysctl_set net.ipv4.conf.$rp1.rp_filter 0 1788c2ecf20Sopenharmony_ci 1798c2ecf20Sopenharmony_ci tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \ 1808c2ecf20Sopenharmony_ci flower src_ip 240.0.0.1 ip_proto udp action pass 1818c2ecf20Sopenharmony_ci 1828c2ecf20Sopenharmony_ci $MZ $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec \ 1838c2ecf20Sopenharmony_ci -A 240.0.0.1 -b $rp1mac -B 198.51.100.2 -q 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ci tc_check_packets "dev $rp2 egress" 101 5 1868c2ecf20Sopenharmony_ci check_err $? "Packets were dropped" 1878c2ecf20Sopenharmony_ci 1888c2ecf20Sopenharmony_ci log_test "Source IP in class E" 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_ci tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower 1918c2ecf20Sopenharmony_ci sysctl_restore net.ipv4.conf.$rp1.rp_filter 1928c2ecf20Sopenharmony_ci sysctl_restore net.ipv4.conf.all.rp_filter 1938c2ecf20Sopenharmony_ci} 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_cicreate_mcast_sg() 1968c2ecf20Sopenharmony_ci{ 1978c2ecf20Sopenharmony_ci local if_name=$1; shift 1988c2ecf20Sopenharmony_ci local s_addr=$1; shift 1998c2ecf20Sopenharmony_ci local mcast=$1; shift 2008c2ecf20Sopenharmony_ci local dest_ifs=${@} 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_ci $MC_CLI -I $table_name add $if_name $s_addr $mcast $dest_ifs 2038c2ecf20Sopenharmony_ci} 2048c2ecf20Sopenharmony_ci 2058c2ecf20Sopenharmony_cidelete_mcast_sg() 2068c2ecf20Sopenharmony_ci{ 2078c2ecf20Sopenharmony_ci local if_name=$1; shift 2088c2ecf20Sopenharmony_ci local s_addr=$1; shift 2098c2ecf20Sopenharmony_ci local mcast=$1; shift 2108c2ecf20Sopenharmony_ci local dest_ifs=${@} 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_ci $MC_CLI -I $table_name remove $if_name $s_addr $mcast $dest_ifs 2138c2ecf20Sopenharmony_ci} 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci__mc_mac_mismatch() 2168c2ecf20Sopenharmony_ci{ 2178c2ecf20Sopenharmony_ci local desc=$1; shift 2188c2ecf20Sopenharmony_ci local proto=$1; shift 2198c2ecf20Sopenharmony_ci local sip=$1; shift 2208c2ecf20Sopenharmony_ci local dip=$1; shift 2218c2ecf20Sopenharmony_ci local flags=${1:-""}; shift 2228c2ecf20Sopenharmony_ci local dmac=01:02:03:04:05:06 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci RET=0 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci tc filter add dev $rp2 egress protocol $proto pref 1 handle 101 \ 2278c2ecf20Sopenharmony_ci flower dst_ip $dip action pass 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci create_mcast_sg $rp1 $sip $dip $rp2 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci $MZ $flags $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec -b $dmac \ 2328c2ecf20Sopenharmony_ci -B $dip -q 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci tc_check_packets "dev $rp2 egress" 101 5 2358c2ecf20Sopenharmony_ci check_err $? "Packets were dropped" 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci log_test "Multicast MAC mismatch: $desc" 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_ci delete_mcast_sg $rp1 $sip $dip $rp2 2408c2ecf20Sopenharmony_ci tc filter del dev $rp2 egress protocol $proto pref 1 handle 101 flower 2418c2ecf20Sopenharmony_ci} 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_cimc_mac_mismatch() 2448c2ecf20Sopenharmony_ci{ 2458c2ecf20Sopenharmony_ci __mc_mac_mismatch "IPv4" "ip" 192.0.2.2 225.1.2.3 2468c2ecf20Sopenharmony_ci __mc_mac_mismatch "IPv6" "ipv6" 2001:db8:1::2 ff0e::3 "-6" 2478c2ecf20Sopenharmony_ci} 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_ciipv4_sip_equal_dip() 2508c2ecf20Sopenharmony_ci{ 2518c2ecf20Sopenharmony_ci RET=0 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci # Disable rpfilter to prevent packets to be dropped because of it. 2548c2ecf20Sopenharmony_ci sysctl_set net.ipv4.conf.all.rp_filter 0 2558c2ecf20Sopenharmony_ci sysctl_set net.ipv4.conf.$rp1.rp_filter 0 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \ 2588c2ecf20Sopenharmony_ci flower src_ip 198.51.100.2 action pass 2598c2ecf20Sopenharmony_ci 2608c2ecf20Sopenharmony_ci $MZ $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec \ 2618c2ecf20Sopenharmony_ci -A 198.51.100.2 -b $rp1mac -B 198.51.100.2 -q 2628c2ecf20Sopenharmony_ci 2638c2ecf20Sopenharmony_ci tc_check_packets "dev $rp2 egress" 101 5 2648c2ecf20Sopenharmony_ci check_err $? "Packets were dropped" 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_ci log_test "Source IP is equal to destination IP: IPv4" 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ci tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower 2698c2ecf20Sopenharmony_ci sysctl_restore net.ipv4.conf.$rp1.rp_filter 2708c2ecf20Sopenharmony_ci sysctl_restore net.ipv4.conf.all.rp_filter 2718c2ecf20Sopenharmony_ci} 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_ciipv6_sip_equal_dip() 2748c2ecf20Sopenharmony_ci{ 2758c2ecf20Sopenharmony_ci RET=0 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ci tc filter add dev $rp2 egress protocol ipv6 pref 1 handle 101 \ 2788c2ecf20Sopenharmony_ci flower src_ip 2001:db8:2::2 action pass 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_ci $MZ -6 $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec \ 2818c2ecf20Sopenharmony_ci -A 2001:db8:2::2 -b $rp1mac -B 2001:db8:2::2 -q 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci tc_check_packets "dev $rp2 egress" 101 5 2848c2ecf20Sopenharmony_ci check_err $? "Packets were dropped" 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_ci log_test "Source IP is equal to destination IP: IPv6" 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci tc filter del dev $rp2 egress protocol ipv6 pref 1 handle 101 flower 2898c2ecf20Sopenharmony_ci} 2908c2ecf20Sopenharmony_ci 2918c2ecf20Sopenharmony_ciipv4_dip_link_local() 2928c2ecf20Sopenharmony_ci{ 2938c2ecf20Sopenharmony_ci local dip=169.254.1.1 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci RET=0 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_ci tc filter add dev $rp2 egress protocol ip pref 1 handle 101 \ 2988c2ecf20Sopenharmony_ci flower dst_ip $dip action pass 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci ip neigh add 169.254.1.1 lladdr 00:11:22:33:44:55 dev $rp2 3018c2ecf20Sopenharmony_ci ip route add 169.254.1.0/24 dev $rp2 3028c2ecf20Sopenharmony_ci 3038c2ecf20Sopenharmony_ci $MZ $h1 -t udp "sp=54321,dp=12345" -c 5 -d 1msec -b $rp1mac -B $dip -q 3048c2ecf20Sopenharmony_ci 3058c2ecf20Sopenharmony_ci tc_check_packets "dev $rp2 egress" 101 5 3068c2ecf20Sopenharmony_ci check_err $? "Packets were dropped" 3078c2ecf20Sopenharmony_ci 3088c2ecf20Sopenharmony_ci log_test "IPv4 destination IP is link-local" 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_ci ip route del 169.254.1.0/24 dev $rp2 3118c2ecf20Sopenharmony_ci ip neigh del 169.254.1.1 lladdr 00:11:22:33:44:55 dev $rp2 3128c2ecf20Sopenharmony_ci tc filter del dev $rp2 egress protocol ip pref 1 handle 101 flower 3138c2ecf20Sopenharmony_ci} 3148c2ecf20Sopenharmony_ci 3158c2ecf20Sopenharmony_citrap cleanup EXIT 3168c2ecf20Sopenharmony_ci 3178c2ecf20Sopenharmony_cisetup_prepare 3188c2ecf20Sopenharmony_cisetup_wait 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_citests_run 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_ciexit $EXIT_STATUS 323