test_lwt_seg6local.sh 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  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. # Kselftest framework requirement - SKIP code is 4.
  24. ksft_skip=4
  25. msg="skip all tests:"
  26. if [ $UID != 0 ]; then
  27. echo $msg please run this as root >&2
  28. exit $ksft_skip
  29. fi
  30. TMP_FILE="/tmp/selftest_lwt_seg6local.txt"
  31. cleanup()
  32. {
  33. if [ "$?" = "0" ]; then
  34. echo "selftests: test_lwt_seg6local [PASS]";
  35. else
  36. echo "selftests: test_lwt_seg6local [FAILED]";
  37. fi
  38. set +e
  39. ip netns del ns1 2> /dev/null
  40. ip netns del ns2 2> /dev/null
  41. ip netns del ns3 2> /dev/null
  42. ip netns del ns4 2> /dev/null
  43. ip netns del ns5 2> /dev/null
  44. ip netns del ns6 2> /dev/null
  45. rm -f $TMP_FILE
  46. }
  47. set -e
  48. ip netns add ns1
  49. ip netns add ns2
  50. ip netns add ns3
  51. ip netns add ns4
  52. ip netns add ns5
  53. ip netns add ns6
  54. trap cleanup 0 2 3 6 9
  55. ip link add veth1 type veth peer name veth2
  56. ip link add veth3 type veth peer name veth4
  57. ip link add veth5 type veth peer name veth6
  58. ip link add veth7 type veth peer name veth8
  59. ip link add veth9 type veth peer name veth10
  60. ip link set veth1 netns ns1
  61. ip link set veth2 netns ns2
  62. ip link set veth3 netns ns2
  63. ip link set veth4 netns ns3
  64. ip link set veth5 netns ns3
  65. ip link set veth6 netns ns4
  66. ip link set veth7 netns ns4
  67. ip link set veth8 netns ns5
  68. ip link set veth9 netns ns5
  69. ip link set veth10 netns ns6
  70. ip netns exec ns1 ip link set dev veth1 up
  71. ip netns exec ns2 ip link set dev veth2 up
  72. ip netns exec ns2 ip link set dev veth3 up
  73. ip netns exec ns3 ip link set dev veth4 up
  74. ip netns exec ns3 ip link set dev veth5 up
  75. ip netns exec ns4 ip link set dev veth6 up
  76. ip netns exec ns4 ip link set dev veth7 up
  77. ip netns exec ns5 ip link set dev veth8 up
  78. ip netns exec ns5 ip link set dev veth9 up
  79. ip netns exec ns6 ip link set dev veth10 up
  80. ip netns exec ns6 ip link set dev lo up
  81. # All link scope addresses and routes required between veths
  82. ip netns exec ns1 ip -6 addr add fb00::12/16 dev veth1 scope link
  83. ip netns exec ns1 ip -6 route add fb00::21 dev veth1 scope link
  84. ip netns exec ns2 ip -6 addr add fb00::21/16 dev veth2 scope link
  85. ip netns exec ns2 ip -6 addr add fb00::34/16 dev veth3 scope link
  86. ip netns exec ns2 ip -6 route add fb00::43 dev veth3 scope link
  87. ip netns exec ns3 ip -6 route add fb00::65 dev veth5 scope link
  88. ip netns exec ns3 ip -6 addr add fb00::43/16 dev veth4 scope link
  89. ip netns exec ns3 ip -6 addr add fb00::56/16 dev veth5 scope link
  90. ip netns exec ns4 ip -6 addr add fb00::65/16 dev veth6 scope link
  91. ip netns exec ns4 ip -6 addr add fb00::78/16 dev veth7 scope link
  92. ip netns exec ns4 ip -6 route add fb00::87 dev veth7 scope link
  93. ip netns exec ns5 ip -6 addr add fb00::87/16 dev veth8 scope link
  94. ip netns exec ns5 ip -6 addr add fb00::910/16 dev veth9 scope link
  95. ip netns exec ns5 ip -6 route add fb00::109 dev veth9 scope link
  96. ip netns exec ns5 ip -6 route add fb00::109 table 117 dev veth9 scope link
  97. ip netns exec ns6 ip -6 addr add fb00::109/16 dev veth10 scope link
  98. ip netns exec ns1 ip -6 addr add fb00::1/16 dev lo
  99. ip netns exec ns1 ip -6 route add fb00::6 dev veth1 via fb00::21
  100. ip netns exec ns2 ip -6 route add fb00::6 encap bpf in obj test_lwt_seg6local.o sec encap_srh dev veth2
  101. ip netns exec ns2 ip -6 route add fd00::1 dev veth3 via fb00::43 scope link
  102. ip netns exec ns3 ip -6 route add fc42::1 dev veth5 via fb00::65
  103. ip 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
  104. ip 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
  105. ip netns exec ns4 ip -6 addr add fc42::1 dev lo
  106. ip netns exec ns4 ip -6 route add fd00::3 dev veth7 via fb00::87
  107. ip netns exec ns5 ip -6 route add fd00::4 table 117 dev veth9 via fb00::109
  108. ip 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
  109. ip netns exec ns6 ip -6 addr add fb00::6/16 dev lo
  110. ip netns exec ns6 ip -6 addr add fd00::4/16 dev lo
  111. ip netns exec ns1 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null
  112. ip netns exec ns2 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null
  113. ip netns exec ns3 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null
  114. ip netns exec ns4 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null
  115. ip netns exec ns5 sysctl net.ipv6.conf.all.forwarding=1 > /dev/null
  116. ip netns exec ns6 sysctl net.ipv6.conf.all.seg6_enabled=1 > /dev/null
  117. ip netns exec ns6 sysctl net.ipv6.conf.lo.seg6_enabled=1 > /dev/null
  118. ip netns exec ns6 sysctl net.ipv6.conf.veth10.seg6_enabled=1 > /dev/null
  119. ip netns exec ns6 nc -l -6 -u -d 7330 > $TMP_FILE &
  120. ip netns exec ns1 bash -c "echo 'foobar' | nc -w0 -6 -u -p 2121 -s fb00::1 fb00::6 7330"
  121. sleep 5 # wait enough time to ensure the UDP datagram arrived to the last segment
  122. kill -INT $!
  123. if [[ $(< $TMP_FILE) != "foobar" ]]; then
  124. exit 1
  125. fi
  126. exit 0