1010
1111PAUSE_ON_FAIL=${PAUSE_ON_FAIL:= no}
1212IP=" ip -netns testns"
13+ IP_PEER=" ip -netns peerns"
1314
1415RTABLE=100
16+ RTABLE_PEER=101
1517GW_IP4=192.51.100.2
1618SRC_IP=192.51.100.3
1719GW_IP6=2001:db8:1::2
@@ -20,7 +22,9 @@ SRC_IP6=2001:db8:1::3
2022DEV_ADDR=192.51.100.1
2123DEV_ADDR6=2001:db8:1::1
2224DEV=dummy0
23- TESTS=" fib_rule6 fib_rule4"
25+ TESTS=" fib_rule6 fib_rule4 fib_rule6_connect fib_rule4_connect"
26+
27+ SELFTEST_PATH=" "
2428
2529log_test ()
2630{
@@ -52,6 +56,31 @@ log_section()
5256 echo " ######################################################################"
5357}
5458
59+ check_nettest ()
60+ {
61+ if which nettest > /dev/null 2>&1 ; then
62+ return 0
63+ fi
64+
65+ # Add the selftest directory to PATH if not already done
66+ if [ " ${SELFTEST_PATH} " = " " ]; then
67+ SELFTEST_PATH=" $( dirname $0 ) "
68+ PATH=" ${PATH} :${SELFTEST_PATH} "
69+
70+ # Now retry with the new path
71+ if which nettest > /dev/null 2>&1 ; then
72+ return 0
73+ fi
74+
75+ if [ " ${ret} " -eq 0 ]; then
76+ ret=" ${ksft_skip} "
77+ fi
78+ echo " nettest not found (try 'make -C ${SELFTEST_PATH} nettest')"
79+ fi
80+
81+ return 1
82+ }
83+
5584setup ()
5685{
5786 set -e
@@ -72,6 +101,39 @@ cleanup()
72101 ip netns del testns
73102}
74103
104+ setup_peer ()
105+ {
106+ set -e
107+
108+ ip netns add peerns
109+ $IP_PEER link set dev lo up
110+
111+ ip link add name veth0 netns testns type veth \
112+ peer name veth1 netns peerns
113+ $IP link set dev veth0 up
114+ $IP_PEER link set dev veth1 up
115+
116+ $IP address add 192.0.2.10 peer 192.0.2.11/32 dev veth0
117+ $IP_PEER address add 192.0.2.11 peer 192.0.2.10/32 dev veth1
118+
119+ $IP address add 2001:db8::10 peer 2001:db8::11/128 dev veth0 nodad
120+ $IP_PEER address add 2001:db8::11 peer 2001:db8::10/128 dev veth1 nodad
121+
122+ $IP_PEER address add 198.51.100.11/32 dev lo
123+ $IP route add table $RTABLE_PEER 198.51.100.11/32 via 192.0.2.11
124+
125+ $IP_PEER address add 2001:db8::1:11/128 dev lo
126+ $IP route add table $RTABLE_PEER 2001:db8::1:11/128 via 2001:db8::11
127+
128+ set +e
129+ }
130+
131+ cleanup_peer ()
132+ {
133+ $IP link del dev veth0
134+ ip netns del peerns
135+ }
136+
75137fib_check_iproute_support ()
76138{
77139 ip rule help 2>&1 | grep -q $1
@@ -190,6 +252,37 @@ fib_rule6_test()
190252 fi
191253}
192254
255+ # Verify that the IPV6_TCLASS option of UDPv6 and TCPv6 sockets is properly
256+ # taken into account when connecting the socket and when sending packets.
257+ fib_rule6_connect_test ()
258+ {
259+ local dsfield
260+
261+ if ! check_nettest; then
262+ echo " SKIP: Could not run test without nettest tool"
263+ return
264+ fi
265+
266+ setup_peer
267+ $IP -6 rule add dsfield 0x04 table $RTABLE_PEER
268+
269+ # Combine the base DS Field value (0x04) with all possible ECN values
270+ # (Not-ECT: 0, ECT(1): 1, ECT(0): 2, CE: 3).
271+ # The ECN bits shouldn't influence the result of the test.
272+ for dsfield in 0x04 0x05 0x06 0x07; do
273+ nettest -q -6 -B -t 5 -N testns -O peerns -U -D \
274+ -Q " ${dsfield} " -l 2001:db8::1:11 -r 2001:db8::1:11
275+ log_test $? 0 " rule6 dsfield udp connect (dsfield ${dsfield} )"
276+
277+ nettest -q -6 -B -t 5 -N testns -O peerns -Q " ${dsfield} " \
278+ -l 2001:db8::1:11 -r 2001:db8::1:11
279+ log_test $? 0 " rule6 dsfield tcp connect (dsfield ${dsfield} )"
280+ done
281+
282+ $IP -6 rule del dsfield 0x04 table $RTABLE_PEER
283+ cleanup_peer
284+ }
285+
193286fib_rule4_del ()
194287{
195288 $IP rule del $1
@@ -296,6 +389,37 @@ fib_rule4_test()
296389 fi
297390}
298391
392+ # Verify that the IP_TOS option of UDPv4 and TCPv4 sockets is properly taken
393+ # into account when connecting the socket and when sending packets.
394+ fib_rule4_connect_test ()
395+ {
396+ local dsfield
397+
398+ if ! check_nettest; then
399+ echo " SKIP: Could not run test without nettest tool"
400+ return
401+ fi
402+
403+ setup_peer
404+ $IP -4 rule add dsfield 0x04 table $RTABLE_PEER
405+
406+ # Combine the base DS Field value (0x04) with all possible ECN values
407+ # (Not-ECT: 0, ECT(1): 1, ECT(0): 2, CE: 3).
408+ # The ECN bits shouldn't influence the result of the test.
409+ for dsfield in 0x04 0x05 0x06 0x07; do
410+ nettest -q -B -t 5 -N testns -O peerns -D -U -Q " ${dsfield} " \
411+ -l 198.51.100.11 -r 198.51.100.11
412+ log_test $? 0 " rule4 dsfield udp connect (dsfield ${dsfield} )"
413+
414+ nettest -q -B -t 5 -N testns -O peerns -Q " ${dsfield} " \
415+ -l 198.51.100.11 -r 198.51.100.11
416+ log_test $? 0 " rule4 dsfield tcp connect (dsfield ${dsfield} )"
417+ done
418+
419+ $IP -4 rule del dsfield 0x04 table $RTABLE_PEER
420+ cleanup_peer
421+ }
422+
299423run_fibrule_tests ()
300424{
301425 log_section " IPv4 fib rule"
345469 case $t in
346470 fib_rule6_test|fib_rule6) fib_rule6_test;;
347471 fib_rule4_test|fib_rule4) fib_rule4_test;;
472+ fib_rule6_connect_test|fib_rule6_connect) fib_rule6_connect_test;;
473+ fib_rule4_connect_test|fib_rule4_connect) fib_rule4_connect_test;;
348474
349475 help) echo " Test names: $TESTS " ; exit 0;;
350476
0 commit comments