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
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
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
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.
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.
24 # Kselftest framework requirement - SKIP code is 4.
26 BPF_FILE
="test_lwt_seg6local.bpf.o"
27 readonly NS1
="ns1-$(mktemp -u XXXXXX)"
28 readonly NS2
="ns2-$(mktemp -u XXXXXX)"
29 readonly NS3
="ns3-$(mktemp -u XXXXXX)"
30 readonly NS4
="ns4-$(mktemp -u XXXXXX)"
31 readonly NS5
="ns5-$(mktemp -u XXXXXX)"
32 readonly NS6
="ns6-$(mktemp -u XXXXXX)"
35 if [ $UID != 0 ]; then
36 echo $msg please run this as root
>&2
40 TMP_FILE
="/tmp/selftest_lwt_seg6local.txt"
44 if [ "$?" = "0" ]; then
45 echo "selftests: test_lwt_seg6local [PASS]";
47 echo "selftests: test_lwt_seg6local [FAILED]";
51 ip netns del
${NS1} 2> /dev
/null
52 ip netns del
${NS2} 2> /dev
/null
53 ip netns del
${NS3} 2> /dev
/null
54 ip netns del
${NS4} 2> /dev
/null
55 ip netns del
${NS5} 2> /dev
/null
56 ip netns del
${NS6} 2> /dev
/null
69 trap cleanup
0 2 3 6 9
71 ip link add veth1
type veth peer name veth2
72 ip link add veth3
type veth peer name veth4
73 ip link add veth5
type veth peer name veth6
74 ip link add veth7
type veth peer name veth8
75 ip link add veth9
type veth peer name veth10
77 ip link
set veth1 netns
${NS1}
78 ip link
set veth2 netns
${NS2}
79 ip link
set veth3 netns
${NS2}
80 ip link
set veth4 netns
${NS3}
81 ip link
set veth5 netns
${NS3}
82 ip link
set veth6 netns
${NS4}
83 ip link
set veth7 netns
${NS4}
84 ip link
set veth8 netns
${NS5}
85 ip link
set veth9 netns
${NS5}
86 ip link
set veth10 netns
${NS6}
88 ip netns
exec ${NS1} ip link
set dev veth1 up
89 ip netns
exec ${NS2} ip link
set dev veth2 up
90 ip netns
exec ${NS2} ip link
set dev veth3 up
91 ip netns
exec ${NS3} ip link
set dev veth4 up
92 ip netns
exec ${NS3} ip link
set dev veth5 up
93 ip netns
exec ${NS4} ip link
set dev veth6 up
94 ip netns
exec ${NS4} ip link
set dev veth7 up
95 ip netns
exec ${NS5} ip link
set dev veth8 up
96 ip netns
exec ${NS5} ip link
set dev veth9 up
97 ip netns
exec ${NS6} ip link
set dev veth10 up
98 ip netns
exec ${NS6} ip link
set dev lo up
100 # All link scope addresses and routes required between veths
101 ip netns
exec ${NS1} ip
-6 addr add fb00
::12/16 dev veth1 scope link
102 ip netns
exec ${NS1} ip
-6 route add fb00
::21 dev veth1 scope link
103 ip netns
exec ${NS2} ip
-6 addr add fb00
::21/16 dev veth2 scope link
104 ip netns
exec ${NS2} ip
-6 addr add fb00
::34/16 dev veth3 scope link
105 ip netns
exec ${NS2} ip
-6 route add fb00
::43 dev veth3 scope link
106 ip netns
exec ${NS3} ip
-6 route add fb00
::65 dev veth5 scope link
107 ip netns
exec ${NS3} ip
-6 addr add fb00
::43/16 dev veth4 scope link
108 ip netns
exec ${NS3} ip
-6 addr add fb00
::56/16 dev veth5 scope link
109 ip netns
exec ${NS4} ip
-6 addr add fb00
::65/16 dev veth6 scope link
110 ip netns
exec ${NS4} ip
-6 addr add fb00
::78/16 dev veth7 scope link
111 ip netns
exec ${NS4} ip
-6 route add fb00
::87 dev veth7 scope link
112 ip netns
exec ${NS5} ip
-6 addr add fb00
::87/16 dev veth8 scope link
113 ip netns
exec ${NS5} ip
-6 addr add fb00
::910/16 dev veth9 scope link
114 ip netns
exec ${NS5} ip
-6 route add fb00
::109 dev veth9 scope link
115 ip netns
exec ${NS5} ip
-6 route add fb00
::109 table
117 dev veth9 scope link
116 ip netns
exec ${NS6} ip
-6 addr add fb00
::109/16 dev veth10 scope link
118 ip netns
exec ${NS1} ip
-6 addr add fb00
::1/16 dev lo
119 ip netns
exec ${NS1} ip
-6 route add fb00
::6 dev veth1 via fb00
::21
121 ip netns
exec ${NS2} ip
-6 route add fb00
::6 encap bpf
in obj
${BPF_FILE} sec encap_srh dev veth2
122 ip netns
exec ${NS2} ip
-6 route add fd00
::1 dev veth3 via fb00
::43 scope link
124 ip netns
exec ${NS3} ip
-6 route add fc42
::1 dev veth5 via fb00
::65
125 ip netns
exec ${NS3} ip
-6 route add fd00
::1 encap seg6local action End.BPF endpoint obj
${BPF_FILE} sec add_egr_x dev veth4
127 ip netns
exec ${NS4} ip
-6 route add fd00
::2 encap seg6local action End.BPF endpoint obj
${BPF_FILE} sec pop_egr dev veth6
128 ip netns
exec ${NS4} ip
-6 addr add fc42
::1 dev lo
129 ip netns
exec ${NS4} ip
-6 route add fd00
::3 dev veth7 via fb00
::87
131 ip netns
exec ${NS5} ip
-6 route add fd00
::4 table
117 dev veth9 via fb00
::109
132 ip netns
exec ${NS5} ip
-6 route add fd00
::3 encap seg6local action End.BPF endpoint obj
${BPF_FILE} sec inspect_t dev veth8
134 ip netns
exec ${NS6} ip
-6 addr add fb00
::6/16 dev lo
135 ip netns
exec ${NS6} ip
-6 addr add fd00
::4/16 dev lo
137 ip netns
exec ${NS1} sysctl net.ipv6.conf.all.forwarding
=1 > /dev
/null
138 ip netns
exec ${NS2} sysctl net.ipv6.conf.all.forwarding
=1 > /dev
/null
139 ip netns
exec ${NS3} sysctl net.ipv6.conf.all.forwarding
=1 > /dev
/null
140 ip netns
exec ${NS4} sysctl net.ipv6.conf.all.forwarding
=1 > /dev
/null
141 ip netns
exec ${NS5} sysctl net.ipv6.conf.all.forwarding
=1 > /dev
/null
143 ip netns
exec ${NS6} sysctl net.ipv6.conf.all.seg6_enabled
=1 > /dev
/null
144 ip netns
exec ${NS6} sysctl net.ipv6.conf.lo.seg6_enabled
=1 > /dev
/null
145 ip netns
exec ${NS6} sysctl net.ipv6.conf.veth10.seg6_enabled
=1 > /dev
/null
147 ip netns
exec ${NS6} nc
-l -6 -u -d 7330 > $TMP_FILE &
148 ip netns
exec ${NS1} bash
-c "echo 'foobar' | nc -w0 -6 -u -p 2121 -s fb00::1 fb00::6 7330"
149 sleep 5 # wait enough time to ensure the UDP datagram arrived to the last segment
152 if [[ $
(< $TMP_FILE) != "foobar" ]]; then