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