^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) #!/bin/bash
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) # SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) function config_device {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) ip netns add at_ns0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) ip netns add at_ns1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) ip netns add at_ns2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) ip link add veth0 type veth peer name veth0b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) ip link add veth1 type veth peer name veth1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) ip link add veth2 type veth peer name veth2b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) ip link set veth0b up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) ip link set veth1b up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) ip link set veth2b up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) ip link set dev veth0b mtu 1500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) ip link set dev veth1b mtu 1500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) ip link set dev veth2b mtu 1500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) ip link set veth0 netns at_ns0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) ip link set veth1 netns at_ns1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) ip link set veth2 netns at_ns2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) ip netns exec at_ns0 ip addr add 172.16.1.100/24 dev veth0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) ip netns exec at_ns0 ip addr add 2401:db00::1/64 dev veth0 nodad
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) ip netns exec at_ns0 ip link set dev veth0 up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) ip netns exec at_ns1 ip addr add 172.16.1.101/24 dev veth1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) ip netns exec at_ns1 ip addr add 2401:db00::2/64 dev veth1 nodad
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) ip netns exec at_ns1 ip link set dev veth1 up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) ip netns exec at_ns2 ip addr add 172.16.1.200/24 dev veth2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) ip netns exec at_ns2 ip addr add 2401:db00::3/64 dev veth2 nodad
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) ip netns exec at_ns2 ip link set dev veth2 up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) ip link add br0 type bridge
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) ip link set br0 up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) ip link set dev br0 mtu 1500
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) ip link set veth0b master br0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) ip link set veth1b master br0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) ip link set veth2b master br0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) function add_ipip_tunnel {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) ip netns exec at_ns0 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) ip link add dev $DEV_NS type ipip local 172.16.1.100 remote 172.16.1.200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) ip netns exec at_ns0 ip link set dev $DEV_NS up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ip netns exec at_ns1 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) ip link add dev $DEV_NS type ipip local 172.16.1.101 remote 172.16.1.200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) ip netns exec at_ns1 ip link set dev $DEV_NS up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) # same inner IP address in at_ns0 and at_ns1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) ip netns exec at_ns1 ip addr add dev $DEV_NS 10.1.1.100/24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) ip netns exec at_ns2 ip link add dev $DEV type ipip external
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) ip netns exec at_ns2 ip link set dev $DEV up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) ip netns exec at_ns2 ip addr add dev $DEV 10.1.1.200/24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) function add_ipip6_tunnel {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) ip netns exec at_ns0 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) ip link add dev $DEV_NS type ip6tnl mode ipip6 local 2401:db00::1/64 remote 2401:db00::3/64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) ip netns exec at_ns0 ip link set dev $DEV_NS up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) ip netns exec at_ns0 ip addr add dev $DEV_NS 10.1.1.100/24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) ip netns exec at_ns1 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) ip link add dev $DEV_NS type ip6tnl mode ipip6 local 2401:db00::2/64 remote 2401:db00::3/64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) ip netns exec at_ns1 ip link set dev $DEV_NS up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) # same inner IP address in at_ns0 and at_ns1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) ip netns exec at_ns1 ip addr add dev $DEV_NS 10.1.1.100/24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) ip netns exec at_ns2 ip link add dev $DEV type ip6tnl mode ipip6 external
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) ip netns exec at_ns2 ip link set dev $DEV up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) ip netns exec at_ns2 ip addr add dev $DEV 10.1.1.200/24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) function add_ip6ip6_tunnel {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) ip netns exec at_ns0 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) ip link add dev $DEV_NS type ip6tnl mode ip6ip6 local 2401:db00::1/64 remote 2401:db00::3/64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) ip netns exec at_ns0 ip link set dev $DEV_NS up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) ip netns exec at_ns0 ip addr add dev $DEV_NS 2601:646::1/64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) ip netns exec at_ns1 \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) ip link add dev $DEV_NS type ip6tnl mode ip6ip6 local 2401:db00::2/64 remote 2401:db00::3/64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) ip netns exec at_ns1 ip link set dev $DEV_NS up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) # same inner IP address in at_ns0 and at_ns1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) ip netns exec at_ns1 ip addr add dev $DEV_NS 2601:646::1/64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) ip netns exec at_ns2 ip link add dev $DEV type ip6tnl mode ip6ip6 external
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) ip netns exec at_ns2 ip link set dev $DEV up
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) ip netns exec at_ns2 ip addr add dev $DEV 2601:646::2/64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) function attach_bpf {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) DEV=$1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) SET_TUNNEL=$2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) GET_TUNNEL=$3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) ip netns exec at_ns2 tc qdisc add dev $DEV clsact
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) ip netns exec at_ns2 tc filter add dev $DEV egress bpf da obj tcbpf2_kern.o sec $SET_TUNNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) ip netns exec at_ns2 tc filter add dev $DEV ingress bpf da obj tcbpf2_kern.o sec $GET_TUNNEL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) function test_ipip {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) DEV_NS=ipip_std
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) DEV=ipip_bpf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) config_device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) # tcpdump -nei br0 &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) cat /sys/kernel/debug/tracing/trace_pipe &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) add_ipip_tunnel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) attach_bpf $DEV ipip_set_tunnel ipip_get_tunnel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) ip netns exec at_ns0 ping -c 1 10.1.1.200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) ip netns exec at_ns2 ping -c 1 10.1.1.100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) ip netns exec at_ns0 iperf -sD -p 5200 > /dev/null
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) ip netns exec at_ns1 iperf -sD -p 5201 > /dev/null
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) sleep 0.2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) # tcp check _same_ IP over different tunnels
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) ip netns exec at_ns2 iperf -c 10.1.1.100 -n 5k -p 5200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) ip netns exec at_ns2 iperf -c 10.1.1.100 -n 5k -p 5201
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) cleanup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) # IPv4 over IPv6 tunnel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) function test_ipip6 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) DEV_NS=ipip_std
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) DEV=ipip_bpf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) config_device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) # tcpdump -nei br0 &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) cat /sys/kernel/debug/tracing/trace_pipe &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) add_ipip6_tunnel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) attach_bpf $DEV ipip6_set_tunnel ipip6_get_tunnel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) ip netns exec at_ns0 ping -c 1 10.1.1.200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) ip netns exec at_ns2 ping -c 1 10.1.1.100
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) ip netns exec at_ns0 iperf -sD -p 5200 > /dev/null
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) ip netns exec at_ns1 iperf -sD -p 5201 > /dev/null
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) sleep 0.2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) # tcp check _same_ IP over different tunnels
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) ip netns exec at_ns2 iperf -c 10.1.1.100 -n 5k -p 5200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) ip netns exec at_ns2 iperf -c 10.1.1.100 -n 5k -p 5201
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) cleanup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) # IPv6 over IPv6 tunnel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) function test_ip6ip6 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) DEV_NS=ipip_std
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) DEV=ipip_bpf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) config_device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) # tcpdump -nei br0 &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) cat /sys/kernel/debug/tracing/trace_pipe &
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) add_ip6ip6_tunnel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) attach_bpf $DEV ip6ip6_set_tunnel ip6ip6_get_tunnel
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) ip netns exec at_ns0 ping -6 -c 1 2601:646::2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) ip netns exec at_ns2 ping -6 -c 1 2601:646::1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) ip netns exec at_ns0 iperf -6sD -p 5200 > /dev/null
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) ip netns exec at_ns1 iperf -6sD -p 5201 > /dev/null
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) sleep 0.2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) # tcp check _same_ IP over different tunnels
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) ip netns exec at_ns2 iperf -6c 2601:646::1 -n 5k -p 5200
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) ip netns exec at_ns2 iperf -6c 2601:646::1 -n 5k -p 5201
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) cleanup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) function cleanup {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) set +ex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) pkill iperf
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) ip netns delete at_ns0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) ip netns delete at_ns1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) ip netns delete at_ns2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) ip link del veth0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) ip link del veth1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) ip link del veth2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) ip link del br0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) pkill tcpdump
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) pkill cat
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) set -ex
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) cleanup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) echo "Testing IP tunnels..."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) test_ipip
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) test_ipip6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) test_ip6ip6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) echo "*** PASS ***"