18c2ecf20Sopenharmony_ci#!/bin/bash 28c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_cifunction config_device { 58c2ecf20Sopenharmony_ci ip netns add at_ns0 68c2ecf20Sopenharmony_ci ip netns add at_ns1 78c2ecf20Sopenharmony_ci ip netns add at_ns2 88c2ecf20Sopenharmony_ci ip link add veth0 type veth peer name veth0b 98c2ecf20Sopenharmony_ci ip link add veth1 type veth peer name veth1b 108c2ecf20Sopenharmony_ci ip link add veth2 type veth peer name veth2b 118c2ecf20Sopenharmony_ci ip link set veth0b up 128c2ecf20Sopenharmony_ci ip link set veth1b up 138c2ecf20Sopenharmony_ci ip link set veth2b up 148c2ecf20Sopenharmony_ci ip link set dev veth0b mtu 1500 158c2ecf20Sopenharmony_ci ip link set dev veth1b mtu 1500 168c2ecf20Sopenharmony_ci ip link set dev veth2b mtu 1500 178c2ecf20Sopenharmony_ci ip link set veth0 netns at_ns0 188c2ecf20Sopenharmony_ci ip link set veth1 netns at_ns1 198c2ecf20Sopenharmony_ci ip link set veth2 netns at_ns2 208c2ecf20Sopenharmony_ci ip netns exec at_ns0 ip addr add 172.16.1.100/24 dev veth0 218c2ecf20Sopenharmony_ci ip netns exec at_ns0 ip addr add 2401:db00::1/64 dev veth0 nodad 228c2ecf20Sopenharmony_ci ip netns exec at_ns0 ip link set dev veth0 up 238c2ecf20Sopenharmony_ci ip netns exec at_ns1 ip addr add 172.16.1.101/24 dev veth1 248c2ecf20Sopenharmony_ci ip netns exec at_ns1 ip addr add 2401:db00::2/64 dev veth1 nodad 258c2ecf20Sopenharmony_ci ip netns exec at_ns1 ip link set dev veth1 up 268c2ecf20Sopenharmony_ci ip netns exec at_ns2 ip addr add 172.16.1.200/24 dev veth2 278c2ecf20Sopenharmony_ci ip netns exec at_ns2 ip addr add 2401:db00::3/64 dev veth2 nodad 288c2ecf20Sopenharmony_ci ip netns exec at_ns2 ip link set dev veth2 up 298c2ecf20Sopenharmony_ci ip link add br0 type bridge 308c2ecf20Sopenharmony_ci ip link set br0 up 318c2ecf20Sopenharmony_ci ip link set dev br0 mtu 1500 328c2ecf20Sopenharmony_ci ip link set veth0b master br0 338c2ecf20Sopenharmony_ci ip link set veth1b master br0 348c2ecf20Sopenharmony_ci ip link set veth2b master br0 358c2ecf20Sopenharmony_ci} 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_cifunction add_ipip_tunnel { 388c2ecf20Sopenharmony_ci ip netns exec at_ns0 \ 398c2ecf20Sopenharmony_ci ip link add dev $DEV_NS type ipip local 172.16.1.100 remote 172.16.1.200 408c2ecf20Sopenharmony_ci ip netns exec at_ns0 ip link set dev $DEV_NS up 418c2ecf20Sopenharmony_ci ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24 428c2ecf20Sopenharmony_ci ip netns exec at_ns1 \ 438c2ecf20Sopenharmony_ci ip link add dev $DEV_NS type ipip local 172.16.1.101 remote 172.16.1.200 448c2ecf20Sopenharmony_ci ip netns exec at_ns1 ip link set dev $DEV_NS up 458c2ecf20Sopenharmony_ci # same inner IP address in at_ns0 and at_ns1 468c2ecf20Sopenharmony_ci ip netns exec at_ns1 ip addr add dev $DEV_NS 10.1.1.100/24 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci ip netns exec at_ns2 ip link add dev $DEV type ipip external 498c2ecf20Sopenharmony_ci ip netns exec at_ns2 ip link set dev $DEV up 508c2ecf20Sopenharmony_ci ip netns exec at_ns2 ip addr add dev $DEV 10.1.1.200/24 518c2ecf20Sopenharmony_ci} 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_cifunction add_ipip6_tunnel { 548c2ecf20Sopenharmony_ci ip netns exec at_ns0 \ 558c2ecf20Sopenharmony_ci ip link add dev $DEV_NS type ip6tnl mode ipip6 local 2401:db00::1/64 remote 2401:db00::3/64 568c2ecf20Sopenharmony_ci ip netns exec at_ns0 ip link set dev $DEV_NS up 578c2ecf20Sopenharmony_ci ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24 588c2ecf20Sopenharmony_ci ip netns exec at_ns1 \ 598c2ecf20Sopenharmony_ci ip link add dev $DEV_NS type ip6tnl mode ipip6 local 2401:db00::2/64 remote 2401:db00::3/64 608c2ecf20Sopenharmony_ci ip netns exec at_ns1 ip link set dev $DEV_NS up 618c2ecf20Sopenharmony_ci # same inner IP address in at_ns0 and at_ns1 628c2ecf20Sopenharmony_ci ip netns exec at_ns1 ip addr add dev $DEV_NS 10.1.1.100/24 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ci ip netns exec at_ns2 ip link add dev $DEV type ip6tnl mode ipip6 external 658c2ecf20Sopenharmony_ci ip netns exec at_ns2 ip link set dev $DEV up 668c2ecf20Sopenharmony_ci ip netns exec at_ns2 ip addr add dev $DEV 10.1.1.200/24 678c2ecf20Sopenharmony_ci} 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_cifunction add_ip6ip6_tunnel { 708c2ecf20Sopenharmony_ci ip netns exec at_ns0 \ 718c2ecf20Sopenharmony_ci ip link add dev $DEV_NS type ip6tnl mode ip6ip6 local 2401:db00::1/64 remote 2401:db00::3/64 728c2ecf20Sopenharmony_ci ip netns exec at_ns0 ip link set dev $DEV_NS up 738c2ecf20Sopenharmony_ci ip netns exec at_ns0 ip addr add dev $DEV_NS 2601:646::1/64 748c2ecf20Sopenharmony_ci ip netns exec at_ns1 \ 758c2ecf20Sopenharmony_ci ip link add dev $DEV_NS type ip6tnl mode ip6ip6 local 2401:db00::2/64 remote 2401:db00::3/64 768c2ecf20Sopenharmony_ci ip netns exec at_ns1 ip link set dev $DEV_NS up 778c2ecf20Sopenharmony_ci # same inner IP address in at_ns0 and at_ns1 788c2ecf20Sopenharmony_ci ip netns exec at_ns1 ip addr add dev $DEV_NS 2601:646::1/64 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci ip netns exec at_ns2 ip link add dev $DEV type ip6tnl mode ip6ip6 external 818c2ecf20Sopenharmony_ci ip netns exec at_ns2 ip link set dev $DEV up 828c2ecf20Sopenharmony_ci ip netns exec at_ns2 ip addr add dev $DEV 2601:646::2/64 838c2ecf20Sopenharmony_ci} 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_cifunction attach_bpf { 868c2ecf20Sopenharmony_ci DEV=$1 878c2ecf20Sopenharmony_ci SET_TUNNEL=$2 888c2ecf20Sopenharmony_ci GET_TUNNEL=$3 898c2ecf20Sopenharmony_ci ip netns exec at_ns2 tc qdisc add dev $DEV clsact 908c2ecf20Sopenharmony_ci ip netns exec at_ns2 tc filter add dev $DEV egress bpf da obj tcbpf2_kern.o sec $SET_TUNNEL 918c2ecf20Sopenharmony_ci ip netns exec at_ns2 tc filter add dev $DEV ingress bpf da obj tcbpf2_kern.o sec $GET_TUNNEL 928c2ecf20Sopenharmony_ci} 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_cifunction test_ipip { 958c2ecf20Sopenharmony_ci DEV_NS=ipip_std 968c2ecf20Sopenharmony_ci DEV=ipip_bpf 978c2ecf20Sopenharmony_ci config_device 988c2ecf20Sopenharmony_ci# tcpdump -nei br0 & 998c2ecf20Sopenharmony_ci cat /sys/kernel/debug/tracing/trace_pipe & 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci add_ipip_tunnel 1028c2ecf20Sopenharmony_ci attach_bpf $DEV ipip_set_tunnel ipip_get_tunnel 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci ip netns exec at_ns0 ping -c 1 10.1.1.200 1058c2ecf20Sopenharmony_ci ip netns exec at_ns2 ping -c 1 10.1.1.100 1068c2ecf20Sopenharmony_ci ip netns exec at_ns0 iperf -sD -p 5200 > /dev/null 1078c2ecf20Sopenharmony_ci ip netns exec at_ns1 iperf -sD -p 5201 > /dev/null 1088c2ecf20Sopenharmony_ci sleep 0.2 1098c2ecf20Sopenharmony_ci # tcp check _same_ IP over different tunnels 1108c2ecf20Sopenharmony_ci ip netns exec at_ns2 iperf -c 10.1.1.100 -n 5k -p 5200 1118c2ecf20Sopenharmony_ci ip netns exec at_ns2 iperf -c 10.1.1.100 -n 5k -p 5201 1128c2ecf20Sopenharmony_ci cleanup 1138c2ecf20Sopenharmony_ci} 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci# IPv4 over IPv6 tunnel 1168c2ecf20Sopenharmony_cifunction test_ipip6 { 1178c2ecf20Sopenharmony_ci DEV_NS=ipip_std 1188c2ecf20Sopenharmony_ci DEV=ipip_bpf 1198c2ecf20Sopenharmony_ci config_device 1208c2ecf20Sopenharmony_ci# tcpdump -nei br0 & 1218c2ecf20Sopenharmony_ci cat /sys/kernel/debug/tracing/trace_pipe & 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci add_ipip6_tunnel 1248c2ecf20Sopenharmony_ci attach_bpf $DEV ipip6_set_tunnel ipip6_get_tunnel 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci ip netns exec at_ns0 ping -c 1 10.1.1.200 1278c2ecf20Sopenharmony_ci ip netns exec at_ns2 ping -c 1 10.1.1.100 1288c2ecf20Sopenharmony_ci ip netns exec at_ns0 iperf -sD -p 5200 > /dev/null 1298c2ecf20Sopenharmony_ci ip netns exec at_ns1 iperf -sD -p 5201 > /dev/null 1308c2ecf20Sopenharmony_ci sleep 0.2 1318c2ecf20Sopenharmony_ci # tcp check _same_ IP over different tunnels 1328c2ecf20Sopenharmony_ci ip netns exec at_ns2 iperf -c 10.1.1.100 -n 5k -p 5200 1338c2ecf20Sopenharmony_ci ip netns exec at_ns2 iperf -c 10.1.1.100 -n 5k -p 5201 1348c2ecf20Sopenharmony_ci cleanup 1358c2ecf20Sopenharmony_ci} 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci# IPv6 over IPv6 tunnel 1388c2ecf20Sopenharmony_cifunction test_ip6ip6 { 1398c2ecf20Sopenharmony_ci DEV_NS=ipip_std 1408c2ecf20Sopenharmony_ci DEV=ipip_bpf 1418c2ecf20Sopenharmony_ci config_device 1428c2ecf20Sopenharmony_ci# tcpdump -nei br0 & 1438c2ecf20Sopenharmony_ci cat /sys/kernel/debug/tracing/trace_pipe & 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_ci add_ip6ip6_tunnel 1468c2ecf20Sopenharmony_ci attach_bpf $DEV ip6ip6_set_tunnel ip6ip6_get_tunnel 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci ip netns exec at_ns0 ping -6 -c 1 2601:646::2 1498c2ecf20Sopenharmony_ci ip netns exec at_ns2 ping -6 -c 1 2601:646::1 1508c2ecf20Sopenharmony_ci ip netns exec at_ns0 iperf -6sD -p 5200 > /dev/null 1518c2ecf20Sopenharmony_ci ip netns exec at_ns1 iperf -6sD -p 5201 > /dev/null 1528c2ecf20Sopenharmony_ci sleep 0.2 1538c2ecf20Sopenharmony_ci # tcp check _same_ IP over different tunnels 1548c2ecf20Sopenharmony_ci ip netns exec at_ns2 iperf -6c 2601:646::1 -n 5k -p 5200 1558c2ecf20Sopenharmony_ci ip netns exec at_ns2 iperf -6c 2601:646::1 -n 5k -p 5201 1568c2ecf20Sopenharmony_ci cleanup 1578c2ecf20Sopenharmony_ci} 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_cifunction cleanup { 1608c2ecf20Sopenharmony_ci set +ex 1618c2ecf20Sopenharmony_ci pkill iperf 1628c2ecf20Sopenharmony_ci ip netns delete at_ns0 1638c2ecf20Sopenharmony_ci ip netns delete at_ns1 1648c2ecf20Sopenharmony_ci ip netns delete at_ns2 1658c2ecf20Sopenharmony_ci ip link del veth0 1668c2ecf20Sopenharmony_ci ip link del veth1 1678c2ecf20Sopenharmony_ci ip link del veth2 1688c2ecf20Sopenharmony_ci ip link del br0 1698c2ecf20Sopenharmony_ci pkill tcpdump 1708c2ecf20Sopenharmony_ci pkill cat 1718c2ecf20Sopenharmony_ci set -ex 1728c2ecf20Sopenharmony_ci} 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_cicleanup 1758c2ecf20Sopenharmony_ciecho "Testing IP tunnels..." 1768c2ecf20Sopenharmony_citest_ipip 1778c2ecf20Sopenharmony_citest_ipip6 1788c2ecf20Sopenharmony_citest_ip6ip6 1798c2ecf20Sopenharmony_ciecho "*** PASS ***" 180