Mathieu Xhonneux | c99a84e | 2018-05-20 14:58:17 +0100 | [diff] [blame] | 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 | |
Jeffrin Jose T | dd349c3 | 2018-06-23 03:10:32 +0530 | [diff] [blame] | 24 | # Kselftest framework requirement - SKIP code is 4. |
| 25 | ksft_skip=4 |
| 26 | |
| 27 | msg="skip all tests:" |
| 28 | if [ $UID != 0 ]; then |
| 29 | echo $msg please run this as root >&2 |
| 30 | exit $ksft_skip |
| 31 | fi |
| 32 | |
Mathieu Xhonneux | c99a84e | 2018-05-20 14:58:17 +0100 | [diff] [blame] | 33 | TMP_FILE="/tmp/selftest_lwt_seg6local.txt" |
| 34 | |
| 35 | cleanup() |
| 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 | |
| 53 | set -e |
| 54 | |
| 55 | ip netns add ns1 |
| 56 | ip netns add ns2 |
| 57 | ip netns add ns3 |
| 58 | ip netns add ns4 |
| 59 | ip netns add ns5 |
| 60 | ip netns add ns6 |
| 61 | |
| 62 | trap cleanup 0 2 3 6 9 |
| 63 | |
| 64 | ip link add veth1 type veth peer name veth2 |
| 65 | ip link add veth3 type veth peer name veth4 |
| 66 | ip link add veth5 type veth peer name veth6 |
| 67 | ip link add veth7 type veth peer name veth8 |
| 68 | ip link add veth9 type veth peer name veth10 |
| 69 | |
| 70 | ip link set veth1 netns ns1 |
| 71 | ip link set veth2 netns ns2 |
| 72 | ip link set veth3 netns ns2 |
| 73 | ip link set veth4 netns ns3 |
| 74 | ip link set veth5 netns ns3 |
| 75 | ip link set veth6 netns ns4 |
| 76 | ip link set veth7 netns ns4 |
| 77 | ip link set veth8 netns ns5 |
| 78 | ip link set veth9 netns ns5 |
| 79 | ip link set veth10 netns ns6 |
| 80 | |
| 81 | ip netns exec ns1 ip link set dev veth1 up |
| 82 | ip netns exec ns2 ip link set dev veth2 up |
| 83 | ip netns exec ns2 ip link set dev veth3 up |
| 84 | ip netns exec ns3 ip link set dev veth4 up |
| 85 | ip netns exec ns3 ip link set dev veth5 up |
| 86 | ip netns exec ns4 ip link set dev veth6 up |
| 87 | ip netns exec ns4 ip link set dev veth7 up |
| 88 | ip netns exec ns5 ip link set dev veth8 up |
| 89 | ip netns exec ns5 ip link set dev veth9 up |
| 90 | ip netns exec ns6 ip link set dev veth10 up |
| 91 | ip netns exec ns6 ip link set dev lo up |
| 92 | |
| 93 | # All link scope addresses and routes required between veths |
| 94 | ip netns exec ns1 ip -6 addr add fb00::12/16 dev veth1 scope link |
| 95 | ip netns exec ns1 ip -6 route add fb00::21 dev veth1 scope link |
| 96 | ip netns exec ns2 ip -6 addr add fb00::21/16 dev veth2 scope link |
| 97 | ip netns exec ns2 ip -6 addr add fb00::34/16 dev veth3 scope link |
| 98 | ip netns exec ns2 ip -6 route add fb00::43 dev veth3 scope link |
| 99 | ip netns exec ns3 ip -6 route add fb00::65 dev veth5 scope link |
| 100 | ip netns exec ns3 ip -6 addr add fb00::43/16 dev veth4 scope link |
| 101 | ip netns exec ns3 ip -6 addr add fb00::56/16 dev veth5 scope link |
| 102 | ip netns exec ns4 ip -6 addr add fb00::65/16 dev veth6 scope link |
| 103 | ip netns exec ns4 ip -6 addr add fb00::78/16 dev veth7 scope link |
| 104 | ip netns exec ns4 ip -6 route add fb00::87 dev veth7 scope link |
| 105 | ip netns exec ns5 ip -6 addr add fb00::87/16 dev veth8 scope link |
| 106 | ip netns exec ns5 ip -6 addr add fb00::910/16 dev veth9 scope link |
| 107 | ip netns exec ns5 ip -6 route add fb00::109 dev veth9 scope link |
| 108 | ip netns exec ns5 ip -6 route add fb00::109 table 117 dev veth9 scope link |
| 109 | ip netns exec ns6 ip -6 addr add fb00::109/16 dev veth10 scope link |
| 110 | |
| 111 | ip netns exec ns1 ip -6 addr add fb00::1/16 dev lo |
| 112 | ip netns exec ns1 ip -6 route add fb00::6 dev veth1 via fb00::21 |
| 113 | |
| 114 | ip netns exec ns2 ip -6 route add fb00::6 encap bpf in obj test_lwt_seg6local.o sec encap_srh dev veth2 |
| 115 | ip netns exec ns2 ip -6 route add fd00::1 dev veth3 via fb00::43 scope link |
| 116 | |
| 117 | ip netns exec ns3 ip -6 route add fc42::1 dev veth5 via fb00::65 |
| 118 | ip netns exec ns3 ip -6 route add fd00::1 encap seg6local action End.BPF obj test_lwt_seg6local.o sec add_egr_x dev veth4 |
| 119 | |
| 120 | ip netns exec ns4 ip -6 route add fd00::2 encap seg6local action End.BPF obj test_lwt_seg6local.o sec pop_egr dev veth6 |
| 121 | ip netns exec ns4 ip -6 addr add fc42::1 dev lo |
| 122 | ip netns exec ns4 ip -6 route add fd00::3 dev veth7 via fb00::87 |
| 123 | |
| 124 | ip netns exec ns5 ip -6 route add fd00::4 table 117 dev veth9 via fb00::109 |
| 125 | ip netns exec ns5 ip -6 route add fd00::3 encap seg6local action End.BPF obj test_lwt_seg6local.o sec inspect_t dev veth8 |
| 126 | |
| 127 | ip netns exec ns6 ip -6 addr add fb00::6/16 dev lo |
| 128 | ip netns exec ns6 ip -6 addr add fd00::4/16 dev lo |
| 129 | |
| 130 | ip netns exec ns1 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null |
| 131 | ip netns exec ns2 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null |
| 132 | ip netns exec ns3 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null |
| 133 | ip netns exec ns4 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null |
| 134 | ip netns exec ns5 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null |
| 135 | |
| 136 | ip netns exec ns6 sysctl net.ipv6.conf.all.seg6_enabled=1 > /dev/null |
| 137 | ip netns exec ns6 sysctl net.ipv6.conf.lo.seg6_enabled=1 > /dev/null |
| 138 | ip netns exec ns6 sysctl net.ipv6.conf.veth10.seg6_enabled=1 > /dev/null |
| 139 | |
| 140 | ip netns exec ns6 nc -l -6 -u -d 7330 > $TMP_FILE & |
| 141 | ip netns exec ns1 bash -c "echo 'foobar' | nc -w0 -6 -u -p 2121 -s fb00::1 fb00::6 7330" |
| 142 | sleep 5 # wait enough time to ensure the UDP datagram arrived to the last segment |
| 143 | kill -INT $! |
| 144 | |
| 145 | if [[ $(< $TMP_FILE) != "foobar" ]]; then |
| 146 | exit 1 |
| 147 | fi |
| 148 | |
| 149 | exit 0 |