1#!/bin/bash 2# Connects 6 network namespaces through veths. 3# Each NS may have different IPv6 global scope addresses : 4# NS1 ---- NS2 ---- NS3 ---- NS4 ---- NS5 ---- NS6 5# fb00::1 fd00::1 fd00::2 fd00::3 fb00::6 6# fc42::1 fd00::4 7# 8# All IPv6 packets going to fb00::/16 through NS2 will be encapsulated in a 9# IPv6 header with a Segment Routing Header, with segments : 10# fd00::1 -> fd00::2 -> fd00::3 -> fd00::4 11# 12# 3 fd00::/16 IPv6 addresses are binded to seg6local End.BPF actions : 13# - fd00::1 : add a TLV, change the flags and apply a End.X action to fc42::1 14# - fd00::2 : remove the TLV, change the flags, add a tag 15# - fd00::3 : apply an End.T action to fd00::4, through routing table 117 16# 17# fd00::4 is a simple Segment Routing node decapsulating the inner IPv6 packet. 18# Each End.BPF action will validate the operations applied on the SRH by the 19# previous BPF program in the chain, otherwise the packet is dropped. 20# 21# An UDP datagram is sent from fb00::1 to fb00::6. The test succeeds if this 22# datagram can be read on NS6 when binding to fb00::6. 23 24# Kselftest framework requirement - SKIP code is 4. 25ksft_skip=4 26 27msg="skip all tests:" 28if [ $UID != 0 ]; then 29 echo $msg please run this as root >&2 30 exit $ksft_skip 31fi 32 33TMP_FILE="/tmp/selftest_lwt_seg6local.txt" 34 35cleanup() 36{ 37 if [ "$?" = "0" ]; then 38 echo "selftests: test_lwt_seg6local [PASS]"; 39 else 40 echo "selftests: test_lwt_seg6local [FAILED]"; 41 fi 42 43 set +e 44 ip netns del ns1 2> /dev/null 45 ip netns del ns2 2> /dev/null 46 ip netns del ns3 2> /dev/null 47 ip netns del ns4 2> /dev/null 48 ip netns del ns5 2> /dev/null 49 ip netns del ns6 2> /dev/null 50 rm -f $TMP_FILE 51} 52 53set -e 54 55ip netns add ns1 56ip netns add ns2 57ip netns add ns3 58ip netns add ns4 59ip netns add ns5 60ip netns add ns6 61 62trap cleanup 0 2 3 6 9 63 64ip link add veth1 type veth peer name veth2 65ip link add veth3 type veth peer name veth4 66ip link add veth5 type veth peer name veth6 67ip link add veth7 type veth peer name veth8 68ip link add veth9 type veth peer name veth10 69 70ip link set veth1 netns ns1 71ip link set veth2 netns ns2 72ip link set veth3 netns ns2 73ip link set veth4 netns ns3 74ip link set veth5 netns ns3 75ip link set veth6 netns ns4 76ip link set veth7 netns ns4 77ip link set veth8 netns ns5 78ip link set veth9 netns ns5 79ip link set veth10 netns ns6 80 81ip netns exec ns1 ip link set dev veth1 up 82ip netns exec ns2 ip link set dev veth2 up 83ip netns exec ns2 ip link set dev veth3 up 84ip netns exec ns3 ip link set dev veth4 up 85ip netns exec ns3 ip link set dev veth5 up 86ip netns exec ns4 ip link set dev veth6 up 87ip netns exec ns4 ip link set dev veth7 up 88ip netns exec ns5 ip link set dev veth8 up 89ip netns exec ns5 ip link set dev veth9 up 90ip netns exec ns6 ip link set dev veth10 up 91ip netns exec ns6 ip link set dev lo up 92 93# All link scope addresses and routes required between veths 94ip netns exec ns1 ip -6 addr add fb00::12/16 dev veth1 scope link 95ip netns exec ns1 ip -6 route add fb00::21 dev veth1 scope link 96ip netns exec ns2 ip -6 addr add fb00::21/16 dev veth2 scope link 97ip netns exec ns2 ip -6 addr add fb00::34/16 dev veth3 scope link 98ip netns exec ns2 ip -6 route add fb00::43 dev veth3 scope link 99ip netns exec ns3 ip -6 route add fb00::65 dev veth5 scope link 100ip netns exec ns3 ip -6 addr add fb00::43/16 dev veth4 scope link 101ip netns exec ns3 ip -6 addr add fb00::56/16 dev veth5 scope link 102ip netns exec ns4 ip -6 addr add fb00::65/16 dev veth6 scope link 103ip netns exec ns4 ip -6 addr add fb00::78/16 dev veth7 scope link 104ip netns exec ns4 ip -6 route add fb00::87 dev veth7 scope link 105ip netns exec ns5 ip -6 addr add fb00::87/16 dev veth8 scope link 106ip netns exec ns5 ip -6 addr add fb00::910/16 dev veth9 scope link 107ip netns exec ns5 ip -6 route add fb00::109 dev veth9 scope link 108ip netns exec ns5 ip -6 route add fb00::109 table 117 dev veth9 scope link 109ip netns exec ns6 ip -6 addr add fb00::109/16 dev veth10 scope link 110 111ip netns exec ns1 ip -6 addr add fb00::1/16 dev lo 112ip netns exec ns1 ip -6 route add fb00::6 dev veth1 via fb00::21 113 114ip netns exec ns2 ip -6 route add fb00::6 encap bpf in obj test_lwt_seg6local.o sec encap_srh dev veth2 115ip netns exec ns2 ip -6 route add fd00::1 dev veth3 via fb00::43 scope link 116 117ip netns exec ns3 ip -6 route add fc42::1 dev veth5 via fb00::65 118ip netns exec ns3 ip -6 route add fd00::1 encap seg6local action End.BPF endpoint obj test_lwt_seg6local.o sec add_egr_x dev veth4 119 120ip netns exec ns4 ip -6 route add fd00::2 encap seg6local action End.BPF endpoint obj test_lwt_seg6local.o sec pop_egr dev veth6 121ip netns exec ns4 ip -6 addr add fc42::1 dev lo 122ip netns exec ns4 ip -6 route add fd00::3 dev veth7 via fb00::87 123 124ip netns exec ns5 ip -6 route add fd00::4 table 117 dev veth9 via fb00::109 125ip netns exec ns5 ip -6 route add fd00::3 encap seg6local action End.BPF endpoint obj test_lwt_seg6local.o sec inspect_t dev veth8 126 127ip netns exec ns6 ip -6 addr add fb00::6/16 dev lo 128ip netns exec ns6 ip -6 addr add fd00::4/16 dev lo 129 130ip netns exec ns1 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null 131ip netns exec ns2 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null 132ip netns exec ns3 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null 133ip netns exec ns4 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null 134ip netns exec ns5 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null 135 136ip netns exec ns6 sysctl net.ipv6.conf.all.seg6_enabled=1 > /dev/null 137ip netns exec ns6 sysctl net.ipv6.conf.lo.seg6_enabled=1 > /dev/null 138ip netns exec ns6 sysctl net.ipv6.conf.veth10.seg6_enabled=1 > /dev/null 139 140ip netns exec ns6 nc -l -6 -u -d 7330 > $TMP_FILE & 141ip netns exec ns1 bash -c "echo 'foobar' | nc -w0 -6 -u -p 2121 -s fb00::1 fb00::6 7330" 142sleep 5 # wait enough time to ensure the UDP datagram arrived to the last segment 143kill -INT $! 144 145if [[ $(< $TMP_FILE) != "foobar" ]]; then 146 exit 1 147fi 148 149exit 0 150