10
10
11
11
PAUSE_ON_FAIL=${PAUSE_ON_FAIL:= no}
12
12
IP=" ip -netns testns"
13
+ IP_PEER=" ip -netns peerns"
13
14
14
15
RTABLE=100
16
+ RTABLE_PEER=101
15
17
GW_IP4=192.51.100.2
16
18
SRC_IP=192.51.100.3
17
19
GW_IP6=2001:db8:1::2
@@ -20,7 +22,9 @@ SRC_IP6=2001:db8:1::3
20
22
DEV_ADDR=192.51.100.1
21
23
DEV_ADDR6=2001:db8:1::1
22
24
DEV=dummy0
23
- TESTS=" fib_rule6 fib_rule4"
25
+ TESTS=" fib_rule6 fib_rule4 fib_rule6_connect fib_rule4_connect"
26
+
27
+ SELFTEST_PATH=" "
24
28
25
29
log_test ()
26
30
{
@@ -52,6 +56,31 @@ log_section()
52
56
echo " ######################################################################"
53
57
}
54
58
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
+
55
84
setup ()
56
85
{
57
86
set -e
@@ -72,6 +101,39 @@ cleanup()
72
101
ip netns del testns
73
102
}
74
103
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
+
75
137
fib_check_iproute_support ()
76
138
{
77
139
ip rule help 2>&1 | grep -q $1
@@ -190,6 +252,37 @@ fib_rule6_test()
190
252
fi
191
253
}
192
254
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
+
193
286
fib_rule4_del ()
194
287
{
195
288
$IP rule del $1
@@ -296,6 +389,37 @@ fib_rule4_test()
296
389
fi
297
390
}
298
391
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
+
299
423
run_fibrule_tests ()
300
424
{
301
425
log_section " IPv4 fib rule"
345
469
case $t in
346
470
fib_rule6_test|fib_rule6) fib_rule6_test;;
347
471
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;;
348
474
349
475
help) echo " Test names: $TESTS " ; exit 0;;
350
476
0 commit comments